aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am252
-rw-r--r--src/Makefile.bench.include14
-rw-r--r--src/Makefile.leveldb.include137
-rw-r--r--src/Makefile.qt.include62
-rw-r--r--src/Makefile.qttest.include12
-rw-r--r--src/Makefile.test.include37
-rw-r--r--src/addrdb.cpp218
-rw-r--r--src/addrdb.h102
-rw-r--r--src/addrman.cpp60
-rw-r--r--src/addrman.h47
-rw-r--r--src/alert.cpp266
-rw-r--r--src/alert.h113
-rw-r--r--src/amount.cpp24
-rw-r--r--src/amount.h23
-rw-r--r--src/arith_uint256.h2
-rw-r--r--src/base58.cpp15
-rw-r--r--src/base58.h6
-rw-r--r--src/bench/base58.cpp56
-rw-r--r--src/bench/bench.cpp35
-rw-r--r--src/bench/bench.h7
-rw-r--r--src/bench/crypto_hash.cpp78
-rw-r--r--src/bench/rollingbloom.cpp43
-rw-r--r--src/bitcoin-cli-res.rc2
-rw-r--r--src/bitcoin-cli.cpp83
-rw-r--r--src/bitcoin-tx.cpp68
-rw-r--r--src/bitcoind.cpp46
-rw-r--r--src/blockencodings.cpp180
-rw-r--r--src/blockencodings.h206
-rw-r--r--src/bloom.cpp101
-rw-r--r--src/bloom.h17
-rw-r--r--src/chain.cpp33
-rw-r--r--src/chain.h72
-rw-r--r--src/chainparams.cpp99
-rw-r--r--src/chainparams.h15
-rw-r--r--src/chainparamsbase.cpp2
-rw-r--r--src/chainparamsbase.h2
-rw-r--r--src/chainparamsseeds.h1436
-rw-r--r--src/checkpoints.cpp2
-rw-r--r--src/checkpoints.h2
-rw-r--r--src/checkqueue.h2
-rw-r--r--src/clientversion.cpp9
-rw-r--r--src/clientversion.h9
-rw-r--r--src/coincontrol.h13
-rw-r--r--src/coins.cpp24
-rw-r--r--src/coins.h51
-rw-r--r--src/compat.h13
-rw-r--r--src/compat/endian.h2
-rw-r--r--src/compressor.h10
-rw-r--r--src/consensus/consensus.h19
-rw-r--r--src/consensus/merkle.cpp15
-rw-r--r--src/consensus/merkle.h6
-rw-r--r--src/consensus/params.h42
-rw-r--r--src/consensus/validation.h11
-rw-r--r--src/core_io.h4
-rw-r--r--src/core_memusage.h24
-rw-r--r--src/core_read.cpp18
-rw-r--r--src/core_write.cpp17
-rw-r--r--src/crypto/aes.cpp217
-rw-r--r--src/crypto/aes.h118
-rw-r--r--src/crypto/ctaes/COPYING21
-rw-r--r--src/crypto/ctaes/README.md41
-rw-r--r--src/crypto/ctaes/bench.c170
-rw-r--r--src/crypto/ctaes/ctaes.c556
-rw-r--r--src/crypto/ctaes/ctaes.h41
-rw-r--r--src/crypto/ctaes/test.c110
-rw-r--r--src/crypto/ripemd160.h2
-rw-r--r--src/crypto/sha1.h2
-rw-r--r--src/crypto/sha256.h2
-rw-r--r--src/crypto/sha512.h2
-rw-r--r--src/dbwrapper.cpp59
-rw-r--r--src/dbwrapper.h76
-rw-r--r--src/hash.cpp129
-rw-r--r--src/hash.h36
-rw-r--r--src/httprpc.cpp21
-rw-r--r--src/httpserver.cpp116
-rw-r--r--src/httpserver.h10
-rw-r--r--src/indirectmap.h56
-rw-r--r--src/init.cpp696
-rw-r--r--src/init.h4
-rw-r--r--src/key.cpp17
-rw-r--r--src/key.h54
-rw-r--r--src/keystore.cpp3
-rw-r--r--src/keystore.h2
-rw-r--r--src/limitedmap.h9
-rw-r--r--src/main.cpp2883
-rw-r--r--src/main.h272
-rw-r--r--src/memusage.h40
-rw-r--r--src/merkleblock.cpp18
-rw-r--r--src/merkleblock.h11
-rw-r--r--src/miner.cpp853
-rw-r--r--src/miner.h188
-rw-r--r--src/mruset.h65
-rw-r--r--src/net.cpp1477
-rw-r--r--src/net.h687
-rw-r--r--src/netaddress.cpp716
-rw-r--r--src/netaddress.h171
-rw-r--r--src/netbase.cpp841
-rw-r--r--src/netbase.h176
-rw-r--r--src/noui.cpp6
-rw-r--r--src/noui.h2
-rw-r--r--src/policy/fees.cpp21
-rw-r--r--src/policy/fees.h23
-rw-r--r--src/policy/policy.cpp123
-rw-r--r--src/policy/policy.h50
-rw-r--r--src/policy/rbf.cpp47
-rw-r--r--src/policy/rbf.h26
-rw-r--r--src/pow.cpp48
-rw-r--r--src/pow.h7
-rw-r--r--src/prevector.h31
-rw-r--r--src/primitives/block.cpp13
-rw-r--r--src/primitives/block.h10
-rw-r--r--src/primitives/transaction.cpp34
-rw-r--r--src/primitives/transaction.h241
-rw-r--r--src/protocol.cpp118
-rw-r--r--src/protocol.h267
-rw-r--r--src/pubkey.cpp14
-rw-r--r--src/pubkey.h47
-rw-r--r--src/qt/addressbookpage.cpp18
-rw-r--r--src/qt/addressbookpage.h2
-rw-r--r--src/qt/addresstablemodel.cpp14
-rw-r--r--src/qt/addresstablemodel.h2
-rw-r--r--src/qt/askpassphrasedialog.cpp39
-rw-r--r--src/qt/askpassphrasedialog.h3
-rw-r--r--src/qt/bantablemodel.cpp7
-rw-r--r--src/qt/bantablemodel.h2
-rw-r--r--src/qt/bitcoin.cpp21
-rw-r--r--src/qt/bitcoin.qrc6
-rw-r--r--src/qt/bitcoin_locale.qrc12
-rw-r--r--src/qt/bitcoinamountfield.cpp2
-rw-r--r--src/qt/bitcoinamountfield.h2
-rw-r--r--src/qt/bitcoingui.cpp218
-rw-r--r--src/qt/bitcoingui.h21
-rw-r--r--src/qt/bitcoinstrings.cpp122
-rw-r--r--src/qt/bitcoinunits.cpp9
-rw-r--r--src/qt/bitcoinunits.h3
-rw-r--r--src/qt/clientmodel.cpp108
-rw-r--r--src/qt/clientmodel.h12
-rw-r--r--src/qt/coincontroldialog.cpp132
-rw-r--r--src/qt/coincontroldialog.h10
-rw-r--r--src/qt/coincontroltreewidget.cpp2
-rw-r--r--src/qt/coincontroltreewidget.h2
-rw-r--r--src/qt/csvmodelwriter.cpp10
-rw-r--r--src/qt/csvmodelwriter.h2
-rw-r--r--src/qt/editaddressdialog.cpp20
-rw-r--r--src/qt/editaddressdialog.h2
-rw-r--r--src/qt/forms/coincontroldialog.ui61
-rw-r--r--src/qt/forms/debugwindow.ui301
-rw-r--r--src/qt/forms/helpmessagedialog.ui3
-rw-r--r--src/qt/forms/intro.ui10
-rw-r--r--src/qt/forms/modaloverlay.ui376
-rw-r--r--src/qt/forms/optionsdialog.ui16
-rw-r--r--src/qt/forms/overviewpage.ui4
-rw-r--r--src/qt/forms/receiverequestdialog.ui2
-rw-r--r--src/qt/forms/sendcoinsdialog.ui94
-rw-r--r--src/qt/forms/transactiondescdialog.ui2
-rw-r--r--src/qt/guiconstants.h6
-rw-r--r--src/qt/guiutil.cpp89
-rw-r--r--src/qt/guiutil.h6
-rw-r--r--src/qt/intro.cpp44
-rw-r--r--src/qt/intro.h7
-rw-r--r--src/qt/locale/bitcoin_af.ts264
-rw-r--r--src/qt/locale/bitcoin_af_ZA.ts419
-rw-r--r--src/qt/locale/bitcoin_ar.ts1143
-rw-r--r--src/qt/locale/bitcoin_be_BY.ts751
-rw-r--r--src/qt/locale/bitcoin_bg.ts1277
-rw-r--r--src/qt/locale/bitcoin_bg_BG.ts187
-rw-r--r--src/qt/locale/bitcoin_ca.ts1515
-rw-r--r--src/qt/locale/bitcoin_ca@valencia.ts1375
-rw-r--r--src/qt/locale/bitcoin_ca_ES.ts1511
-rw-r--r--src/qt/locale/bitcoin_cs.ts1631
-rw-r--r--src/qt/locale/bitcoin_cs_CZ.ts369
-rw-r--r--src/qt/locale/bitcoin_cy.ts343
-rw-r--r--src/qt/locale/bitcoin_da.ts1697
-rw-r--r--src/qt/locale/bitcoin_de.ts1701
-rw-r--r--src/qt/locale/bitcoin_el.ts165
-rw-r--r--src/qt/locale/bitcoin_el_GR.ts1201
-rw-r--r--src/qt/locale/bitcoin_en.ts2401
-rw-r--r--src/qt/locale/bitcoin_en_GB.ts1681
-rw-r--r--src/qt/locale/bitcoin_eo.ts1187
-rw-r--r--src/qt/locale/bitcoin_es.ts1764
-rw-r--r--src/qt/locale/bitcoin_es_AR.ts (renamed from src/qt/locale/bitcoin_bs.ts)149
-rw-r--r--src/qt/locale/bitcoin_es_CL.ts744
-rw-r--r--src/qt/locale/bitcoin_es_CO.ts284
-rw-r--r--src/qt/locale/bitcoin_es_DO.ts1088
-rw-r--r--src/qt/locale/bitcoin_es_ES.ts259
-rw-r--r--src/qt/locale/bitcoin_es_MX.ts743
-rw-r--r--src/qt/locale/bitcoin_es_UY.ts346
-rw-r--r--src/qt/locale/bitcoin_es_VE.ts569
-rw-r--r--src/qt/locale/bitcoin_et.ts847
-rw-r--r--src/qt/locale/bitcoin_eu_ES.ts475
-rw-r--r--src/qt/locale/bitcoin_fa.ts1177
-rw-r--r--src/qt/locale/bitcoin_fa_IR.ts591
-rw-r--r--src/qt/locale/bitcoin_fi.ts1567
-rw-r--r--src/qt/locale/bitcoin_fr.ts1871
-rw-r--r--src/qt/locale/bitcoin_fr_CA.ts121
-rw-r--r--src/qt/locale/bitcoin_fr_FR.ts1358
-rw-r--r--src/qt/locale/bitcoin_gl.ts1037
-rw-r--r--src/qt/locale/bitcoin_he.ts1415
-rw-r--r--src/qt/locale/bitcoin_hi_IN.ts473
-rw-r--r--src/qt/locale/bitcoin_hr.ts845
-rw-r--r--src/qt/locale/bitcoin_hu.ts1105
-rw-r--r--src/qt/locale/bitcoin_id_ID.ts1311
-rw-r--r--src/qt/locale/bitcoin_it.ts1631
-rw-r--r--src/qt/locale/bitcoin_it_IT.ts140
-rw-r--r--src/qt/locale/bitcoin_ja.ts1683
-rw-r--r--src/qt/locale/bitcoin_ka.ts1119
-rw-r--r--src/qt/locale/bitcoin_kk_KZ.ts175
-rw-r--r--src/qt/locale/bitcoin_ko_KR.ts1851
-rw-r--r--src/qt/locale/bitcoin_ku_IQ.ts272
-rw-r--r--src/qt/locale/bitcoin_ky.ts111
-rw-r--r--src/qt/locale/bitcoin_la.ts771
-rw-r--r--src/qt/locale/bitcoin_lt.ts933
-rw-r--r--src/qt/locale/bitcoin_lv_LV.ts1067
-rw-r--r--src/qt/locale/bitcoin_mk_MK.ts477
-rw-r--r--src/qt/locale/bitcoin_mn.ts597
-rw-r--r--src/qt/locale/bitcoin_ms_MY.ts82
-rw-r--r--src/qt/locale/bitcoin_nb.ts1443
-rw-r--r--src/qt/locale/bitcoin_nl.ts1944
-rw-r--r--src/qt/locale/bitcoin_pam.ts719
-rw-r--r--src/qt/locale/bitcoin_pl.ts1760
-rw-r--r--src/qt/locale/bitcoin_pt_BR.ts1713
-rw-r--r--src/qt/locale/bitcoin_pt_PT.ts1935
-rw-r--r--src/qt/locale/bitcoin_ro.ts136
-rw-r--r--src/qt/locale/bitcoin_ro_RO.ts1393
-rw-r--r--src/qt/locale/bitcoin_ru.ts1593
-rw-r--r--src/qt/locale/bitcoin_ru_RU.ts147
-rw-r--r--src/qt/locale/bitcoin_sk.ts1562
-rw-r--r--src/qt/locale/bitcoin_sl_SI.ts1345
-rw-r--r--src/qt/locale/bitcoin_sq.ts429
-rw-r--r--src/qt/locale/bitcoin_sr.ts439
-rw-r--r--src/qt/locale/bitcoin_sr@latin.ts200
-rw-r--r--src/qt/locale/bitcoin_sv.ts1678
-rw-r--r--src/qt/locale/bitcoin_ta.ts688
-rw-r--r--src/qt/locale/bitcoin_th_TH.ts827
-rw-r--r--src/qt/locale/bitcoin_tr.ts1813
-rw-r--r--src/qt/locale/bitcoin_tr_TR.ts159
-rw-r--r--src/qt/locale/bitcoin_uk.ts1479
-rw-r--r--src/qt/locale/bitcoin_ur_PK.ts223
-rw-r--r--src/qt/locale/bitcoin_uz@Cyrl.ts945
-rw-r--r--src/qt/locale/bitcoin_vi.ts119
-rw-r--r--src/qt/locale/bitcoin_vi_VN.ts315
-rw-r--r--src/qt/locale/bitcoin_zh.ts79
-rw-r--r--src/qt/locale/bitcoin_zh_CN.ts1588
-rw-r--r--src/qt/locale/bitcoin_zh_HK.ts268
-rw-r--r--src/qt/locale/bitcoin_zh_TW.ts1735
-rw-r--r--src/qt/macdockiconhandler.h2
-rw-r--r--src/qt/macnotificationhandler.h2
-rw-r--r--src/qt/modaloverlay.cpp162
-rw-r--r--src/qt/modaloverlay.h45
-rw-r--r--src/qt/networkstyle.cpp8
-rw-r--r--src/qt/notificator.cpp14
-rw-r--r--src/qt/notificator.h2
-rw-r--r--src/qt/openuridialog.cpp2
-rw-r--r--src/qt/openuridialog.h2
-rw-r--r--src/qt/optionsdialog.cpp36
-rw-r--r--src/qt/optionsdialog.h4
-rw-r--r--src/qt/optionsmodel.cpp52
-rw-r--r--src/qt/optionsmodel.h10
-rw-r--r--src/qt/overviewpage.cpp15
-rw-r--r--src/qt/overviewpage.h4
-rw-r--r--src/qt/paymentrequest.proto2
-rw-r--r--src/qt/paymentrequestplus.cpp2
-rw-r--r--src/qt/paymentrequestplus.h2
-rw-r--r--src/qt/paymentserver.cpp6
-rw-r--r--src/qt/paymentserver.h2
-rw-r--r--src/qt/peertablemodel.cpp25
-rw-r--r--src/qt/peertablemodel.h9
-rw-r--r--src/qt/platformstyle.cpp10
-rw-r--r--src/qt/qvalidatedlineedit.cpp10
-rw-r--r--src/qt/qvalidatedlineedit.h2
-rw-r--r--src/qt/qvaluecombobox.cpp6
-rw-r--r--src/qt/qvaluecombobox.h2
-rw-r--r--src/qt/receivecoinsdialog.cpp29
-rw-r--r--src/qt/receivecoinsdialog.h4
-rw-r--r--src/qt/receiverequestdialog.cpp38
-rw-r--r--src/qt/receiverequestdialog.h3
-rw-r--r--src/qt/recentrequeststablemodel.cpp11
-rw-r--r--src/qt/recentrequeststablemodel.h3
-rw-r--r--src/qt/res/bitcoin-qt-res.rc5
-rw-r--r--src/qt/res/icons/about.pngbin4726 -> 3717 bytes
-rw-r--r--src/qt/res/icons/bitcoin_testnet.icobin0 -> 57251 bytes
-rw-r--r--src/qt/res/icons/chevron.pngbin0 -> 803 bytes
-rw-r--r--src/qt/res/icons/fontbigger.pngbin0 -> 1180 bytes
-rw-r--r--src/qt/res/icons/fontsmaller.pngbin0 -> 951 bytes
-rw-r--r--src/qt/res/icons/hd_disabled.pngbin0 -> 4328 bytes
-rw-r--r--src/qt/res/icons/hd_enabled.pngbin0 -> 1889 bytes
-rw-r--r--src/qt/res/icons/transaction_abandoned.pngbin0 -> 1473 bytes
-rwxr-xr-xsrc/qt/res/movies/makespinner.sh4
-rw-r--r--src/qt/res/src/hd_disabled.svg26
-rw-r--r--src/qt/res/src/hd_enabled.svg13
-rw-r--r--src/qt/rpcconsole.cpp408
-rw-r--r--src/qt/rpcconsole.h16
-rw-r--r--src/qt/sendcoinsdialog.cpp133
-rw-r--r--src/qt/sendcoinsdialog.h25
-rw-r--r--src/qt/sendcoinsentry.cpp14
-rw-r--r--src/qt/sendcoinsentry.h2
-rw-r--r--src/qt/signverifymessagedialog.cpp10
-rw-r--r--src/qt/signverifymessagedialog.h2
-rw-r--r--src/qt/splashscreen.cpp31
-rw-r--r--src/qt/splashscreen.h2
-rw-r--r--src/qt/test/paymentrequestdata.h2
-rw-r--r--src/qt/test/paymentservertests.cpp2
-rw-r--r--src/qt/test/paymentservertests.h2
-rw-r--r--src/qt/test/rpcnestedtests.cpp93
-rw-r--r--src/qt/test/rpcnestedtests.h25
-rw-r--r--src/qt/test/test_main.cpp16
-rw-r--r--src/qt/test/uritests.h2
-rw-r--r--src/qt/trafficgraphwidget.cpp2
-rw-r--r--src/qt/trafficgraphwidget.h2
-rw-r--r--src/qt/transactiondesc.cpp10
-rw-r--r--src/qt/transactiondesc.h2
-rw-r--r--src/qt/transactiondescdialog.cpp3
-rw-r--r--src/qt/transactiondescdialog.h2
-rw-r--r--src/qt/transactionfilterproxy.cpp10
-rw-r--r--src/qt/transactionfilterproxy.h2
-rw-r--r--src/qt/transactionrecord.cpp11
-rw-r--r--src/qt/transactionrecord.h19
-rw-r--r--src/qt/transactiontablemodel.cpp58
-rw-r--r--src/qt/transactiontablemodel.h4
-rw-r--r--src/qt/transactionview.cpp78
-rw-r--r--src/qt/transactionview.h5
-rw-r--r--src/qt/utilitydialog.cpp16
-rw-r--r--src/qt/utilitydialog.h2
-rw-r--r--src/qt/walletframe.cpp16
-rw-r--r--src/qt/walletframe.h15
-rw-r--r--src/qt/walletmodel.cpp49
-rw-r--r--src/qt/walletmodel.h18
-rw-r--r--src/qt/walletmodeltransaction.cpp9
-rw-r--r--src/qt/walletmodeltransaction.h2
-rw-r--r--src/qt/walletview.cpp56
-rw-r--r--src/qt/walletview.h9
-rw-r--r--src/qt/winshutdownmonitor.cpp2
-rw-r--r--src/random.cpp68
-rw-r--r--src/random.h11
-rw-r--r--src/rest.cpp21
-rw-r--r--src/reverselock.h9
-rw-r--r--src/rpc/blockchain.cpp (renamed from src/rpcblockchain.cpp)642
-rw-r--r--src/rpc/client.cpp (renamed from src/rpcclient.cpp)26
-rw-r--r--src/rpc/client.h (renamed from src/rpcclient.h)2
-rw-r--r--src/rpc/mining.cpp (renamed from src/rpcmining.cpp)361
-rw-r--r--src/rpc/misc.cpp (renamed from src/rpcmisc.cpp)86
-rw-r--r--src/rpc/net.cpp (renamed from src/rpcnet.cpp)286
-rw-r--r--src/rpc/protocol.cpp (renamed from src/rpcprotocol.cpp)11
-rw-r--r--src/rpc/protocol.h94
-rw-r--r--src/rpc/rawtransaction.cpp (renamed from src/rpcrawtransaction.cpp)129
-rw-r--r--src/rpc/register.h32
-rw-r--r--src/rpc/server.cpp (renamed from src/rpcserver.cpp)202
-rw-r--r--src/rpc/server.h199
-rw-r--r--src/rpcprotocol.h93
-rw-r--r--src/rpcserver.h272
-rw-r--r--src/scheduler.cpp1
-rw-r--r--src/script/bitcoinconsensus.cpp33
-rw-r--r--src/script/bitcoinconsensus.h14
-rw-r--r--src/script/interpreter.cpp415
-rw-r--r--src/script/interpreter.h67
-rw-r--r--src/script/ismine.cpp156
-rw-r--r--src/script/ismine.h41
-rw-r--r--src/script/script.cpp44
-rw-r--r--src/script/script.h56
-rw-r--r--src/script/script_error.cpp20
-rw-r--r--src/script/script_error.h16
-rw-r--r--src/script/sigcache.cpp2
-rw-r--r--src/script/sigcache.h4
-rw-r--r--src/script/sign.cpp289
-rw-r--r--src/script/sign.h41
-rw-r--r--src/script/standard.cpp64
-rw-r--r--src/script/standard.h8
-rw-r--r--src/secp256k1/.gitignore19
-rw-r--r--src/secp256k1/.travis.yml19
-rw-r--r--src/secp256k1/Makefile.am72
-rw-r--r--src/secp256k1/README.md2
-rw-r--r--src/secp256k1/build-aux/m4/ax_jni_include_dir.m4140
-rw-r--r--src/secp256k1/build-aux/m4/bitcoin_secp.m44
-rw-r--r--src/secp256k1/configure.ac146
-rw-r--r--src/secp256k1/libsecp256k1.pc.in2
-rw-r--r--src/secp256k1/sage/group_prover.sage322
-rw-r--r--src/secp256k1/sage/secp256k1.sage306
-rw-r--r--src/secp256k1/sage/weierstrass_prover.sage264
-rw-r--r--src/secp256k1/src/asm/field_10x26_arm.s919
-rw-r--r--src/secp256k1/src/bench_ecdh.c3
-rw-r--r--src/secp256k1/src/bench_internal.c34
-rw-r--r--src/secp256k1/src/bench_verify.c44
-rw-r--r--src/secp256k1/src/ecmult_const_impl.h67
-rw-r--r--src/secp256k1/src/ecmult_impl.h2
-rw-r--r--src/secp256k1/src/field.h8
-rw-r--r--src/secp256k1/src/field_10x26_impl.h12
-rw-r--r--src/secp256k1/src/field_5x52_impl.h1
-rw-r--r--src/secp256k1/src/field_5x52_int128_impl.h4
-rw-r--r--src/secp256k1/src/field_impl.h36
-rw-r--r--src/secp256k1/src/group.h5
-rw-r--r--src/secp256k1/src/group_impl.h36
-rw-r--r--src/secp256k1/src/hash.h2
-rw-r--r--src/secp256k1/src/hash_impl.h10
-rw-r--r--src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java472
-rw-r--r--src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java247
-rw-r--r--src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java45
-rw-r--r--src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java51
-rw-r--r--src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c412
-rw-r--r--src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h112
-rw-r--r--src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c15
-rw-r--r--src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h22
-rw-r--r--src/secp256k1/src/modules/ecdh/Makefile.am.include2
-rw-r--r--src/secp256k1/src/modules/recovery/Makefile.am.include2
-rw-r--r--src/secp256k1/src/modules/schnorr/Makefile.am.include2
-rw-r--r--src/secp256k1/src/num.h6
-rw-r--r--src/secp256k1/src/num_gmp_impl.h26
-rw-r--r--src/secp256k1/src/scalar_impl.h2
-rw-r--r--src/secp256k1/src/secp256k1.c15
-rw-r--r--src/secp256k1/src/tests.c190
-rw-r--r--src/serialize.h50
-rw-r--r--src/streams.h53
-rw-r--r--src/support/allocators/secure.h2
-rw-r--r--src/support/allocators/zeroafterfree.h2
-rw-r--r--src/support/pagelocker.cpp2
-rw-r--r--src/support/pagelocker.h8
-rw-r--r--src/sync.cpp57
-rw-r--r--src/sync.h40
-rw-r--r--src/test/Checkpoints_tests.cpp2
-rw-r--r--src/test/DoS_tests.cpp72
-rw-r--r--src/test/README.md29
-rw-r--r--src/test/addrman_tests.cpp465
-rw-r--r--src/test/alert_tests.cpp256
-rw-r--r--src/test/allocator_tests.cpp2
-rw-r--r--src/test/amount_tests.cpp71
-rw-r--r--src/test/arith_uint256_tests.cpp4
-rw-r--r--src/test/base32_tests.cpp2
-rw-r--r--src/test/base58_tests.cpp9
-rw-r--r--src/test/base64_tests.cpp2
-rw-r--r--src/test/bctest.py11
-rw-r--r--src/test/bip32_tests.cpp18
-rwxr-xr-xsrc/test/bitcoin-util-test.py29
-rw-r--r--src/test/blockencodings_tests.cpp314
-rw-r--r--src/test/bloom_tests.cpp30
-rw-r--r--src/test/buildenv.py.in2
-rw-r--r--src/test/checkblock_tests.cpp66
-rw-r--r--src/test/coins_tests.cpp78
-rw-r--r--src/test/compress_tests.cpp2
-rw-r--r--src/test/crypto_tests.cpp193
-rw-r--r--src/test/data/alertTests.rawbin1279 -> 0 bytes
-rw-r--r--src/test/data/bitcoin-util-test.json154
-rw-r--r--src/test/data/blanktx.json11
-rw-r--r--src/test/data/script_invalid.json814
-rw-r--r--src/test/data/script_tests.json2609
-rw-r--r--src/test/data/script_valid.json911
-rw-r--r--src/test/data/tt-delin1-out.json217
-rw-r--r--src/test/data/tt-delout1-out.json213
-rw-r--r--src/test/data/tt-locktime317000-out.json226
-rw-r--r--src/test/data/tx_invalid.json153
-rw-r--r--src/test/data/tx_valid.json274
-rw-r--r--src/test/data/txcreate1.json64
-rw-r--r--src/test/data/txcreate2.json20
-rw-r--r--src/test/data/txcreatedata1.json42
-rw-r--r--src/test/data/txcreatedata2.json42
-rw-r--r--src/test/data/txcreatedata_seq0.hex1
-rw-r--r--src/test/data/txcreatedata_seq0.json33
-rw-r--r--src/test/data/txcreatedata_seq1.hex1
-rw-r--r--src/test/data/txcreatedata_seq1.json42
-rw-r--r--src/test/data/txcreatesign.json33
-rw-r--r--src/test/dbwrapper_tests.cpp134
-rw-r--r--src/test/getarg_tests.cpp2
-rw-r--r--src/test/hash_tests.cpp83
-rw-r--r--src/test/key_tests.cpp2
-rw-r--r--src/test/main_tests.cpp2
-rw-r--r--src/test/mempool_tests.cpp153
-rw-r--r--src/test/merkle_tests.cpp2
-rw-r--r--src/test/miner_tests.cpp362
-rw-r--r--src/test/mruset_tests.cpp81
-rw-r--r--src/test/multisig_tests.cpp35
-rw-r--r--src/test/net_tests.cpp177
-rw-r--r--src/test/netbase_tests.cpp283
-rw-r--r--src/test/pmt_tests.cpp15
-rw-r--r--src/test/policyestimator_tests.cpp21
-rw-r--r--src/test/prevector_tests.cpp81
-rw-r--r--src/test/reverselock_tests.cpp16
-rw-r--r--src/test/rpc_tests.cpp50
-rw-r--r--src/test/rpc_wallet_tests.cpp229
-rw-r--r--src/test/sanity_tests.cpp2
-rw-r--r--src/test/scheduler_tests.cpp4
-rw-r--r--src/test/script_P2SH_tests.cpp39
-rw-r--r--src/test/script_tests.cpp1278
-rw-r--r--src/test/scriptnum10.h2
-rw-r--r--src/test/scriptnum_tests.cpp2
-rw-r--r--src/test/serialize_tests.cpp23
-rw-r--r--src/test/sighash_tests.cpp9
-rw-r--r--src/test/sigopcount_tests.cpp179
-rw-r--r--src/test/skiplist_tests.cpp2
-rw-r--r--src/test/streams_tests.cpp2
-rw-r--r--src/test/test_bitcoin.cpp57
-rw-r--r--src/test/test_bitcoin.h20
-rw-r--r--src/test/testutil.cpp33
-rw-r--r--src/test/testutil.h15
-rw-r--r--src/test/timedata_tests.cpp2
-rw-r--r--src/test/transaction_tests.cpp394
-rw-r--r--src/test/txvalidationcache_tests.cpp6
-rw-r--r--src/test/uint256_tests.cpp2
-rw-r--r--src/test/univalue_tests.cpp1
-rw-r--r--src/test/util_tests.cpp104
-rw-r--r--src/test/versionbits_tests.cpp316
-rw-r--r--src/threadsafety.h2
-rw-r--r--src/timedata.cpp12
-rw-r--r--src/timedata.h2
-rw-r--r--src/tinyformat.h702
-rw-r--r--src/torcontrol.cpp108
-rw-r--r--src/txdb.cpp94
-rw-r--r--src/txdb.h73
-rw-r--r--src/txmempool.cpp446
-rw-r--r--src/txmempool.h290
-rw-r--r--src/ui_interface.cpp29
-rw-r--r--src/ui_interface.h23
-rw-r--r--src/uint256.cpp66
-rw-r--r--src/uint256.h28
-rw-r--r--src/undo.h2
-rw-r--r--src/univalue/.travis.yml2
-rw-r--r--src/univalue/Makefile.am9
-rw-r--r--src/univalue/configure.ac6
-rw-r--r--src/univalue/include/univalue.h32
-rw-r--r--src/univalue/lib/univalue.cpp31
-rw-r--r--src/univalue/lib/univalue_read.cpp37
-rw-r--r--src/univalue/lib/univalue_utffilter.h119
-rw-r--r--src/univalue/lib/univalue_write.cpp11
-rw-r--r--src/univalue/test/fail38.json1
-rw-r--r--src/univalue/test/fail39.json1
-rw-r--r--src/univalue/test/fail40.json1
-rw-r--r--src/univalue/test/fail41.json1
-rw-r--r--src/univalue/test/round2.json1
-rw-r--r--src/univalue/test/unitester.cpp31
-rw-r--r--src/util.cpp75
-rw-r--r--src/util.h54
-rw-r--r--src/utilmoneystr.cpp2
-rw-r--r--src/utilmoneystr.h2
-rw-r--r--src/utilstrencodings.cpp92
-rw-r--r--src/utilstrencodings.h16
-rw-r--r--src/utiltime.cpp4
-rw-r--r--src/utiltime.h2
-rw-r--r--src/validationinterface.cpp12
-rw-r--r--src/validationinterface.h14
-rw-r--r--src/version.h12
-rw-r--r--src/versionbits.cpp150
-rw-r--r--src/versionbits.h68
-rw-r--r--src/wallet/crypter.cpp94
-rw-r--r--src/wallet/crypter.h17
-rw-r--r--src/wallet/db.cpp40
-rw-r--r--src/wallet/db.h12
-rw-r--r--src/wallet/rpcdump.cpp141
-rw-r--r--src/wallet/rpcwallet.cpp627
-rw-r--r--src/wallet/rpcwallet.h12
-rw-r--r--src/wallet/test/accounting_tests.cpp (renamed from src/test/accounting_tests.cpp)36
-rw-r--r--src/wallet/test/crypto_tests.cpp230
-rw-r--r--src/wallet/test/wallet_test_fixture.cpp32
-rw-r--r--src/wallet/test/wallet_test_fixture.h18
-rw-r--r--src/wallet/test/wallet_tests.cpp79
-rw-r--r--src/wallet/wallet.cpp1287
-rw-r--r--src/wallet/wallet.h306
-rw-r--r--src/wallet/wallet_ismine.cpp95
-rw-r--r--src/wallet/wallet_ismine.h34
-rw-r--r--src/wallet/walletdb.cpp163
-rw-r--r--src/wallet/walletdb.h56
-rw-r--r--src/zmq/zmqconfig.h2
-rw-r--r--src/zmq/zmqnotificationinterface.cpp3
-rw-r--r--src/zmq/zmqnotificationinterface.h2
-rw-r--r--src/zmq/zmqpublishnotifier.cpp35
-rw-r--r--src/zmq/zmqpublishnotifier.h12
562 files changed, 47969 insertions, 78378 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index bb627a5448..e7f1d82b8b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,68 +1,64 @@
+# Copyright (c) 2013-2016 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
DIST_SUBDIRS = secp256k1 univalue
AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS)
AM_CXXFLAGS = $(HARDENED_CXXFLAGS)
AM_CPPFLAGS = $(HARDENED_CPPFLAGS)
+EXTRA_LIBRARIES =
-if EMBEDDED_LEVELDB
-LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include
-LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/helpers/memenv
-LIBLEVELDB += $(builddir)/leveldb/libleveldb.a
-LIBMEMENV += $(builddir)/leveldb/libmemenv.a
-
-# NOTE: This dependency is not strictly necessary, but without it make may try to build both in parallel, which breaks the LevelDB build system in a race
-$(LIBLEVELDB): $(LIBMEMENV)
-
-$(LIBLEVELDB) $(LIBMEMENV):
- @echo "Building LevelDB ..." && $(MAKE) -C $(@D) $(@F) CXX="$(CXX)" \
- CC="$(CC)" PLATFORM=$(TARGET_OS) AR="$(AR)" $(LEVELDB_TARGET_FLAGS) \
- OPT="$(AM_CXXFLAGS) $(PIE_FLAGS) $(CXXFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -D__STDC_LIMIT_MACROS"
+if EMBEDDED_UNIVALUE
+LIBUNIVALUE = univalue/libunivalue.la
+
+$(LIBUNIVALUE): $(wildcard univalue/lib/*) $(wildcard univalue/include/*)
+ $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F)
+else
+LIBUNIVALUE = $(UNIVALUE_LIBS)
endif
BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config
-BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS)
+BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BDB_CPPFLAGS) $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS)
BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include
-BITCOIN_INCLUDES += -I$(srcdir)/univalue/include
+BITCOIN_INCLUDES += $(UNIVALUE_CFLAGS)
LIBBITCOIN_SERVER=libbitcoin_server.a
-LIBBITCOIN_WALLET=libbitcoin_wallet.a
LIBBITCOIN_COMMON=libbitcoin_common.a
+LIBBITCOIN_CONSENSUS=libbitcoin_consensus.a
LIBBITCOIN_CLI=libbitcoin_cli.a
LIBBITCOIN_UTIL=libbitcoin_util.a
LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a
LIBBITCOINQT=qt/libbitcoinqt.a
LIBSECP256K1=secp256k1/libsecp256k1.la
-LIBUNIVALUE=univalue/libunivalue.la
+
+if ENABLE_ZMQ
+LIBBITCOIN_ZMQ=libbitcoin_zmq.a
+endif
+if BUILD_BITCOIN_LIBS
+LIBBITCOINCONSENSUS=libbitcoinconsensus.la
+endif
+if ENABLE_WALLET
+LIBBITCOIN_WALLET=libbitcoin_wallet.a
+endif
$(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*)
$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F)
-
-$(LIBUNIVALUE): $(wildcard univalue/lib/*) $(wildcard univalue/include/*)
- $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F)
# Make is not made aware of per-object dependencies to avoid limiting building parallelization
# But to build the less dependent modules first, we manually select their order here:
-EXTRA_LIBRARIES = \
- crypto/libbitcoin_crypto.a \
- libbitcoin_util.a \
- libbitcoin_common.a \
- libbitcoin_server.a \
- libbitcoin_cli.a
-if ENABLE_WALLET
-BITCOIN_INCLUDES += $(BDB_CPPFLAGS)
-EXTRA_LIBRARIES += libbitcoin_wallet.a
-endif
-if ENABLE_ZMQ
-EXTRA_LIBRARIES += libbitcoin_zmq.a
-endif
+EXTRA_LIBRARIES += \
+ $(LIBBITCOIN_CRYPTO) \
+ $(LIBBITCOIN_UTIL) \
+ $(LIBBITCOIN_COMMON) \
+ $(LIBBITCOIN_CONSENSUS) \
+ $(LIBBITCOIN_SERVER) \
+ $(LIBBITCOIN_CLI) \
+ $(LIBBITCOIN_WALLET) \
+ $(LIBBITCOIN_ZMQ)
-if BUILD_BITCOIN_LIBS
-lib_LTLIBRARIES = libbitcoinconsensus.la
-LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la
-else
-LIBBITCOIN_CONSENSUS=
-endif
+lib_LTLIBRARIES = $(LIBBITCOINCONSENSUS)
bin_PROGRAMS =
TESTS =
@@ -76,15 +72,14 @@ if BUILD_BITCOIN_UTILS
bin_PROGRAMS += bitcoin-cli bitcoin-tx
endif
-.PHONY: FORCE
+.PHONY: FORCE check-symbols check-security
# bitcoin core #
BITCOIN_CORE_H = \
+ addrdb.h \
addrman.h \
- alert.h \
- amount.h \
- arith_uint256.h \
base58.h \
bloom.h \
+ blockencodings.h \
chain.h \
chainparams.h \
chainparamsbase.h \
@@ -100,14 +95,11 @@ BITCOIN_CORE_H = \
compat/sanity.h \
compressor.h \
consensus/consensus.h \
- consensus/merkle.h \
- consensus/params.h \
- consensus/validation.h \
core_io.h \
core_memusage.h \
- hash.h \
httprpc.h \
httpserver.h \
+ indirectmap.h \
init.h \
key.h \
keystore.h \
@@ -117,31 +109,26 @@ BITCOIN_CORE_H = \
memusage.h \
merkleblock.h \
miner.h \
- mruset.h \
net.h \
+ netaddress.h \
netbase.h \
noui.h \
policy/fees.h \
policy/policy.h \
+ policy/rbf.h \
pow.h \
- prevector.h \
- primitives/block.h \
- primitives/transaction.h \
protocol.h \
- pubkey.h \
random.h \
reverselock.h \
- rpcclient.h \
- rpcprotocol.h \
- rpcserver.h \
+ rpc/client.h \
+ rpc/protocol.h \
+ rpc/server.h \
+ rpc/register.h \
scheduler.h \
- script/interpreter.h \
- script/script.h \
- script/script_error.h \
script/sigcache.h \
script/sign.h \
script/standard.h \
- serialize.h \
+ script/ismine.h \
streams.h \
support/allocators/secure.h \
support/allocators/zeroafterfree.h \
@@ -150,23 +137,20 @@ BITCOIN_CORE_H = \
sync.h \
threadsafety.h \
timedata.h \
- tinyformat.h \
torcontrol.h \
txdb.h \
txmempool.h \
ui_interface.h \
- uint256.h \
undo.h \
util.h \
utilmoneystr.h \
- utilstrencodings.h \
utiltime.h \
validationinterface.h \
- version.h \
+ versionbits.h \
wallet/crypter.h \
wallet/db.h \
+ wallet/rpcwallet.h \
wallet/wallet.h \
- wallet/wallet_ismine.h \
wallet/walletdb.h \
zmq/zmqabstractnotifier.h \
zmq/zmqconfig.h\
@@ -185,8 +169,9 @@ libbitcoin_server_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(MINIUPNPC_CP
libbitcoin_server_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libbitcoin_server_a_SOURCES = \
addrman.cpp \
- alert.cpp \
+ addrdb.cpp \
bloom.cpp \
+ blockencodings.cpp \
chain.cpp \
checkpoints.cpp \
httprpc.cpp \
@@ -202,23 +187,24 @@ libbitcoin_server_a_SOURCES = \
policy/policy.cpp \
pow.cpp \
rest.cpp \
- rpcblockchain.cpp \
- rpcmining.cpp \
- rpcmisc.cpp \
- rpcnet.cpp \
- rpcrawtransaction.cpp \
- rpcserver.cpp \
+ rpc/blockchain.cpp \
+ rpc/mining.cpp \
+ rpc/misc.cpp \
+ rpc/net.cpp \
+ rpc/rawtransaction.cpp \
+ rpc/server.cpp \
script/sigcache.cpp \
+ script/ismine.cpp \
timedata.cpp \
torcontrol.cpp \
txdb.cpp \
txmempool.cpp \
+ ui_interface.cpp \
validationinterface.cpp \
+ versionbits.cpp \
$(BITCOIN_CORE_H)
if ENABLE_ZMQ
-LIBBITCOIN_ZMQ=libbitcoin_zmq.a
-
libbitcoin_zmq_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(ZMQ_CFLAGS)
libbitcoin_zmq_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libbitcoin_zmq_a_SOURCES = \
@@ -238,14 +224,16 @@ libbitcoin_wallet_a_SOURCES = \
wallet/rpcdump.cpp \
wallet/rpcwallet.cpp \
wallet/wallet.cpp \
- wallet/wallet_ismine.cpp \
wallet/walletdb.cpp \
+ policy/rbf.cpp \
$(BITCOIN_CORE_H)
# crypto primitives library
crypto_libbitcoin_crypto_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_CONFIG_INCLUDES)
crypto_libbitcoin_crypto_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
crypto_libbitcoin_crypto_a_SOURCES = \
+ crypto/aes.cpp \
+ crypto/aes.h \
crypto/common.h \
crypto/hmac_sha256.cpp \
crypto/hmac_sha256.h \
@@ -260,31 +248,58 @@ crypto_libbitcoin_crypto_a_SOURCES = \
crypto/sha512.cpp \
crypto/sha512.h
+# consensus: shared between all executables that validate any consensus rules.
+libbitcoin_consensus_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
+libbitcoin_consensus_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
+libbitcoin_consensus_a_SOURCES = \
+ amount.h \
+ arith_uint256.cpp \
+ arith_uint256.h \
+ consensus/merkle.cpp \
+ consensus/merkle.h \
+ consensus/params.h \
+ consensus/validation.h \
+ hash.cpp \
+ hash.h \
+ prevector.h \
+ primitives/block.cpp \
+ primitives/block.h \
+ primitives/transaction.cpp \
+ primitives/transaction.h \
+ pubkey.cpp \
+ pubkey.h \
+ script/bitcoinconsensus.cpp \
+ script/interpreter.cpp \
+ script/interpreter.h \
+ script/script.cpp \
+ script/script.h \
+ script/script_error.cpp \
+ script/script_error.h \
+ serialize.h \
+ tinyformat.h \
+ uint256.cpp \
+ uint256.h \
+ utilstrencodings.cpp \
+ utilstrencodings.h \
+ version.h
+
# common: shared between bitcoind, and bitcoin-qt and non-server tools
libbitcoin_common_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
libbitcoin_common_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libbitcoin_common_a_SOURCES = \
amount.cpp \
- arith_uint256.cpp \
base58.cpp \
chainparams.cpp \
coins.cpp \
compressor.cpp \
- consensus/merkle.cpp \
core_read.cpp \
core_write.cpp \
- hash.cpp \
key.cpp \
keystore.cpp \
+ netaddress.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 \
$(BITCOIN_CORE_H)
@@ -302,10 +317,9 @@ libbitcoin_util_a_SOURCES = \
compat/glibcxx_sanity.cpp \
compat/strnlen.cpp \
random.cpp \
- rpcprotocol.cpp \
+ rpc/protocol.cpp \
support/cleanse.cpp \
sync.cpp \
- uint256.cpp \
util.cpp \
utilmoneystr.cpp \
utilstrencodings.cpp \
@@ -320,7 +334,7 @@ endif
libbitcoin_cli_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
libbitcoin_cli_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libbitcoin_cli_a_SOURCES = \
- rpcclient.cpp \
+ rpc/client.cpp \
$(BITCOIN_CORE_H)
nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h
@@ -341,20 +355,15 @@ bitcoind_LDADD = \
$(LIBBITCOIN_COMMON) \
$(LIBUNIVALUE) \
$(LIBBITCOIN_UTIL) \
+ $(LIBBITCOIN_WALLET) \
+ $(LIBBITCOIN_ZMQ) \
+ $(LIBBITCOIN_CONSENSUS) \
$(LIBBITCOIN_CRYPTO) \
$(LIBLEVELDB) \
$(LIBMEMENV) \
$(LIBSECP256K1)
-if ENABLE_ZMQ
-bitcoind_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-
-if ENABLE_WALLET
-bitcoind_LDADD += libbitcoin_wallet.a
-endif
-
-bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
+bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS)
# bitcoin-cli binary #
bitcoin_cli_SOURCES = bitcoin-cli.cpp
@@ -369,7 +378,8 @@ endif
bitcoin_cli_LDADD = \
$(LIBBITCOIN_CLI) \
$(LIBUNIVALUE) \
- $(LIBBITCOIN_UTIL)
+ $(LIBBITCOIN_UTIL) \
+ $(LIBBITCOIN_CRYPTO)
bitcoin_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS)
#
@@ -388,6 +398,7 @@ bitcoin_tx_LDADD = \
$(LIBUNIVALUE) \
$(LIBBITCOIN_COMMON) \
$(LIBBITCOIN_UTIL) \
+ $(LIBBITCOIN_CONSENSUS) \
$(LIBBITCOIN_CRYPTO) \
$(LIBSECP256K1)
@@ -397,20 +408,7 @@ bitcoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
# bitcoinconsensus library #
if BUILD_BITCOIN_LIBS
include_HEADERS = script/bitcoinconsensus.h
-libbitcoinconsensus_la_SOURCES = \
- crypto/hmac_sha512.cpp \
- crypto/ripemd160.cpp \
- crypto/sha1.cpp \
- crypto/sha256.cpp \
- crypto/sha512.cpp \
- hash.cpp \
- primitives/transaction.cpp \
- pubkey.cpp \
- script/bitcoinconsensus.cpp \
- script/interpreter.cpp \
- script/script.cpp \
- uint256.cpp \
- utilstrencodings.cpp
+libbitcoinconsensus_la_SOURCES = $(crypto_libbitcoin_crypto_a_SOURCES) $(libbitcoin_consensus_a_SOURCES)
if GLIBC_BACK_COMPAT
libbitcoinconsensus_la_SOURCES += compat/glibc_compat.cpp
@@ -424,7 +422,14 @@ libbitcoinconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
endif
#
-CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a
+CTAES_DIST = crypto/ctaes/bench.c
+CTAES_DIST += crypto/ctaes/ctaes.c
+CTAES_DIST += crypto/ctaes/ctaes.h
+CTAES_DIST += crypto/ctaes/README.md
+CTAES_DIST += crypto/ctaes/test.c
+
+CLEANFILES = $(EXTRA_LIBRARIES)
+
CLEANFILES += *.gcda *.gcno
CLEANFILES += compat/*.gcda compat/*.gcno
CLEANFILES += consensus/*.gcda consensus/*.gcno
@@ -440,26 +445,43 @@ CLEANFILES += zmq/*.gcda zmq/*.gcno
DISTCLEANFILES = obj/build.h
-EXTRA_DIST = leveldb
+EXTRA_DIST = $(CTAES_DIST)
clean-local:
- -$(MAKE) -C leveldb clean
-$(MAKE) -C secp256k1 clean
-$(MAKE) -C univalue clean
-rm -f leveldb/*/*.gcda leveldb/*/*.gcno leveldb/helpers/memenv/*.gcda leveldb/helpers/memenv/*.gcno
-rm -f config.h
+ -rm -rf test/__pycache__
.rc.o:
@test -f $(WINDRES)
- $(AM_V_GEN) $(WINDRES) -DWINDRES_PREPROC -i $< -o $@
+ ## FIXME: How to get the appropriate modulename_CPPFLAGS in here?
+ $(AM_V_GEN) $(WINDRES) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) -DWINDRES_PREPROC -i $< -o $@
.mm.o:
$(AM_V_CXX) $(OBJCXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CXXFLAGS) $(QT_INCLUDES) $(AM_CXXFLAGS) $(PIE_FLAGS) $(CXXFLAGS) -c -o $@ $<
+check-symbols: $(bin_PROGRAMS)
+if GLIBC_BACK_COMPAT
+ @echo "Checking glibc back compat..."
+ $(AM_V_at) READELF=$(READELF) CPPFILT=$(CPPFILT) $(top_srcdir)/contrib/devtools/symbol-check.py < $(bin_PROGRAMS)
+endif
+
+check-security: $(bin_PROGRAMS)
+if HARDEN
+ @echo "Checking binary security..."
+ $(AM_V_at) READELF=$(READELF) OBJDUMP=$(OBJDUMP) $(top_srcdir)/contrib/devtools/security-check.py < $(bin_PROGRAMS)
+endif
+
%.pb.cc %.pb.h: %.proto
@test -f $(PROTOC)
- $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(<D) $<)
+ $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(<D) $<
+
+if EMBEDDED_LEVELDB
+include Makefile.leveldb.include
+endif
if ENABLE_TESTS
include Makefile.test.include
diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
index d660a3a747..8c024a8c4a 100644
--- a/src/Makefile.bench.include
+++ b/src/Makefile.bench.include
@@ -1,3 +1,7 @@
+# Copyright (c) 2015-2016 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
bin_PROGRAMS += bench/bench_bitcoin
BENCH_SRCDIR = bench
BENCH_BINARY = bench/bench_bitcoin$(EXEEXT)
@@ -7,19 +11,23 @@ bench_bench_bitcoin_SOURCES = \
bench/bench_bitcoin.cpp \
bench/bench.cpp \
bench/bench.h \
- bench/Examples.cpp
+ bench/Examples.cpp \
+ bench/rollingbloom.cpp \
+ bench/crypto_hash.cpp \
+ bench/base58.cpp
bench_bench_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CLFAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/
bench_bench_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
bench_bench_bitcoin_LDADD = \
$(LIBBITCOIN_SERVER) \
$(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UNIVALUE) \
$(LIBBITCOIN_UTIL) \
+ $(LIBBITCOIN_CONSENSUS) \
$(LIBBITCOIN_CRYPTO) \
$(LIBLEVELDB) \
$(LIBMEMENV) \
- $(LIBSECP256K1)
+ $(LIBSECP256K1) \
+ $(LIBUNIVALUE)
if ENABLE_ZMQ
bench_bench_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
diff --git a/src/Makefile.leveldb.include b/src/Makefile.leveldb.include
new file mode 100644
index 0000000000..358f39cbef
--- /dev/null
+++ b/src/Makefile.leveldb.include
@@ -0,0 +1,137 @@
+# Copyright (c) 2016 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+LIBLEVELDB_INT = leveldb/libleveldb.a
+LIBMEMENV_INT = leveldb/libmemenv.a
+
+EXTRA_LIBRARIES += $(LIBLEVELDB_INT)
+EXTRA_LIBRARIES += $(LIBMEMENV_INT)
+
+LIBLEVELDB += $(LIBLEVELDB_INT)
+LIBMEMENV += $(LIBMEMENV_INT)
+
+LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include
+LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/helpers/memenv
+
+LEVELDB_CPPFLAGS_INT =
+LEVELDB_CPPFLAGS_INT += -I$(srcdir)/leveldb
+LEVELDB_CPPFLAGS_INT += $(LEVELDB_TARGET_FLAGS)
+LEVELDB_CPPFLAGS_INT += -DLEVELDB_ATOMIC_PRESENT
+LEVELDB_CPPFLAGS_INT += -D__STDC_LIMIT_MACROS
+
+if TARGET_WINDOWS
+LEVELDB_CPPFLAGS_INT += -DLEVELDB_PLATFORM_WINDOWS -DWINVER=0x0500 -D__USE_MINGW_ANSI_STDIO=1
+else
+LEVELDB_CPPFLAGS_INT += -DLEVELDB_PLATFORM_POSIX
+endif
+
+leveldb_libleveldb_a_CPPFLAGS = $(AM_CPPFLAGS) $(LEVELDB_CPPFLAGS_INT) $(LEVELDB_CPPFLAGS)
+leveldb_libleveldb_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
+
+leveldb_libleveldb_a_SOURCES=
+leveldb_libleveldb_a_SOURCES += leveldb/port/atomic_pointer.h
+leveldb_libleveldb_a_SOURCES += leveldb/port/port_example.h
+leveldb_libleveldb_a_SOURCES += leveldb/port/port_posix.h
+leveldb_libleveldb_a_SOURCES += leveldb/port/win/stdint.h
+leveldb_libleveldb_a_SOURCES += leveldb/port/port.h
+leveldb_libleveldb_a_SOURCES += leveldb/port/port_win.h
+leveldb_libleveldb_a_SOURCES += leveldb/port/thread_annotations.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/db.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/options.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/comparator.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/filter_policy.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/slice.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/table_builder.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/env.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/c.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/iterator.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/cache.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/dumpfile.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/table.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/write_batch.h
+leveldb_libleveldb_a_SOURCES += leveldb/include/leveldb/status.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/log_format.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/memtable.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/version_set.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/write_batch_internal.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/filename.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/version_edit.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/dbformat.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/builder.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/log_writer.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/db_iter.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/skiplist.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/db_impl.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/table_cache.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/snapshot.h
+leveldb_libleveldb_a_SOURCES += leveldb/db/log_reader.h
+leveldb_libleveldb_a_SOURCES += leveldb/table/filter_block.h
+leveldb_libleveldb_a_SOURCES += leveldb/table/block_builder.h
+leveldb_libleveldb_a_SOURCES += leveldb/table/block.h
+leveldb_libleveldb_a_SOURCES += leveldb/table/two_level_iterator.h
+leveldb_libleveldb_a_SOURCES += leveldb/table/merger.h
+leveldb_libleveldb_a_SOURCES += leveldb/table/format.h
+leveldb_libleveldb_a_SOURCES += leveldb/table/iterator_wrapper.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/crc32c.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/arena.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/random.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/posix_logger.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/hash.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/histogram.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/coding.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/testutil.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/mutexlock.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/logging.h
+leveldb_libleveldb_a_SOURCES += leveldb/util/testharness.h
+
+leveldb_libleveldb_a_SOURCES += leveldb/db/builder.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/c.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/dbformat.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/db_impl.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/db_iter.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/dumpfile.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/filename.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/log_reader.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/log_writer.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/memtable.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/repair.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/table_cache.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/version_edit.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/version_set.cc
+leveldb_libleveldb_a_SOURCES += leveldb/db/write_batch.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/block_builder.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/block.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/filter_block.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/format.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/iterator.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/merger.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/table_builder.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/table.cc
+leveldb_libleveldb_a_SOURCES += leveldb/table/two_level_iterator.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/arena.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/bloom.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/cache.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/coding.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/comparator.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/crc32c.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/env.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/env_posix.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/filter_policy.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/hash.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/histogram.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/logging.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/options.cc
+leveldb_libleveldb_a_SOURCES += leveldb/util/status.cc
+
+if TARGET_WINDOWS
+leveldb_libleveldb_a_SOURCES += leveldb/util/env_win.cc
+leveldb_libleveldb_a_SOURCES += leveldb/port/port_win.cc
+else
+leveldb_libleveldb_a_SOURCES += leveldb/port/port_posix.cc
+endif
+
+leveldb_libmemenv_a_CPPFLAGS = $(leveldb_libleveldb_a_CPPFLAGS)
+leveldb_libmemenv_a_CXXFLAGS = $(leveldb_libleveldb_a_CXXFLAGS)
+leveldb_libmemenv_a_SOURCES = leveldb/helpers/memenv/memenv.cc
+leveldb_libmemenv_a_SOURCES += leveldb/helpers/memenv/memenv.h
diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
index a390d96a9f..1f9a901d75 100644
--- a/src/Makefile.qt.include
+++ b/src/Makefile.qt.include
@@ -1,14 +1,18 @@
+# Copyright (c) 2013-2016 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
bin_PROGRAMS += qt/bitcoin-qt
EXTRA_LIBRARIES += qt/libbitcoinqt.a
# bitcoin qt core #
QT_TS = \
+ qt/locale/bitcoin_af.ts \
qt/locale/bitcoin_af_ZA.ts \
qt/locale/bitcoin_ar.ts \
qt/locale/bitcoin_be_BY.ts \
- qt/locale/bitcoin_bg_BG.ts \
qt/locale/bitcoin_bg.ts \
- qt/locale/bitcoin_bs.ts \
+ qt/locale/bitcoin_bg_BG.ts \
qt/locale/bitcoin_ca_ES.ts \
qt/locale/bitcoin_ca.ts \
qt/locale/bitcoin_ca@valencia.ts \
@@ -22,7 +26,9 @@ QT_TS = \
qt/locale/bitcoin_en_GB.ts \
qt/locale/bitcoin_en.ts \
qt/locale/bitcoin_eo.ts \
+ qt/locale/bitcoin_es_AR.ts \
qt/locale/bitcoin_es_CL.ts \
+ qt/locale/bitcoin_es_CO.ts \
qt/locale/bitcoin_es_DO.ts \
qt/locale/bitcoin_es_ES.ts \
qt/locale/bitcoin_es_MX.ts \
@@ -43,11 +49,13 @@ QT_TS = \
qt/locale/bitcoin_hr.ts \
qt/locale/bitcoin_hu.ts \
qt/locale/bitcoin_id_ID.ts \
+ qt/locale/bitcoin_it_IT.ts \
qt/locale/bitcoin_it.ts \
qt/locale/bitcoin_ja.ts \
qt/locale/bitcoin_ka.ts \
qt/locale/bitcoin_kk_KZ.ts \
qt/locale/bitcoin_ko_KR.ts \
+ qt/locale/bitcoin_ku_IQ.ts \
qt/locale/bitcoin_ky.ts \
qt/locale/bitcoin_la.ts \
qt/locale/bitcoin_lt.ts \
@@ -62,13 +70,16 @@ QT_TS = \
qt/locale/bitcoin_pt_BR.ts \
qt/locale/bitcoin_pt_PT.ts \
qt/locale/bitcoin_ro_RO.ts \
+ qt/locale/bitcoin_ro.ts \
qt/locale/bitcoin_ru_RU.ts \
qt/locale/bitcoin_ru.ts \
qt/locale/bitcoin_sk.ts \
qt/locale/bitcoin_sl_SI.ts \
qt/locale/bitcoin_sq.ts \
+ qt/locale/bitcoin_sr@latin.ts \
qt/locale/bitcoin_sr.ts \
qt/locale/bitcoin_sv.ts \
+ qt/locale/bitcoin_ta.ts \
qt/locale/bitcoin_th_TH.ts \
qt/locale/bitcoin_tr_TR.ts \
qt/locale/bitcoin_tr.ts \
@@ -78,6 +89,7 @@ QT_TS = \
qt/locale/bitcoin_vi.ts \
qt/locale/bitcoin_vi_VN.ts \
qt/locale/bitcoin_zh_CN.ts \
+ qt/locale/bitcoin_zh_HK.ts \
qt/locale/bitcoin_zh.ts \
qt/locale/bitcoin_zh_TW.ts
@@ -88,6 +100,7 @@ QT_FORMS_UI = \
qt/forms/editaddressdialog.ui \
qt/forms/helpmessagedialog.ui \
qt/forms/intro.ui \
+ qt/forms/modaloverlay.ui \
qt/forms/openuridialog.ui \
qt/forms/optionsdialog.ui \
qt/forms/overviewpage.ui \
@@ -117,6 +130,7 @@ QT_MOC_CPP = \
qt/moc_intro.cpp \
qt/moc_macdockiconhandler.cpp \
qt/moc_macnotificationhandler.cpp \
+ qt/moc_modaloverlay.cpp \
qt/moc_notificator.cpp \
qt/moc_openuridialog.cpp \
qt/moc_optionsdialog.cpp \
@@ -184,6 +198,7 @@ BITCOIN_QT_H = \
qt/intro.h \
qt/macdockiconhandler.h \
qt/macnotificationhandler.h \
+ qt/modaloverlay.h \
qt/networkstyle.h \
qt/notificator.h \
qt/openuridialog.h \
@@ -224,7 +239,9 @@ RES_ICONS = \
qt/res/icons/about.png \
qt/res/icons/about_qt.png \
qt/res/icons/bitcoin.ico \
+ qt/res/icons/bitcoin_testnet.ico \
qt/res/icons/bitcoin.png \
+ qt/res/icons/chevron.png \
qt/res/icons/clock1.png \
qt/res/icons/clock2.png \
qt/res/icons/clock3.png \
@@ -245,6 +262,10 @@ RES_ICONS = \
qt/res/icons/eye_minus.png \
qt/res/icons/eye_plus.png \
qt/res/icons/filesave.png \
+ qt/res/icons/fontbigger.png \
+ qt/res/icons/fontsmaller.png \
+ qt/res/icons/hd_disabled.png \
+ qt/res/icons/hd_enabled.png \
qt/res/icons/history.png \
qt/res/icons/info.png \
qt/res/icons/key.png \
@@ -259,6 +280,7 @@ RES_ICONS = \
qt/res/icons/synced.png \
qt/res/icons/transaction0.png \
qt/res/icons/transaction2.png \
+ qt/res/icons/transaction_abandoned.png \
qt/res/icons/transaction_conflicted.png \
qt/res/icons/tx_inout.png \
qt/res/icons/tx_input.png \
@@ -267,7 +289,7 @@ RES_ICONS = \
qt/res/icons/warning.png \
qt/res/icons/verify.png
-BITCOIN_QT_CPP = \
+BITCOIN_QT_BASE_CPP = \
qt/bantablemodel.cpp \
qt/bitcoinaddressvalidator.cpp \
qt/bitcoinamountfield.cpp \
@@ -277,6 +299,7 @@ BITCOIN_QT_CPP = \
qt/csvmodelwriter.cpp \
qt/guiutil.cpp \
qt/intro.cpp \
+ qt/modaloverlay.cpp \
qt/networkstyle.cpp \
qt/notificator.cpp \
qt/optionsdialog.cpp \
@@ -290,12 +313,9 @@ BITCOIN_QT_CPP = \
qt/trafficgraphwidget.cpp \
qt/utilitydialog.cpp
-if TARGET_WINDOWS
-BITCOIN_QT_CPP += qt/winshutdownmonitor.cpp
-endif
+BITCOIN_QT_WINDOWS_CPP = qt/winshutdownmonitor.cpp
-if ENABLE_WALLET
-BITCOIN_QT_CPP += \
+BITCOIN_QT_WALLET_CPP = \
qt/addressbookpage.cpp \
qt/addresstablemodel.cpp \
qt/askpassphrasedialog.cpp \
@@ -322,6 +342,13 @@ BITCOIN_QT_CPP += \
qt/walletmodel.cpp \
qt/walletmodeltransaction.cpp \
qt/walletview.cpp
+
+BITCOIN_QT_CPP = $(BITCOIN_QT_BASE_CPP)
+if TARGET_WINDOWS
+BITCOIN_QT_CPP += $(BITCOIN_QT_WINDOWS_CPP)
+endif
+if ENABLE_WALLET
+BITCOIN_QT_CPP += $(BITCOIN_QT_WALLET_CPP)
endif
RES_IMAGES =
@@ -375,7 +402,7 @@ endif
if ENABLE_ZMQ
qt_bitcoin_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
endif
-qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
+qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
$(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
$(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
@@ -386,19 +413,20 @@ QT_QM=$(QT_TS:.ts=.qm)
SECONDARY: $(QT_QM)
-qt/bitcoinstrings.cpp: $(libbitcoin_server_a_SOURCES) $(libbitcoin_wallet_a_SOURCES)
+$(srcdir)/qt/bitcoinstrings.cpp: $(libbitcoin_server_a_SOURCES) $(libbitcoin_wallet_a_SOURCES)
@test -n $(XGETTEXT) || echo "xgettext is required for updating translations"
- $(AM_V_GEN) cd $(srcdir); XGETTEXT=$(XGETTEXT) ../share/qt/extract_strings_qt.py $^
+ $(AM_V_GEN) cd $(srcdir); XGETTEXT=$(XGETTEXT) PACKAGE_NAME="$(PACKAGE_NAME)" COPYRIGHT_HOLDERS="$(COPYRIGHT_HOLDERS)" COPYRIGHT_HOLDERS_SUBSTITUTION="$(COPYRIGHT_HOLDERS_SUBSTITUTION)" $(PYTHON) ../share/qt/extract_strings_qt.py $^
-translate: qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
+translate: $(srcdir)/qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_BASE_CPP) $(BITCOIN_QT_WINDOWS_CPP) $(BITCOIN_QT_WALLET_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
@test -n $(LUPDATE) || echo "lupdate is required for updating translations"
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts qt/locale/bitcoin_en.ts
+ $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts $(srcdir)/qt/locale/bitcoin_en.ts
$(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM)
@test -f $(RCC)
- @test -f $(@D)/$(<F) || cp -f $< $(@D)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin_locale $(@D)/$(<F) | \
+ @cp -f $< $(@D)/temp_$(<F)
+ $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin_locale $(@D)/temp_$(<F) | \
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@
+ @rm $(@D)/temp_$(<F)
$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H)
@test -f $(RCC)
@@ -420,11 +448,11 @@ ui_%.h: %.ui
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(UIC) -o $@ $< || (echo "Error creating $@"; false)
%.moc: %.cpp
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) $< | \
+ $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(DEFAULT_INCLUDES) $(QT_INCLUDES) $(MOC_DEFS) $< | \
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@
moc_%.cpp: %.h
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) $< | \
+ $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(DEFAULT_INCLUDES) $(QT_INCLUDES) $(MOC_DEFS) $< | \
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@
%.qm: %.ts
diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include
index ede3fac4c3..cb310d5a1b 100644
--- a/src/Makefile.qttest.include
+++ b/src/Makefile.qttest.include
@@ -1,13 +1,20 @@
+# Copyright (c) 2013-2016 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
bin_PROGRAMS += qt/test/test_bitcoin-qt
TESTS += qt/test/test_bitcoin-qt
-TEST_QT_MOC_CPP = qt/test/moc_uritests.cpp
+TEST_QT_MOC_CPP = \
+ qt/test/moc_rpcnestedtests.cpp \
+ qt/test/moc_uritests.cpp
if ENABLE_WALLET
TEST_QT_MOC_CPP += qt/test/moc_paymentservertests.cpp
endif
TEST_QT_H = \
+ qt/test/rpcnestedtests.h \
qt/test/uritests.h \
qt/test/paymentrequestdata.h \
qt/test/paymentservertests.h
@@ -16,6 +23,7 @@ qt_test_test_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_
$(QT_INCLUDES) $(QT_TEST_INCLUDES) $(PROTOBUF_CFLAGS)
qt_test_test_bitcoin_qt_SOURCES = \
+ qt/test/rpcnestedtests.cpp \
qt/test/test_main.cpp \
qt/test/uritests.cpp \
$(TEST_QT_H)
@@ -33,7 +41,7 @@ endif
if ENABLE_ZMQ
qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
endif
-qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) \
+qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) \
$(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \
$(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
$(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
index 4d0894b711..5ce1bbb896 100644
--- a/src/Makefile.test.include
+++ b/src/Makefile.test.include
@@ -1,3 +1,7 @@
+# Copyright (c) 2013-2016 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
TESTS += test/test_bitcoin
bin_PROGRAMS += test/test_bitcoin
TEST_SRCDIR = test
@@ -17,19 +21,20 @@ EXTRA_DIST += \
test/data/txcreate2.hex \
test/data/txcreatedata1.hex \
test/data/txcreatedata2.hex \
- test/data/txcreatesign.hex
+ test/data/txcreatesign.hex \
+ test/data/txcreatedata_seq0.hex \
+ test/data/txcreatedata_seq1.hex
JSON_TEST_FILES = \
- test/data/script_valid.json \
+ test/data/script_tests.json \
test/data/base58_keys_valid.json \
test/data/base58_encode_decode.json \
test/data/base58_keys_invalid.json \
- test/data/script_invalid.json \
test/data/tx_invalid.json \
test/data/tx_valid.json \
test/data/sighash.json
-RAW_TEST_FILES = test/data/alertTests.raw
+RAW_TEST_FILES =
GENERATED_TEST_FILES = $(JSON_TEST_FILES:.json=.json.h) $(RAW_TEST_FILES:.raw=.raw.h)
@@ -37,14 +42,14 @@ BITCOIN_TESTS =\
test/arith_uint256_tests.cpp \
test/scriptnum10.h \
test/addrman_tests.cpp \
- test/alert_tests.cpp \
+ test/amount_tests.cpp \
test/allocator_tests.cpp \
test/base32_tests.cpp \
test/base58_tests.cpp \
test/base64_tests.cpp \
test/bip32_tests.cpp \
+ test/blockencodings_tests.cpp \
test/bloom_tests.cpp \
- test/checkblock_tests.cpp \
test/Checkpoints_tests.cpp \
test/coins_tests.cpp \
test/compress_tests.cpp \
@@ -59,8 +64,8 @@ BITCOIN_TESTS =\
test/mempool_tests.cpp \
test/merkle_tests.cpp \
test/miner_tests.cpp \
- test/mruset_tests.cpp \
test/multisig_tests.cpp \
+ test/net_tests.cpp \
test/netbase_tests.cpp \
test/pmt_tests.cpp \
test/policyestimator_tests.cpp \
@@ -80,23 +85,28 @@ BITCOIN_TESTS =\
test/streams_tests.cpp \
test/test_bitcoin.cpp \
test/test_bitcoin.h \
+ test/testutil.cpp \
+ test/testutil.h \
test/timedata_tests.cpp \
test/transaction_tests.cpp \
test/txvalidationcache_tests.cpp \
+ test/versionbits_tests.cpp \
test/uint256_tests.cpp \
test/univalue_tests.cpp \
test/util_tests.cpp
if ENABLE_WALLET
BITCOIN_TESTS += \
- test/accounting_tests.cpp \
+ wallet/test/wallet_test_fixture.cpp \
+ wallet/test/wallet_test_fixture.h \
+ wallet/test/accounting_tests.cpp \
wallet/test/wallet_tests.cpp \
- test/rpc_wallet_tests.cpp
+ wallet/test/crypto_tests.cpp
endif
test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS)
-test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
+test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
$(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1)
test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
if ENABLE_WALLET
@@ -118,6 +128,9 @@ CLEAN_BITCOIN_TEST = test/*.gcda test/*.gcno $(GENERATED_TEST_FILES)
CLEANFILES += $(CLEAN_BITCOIN_TEST)
+# This file is problematic for out-of-tree builds if it exists.
+DISTCLEANFILES += test/buildenv.pyc
+
bitcoin_test: $(TEST_BINARY)
bitcoin_test_check: $(TEST_BINARY) FORCE
@@ -128,9 +141,11 @@ bitcoin_test_clean : FORCE
check-local:
@echo "Running test/bitcoin-util-test.py..."
- $(AM_V_at)srcdir=$(srcdir) PYTHONPATH=$(builddir)/test $(srcdir)/test/bitcoin-util-test.py
+ $(AM_V_at)srcdir=$(srcdir) PYTHONPATH=$(builddir)/test $(PYTHON) $(srcdir)/test/bitcoin-util-test.py
$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C secp256k1 check
+if EMBEDDED_UNIVALUE
$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue check
+endif
%.json.h: %.json
@$(MKDIR_P) $(@D)
diff --git a/src/addrdb.cpp b/src/addrdb.cpp
new file mode 100644
index 0000000000..ddf41f92de
--- /dev/null
+++ b/src/addrdb.cpp
@@ -0,0 +1,218 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// 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 "addrdb.h"
+
+#include "addrman.h"
+#include "chainparams.h"
+#include "clientversion.h"
+#include "hash.h"
+#include "random.h"
+#include "streams.h"
+#include "tinyformat.h"
+#include "util.h"
+
+#include <boost/filesystem.hpp>
+
+CBanDB::CBanDB()
+{
+ pathBanlist = GetDataDir() / "banlist.dat";
+}
+
+bool CBanDB::Write(const banmap_t& banSet)
+{
+ // Generate random temporary filename
+ unsigned short randv = 0;
+ GetRandBytes((unsigned char*)&randv, sizeof(randv));
+ std::string tmpfn = strprintf("banlist.dat.%04x", randv);
+
+ // serialize banlist, checksum data up to that point, then append csum
+ CDataStream ssBanlist(SER_DISK, CLIENT_VERSION);
+ ssBanlist << FLATDATA(Params().MessageStart());
+ ssBanlist << banSet;
+ uint256 hash = Hash(ssBanlist.begin(), ssBanlist.end());
+ ssBanlist << hash;
+
+ // open temp output file, and associate with CAutoFile
+ boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
+ FILE *file = fopen(pathTmp.string().c_str(), "wb");
+ CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
+ if (fileout.IsNull())
+ return error("%s: Failed to open file %s", __func__, pathTmp.string());
+
+ // Write and commit header, data
+ try {
+ fileout << ssBanlist;
+ }
+ catch (const std::exception& e) {
+ return error("%s: Serialize or I/O error - %s", __func__, e.what());
+ }
+ FileCommit(fileout.Get());
+ fileout.fclose();
+
+ // replace existing banlist.dat, if any, with new banlist.dat.XXXX
+ if (!RenameOver(pathTmp, pathBanlist))
+ return error("%s: Rename-into-place failed", __func__);
+
+ return true;
+}
+
+bool CBanDB::Read(banmap_t& banSet)
+{
+ // open input file, and associate with CAutoFile
+ FILE *file = fopen(pathBanlist.string().c_str(), "rb");
+ CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
+ if (filein.IsNull())
+ return error("%s: Failed to open file %s", __func__, pathBanlist.string());
+
+ // use file size to size memory buffer
+ uint64_t fileSize = boost::filesystem::file_size(pathBanlist);
+ uint64_t dataSize = 0;
+ // Don't try to resize to a negative number if file is small
+ if (fileSize >= sizeof(uint256))
+ dataSize = fileSize - sizeof(uint256);
+ std::vector<unsigned char> vchData;
+ vchData.resize(dataSize);
+ uint256 hashIn;
+
+ // read data and checksum from file
+ try {
+ filein.read((char *)&vchData[0], dataSize);
+ filein >> hashIn;
+ }
+ catch (const std::exception& e) {
+ return error("%s: Deserialize or I/O error - %s", __func__, e.what());
+ }
+ filein.fclose();
+
+ CDataStream ssBanlist(vchData, SER_DISK, CLIENT_VERSION);
+
+ // verify stored checksum matches input data
+ uint256 hashTmp = Hash(ssBanlist.begin(), ssBanlist.end());
+ if (hashIn != hashTmp)
+ return error("%s: Checksum mismatch, data corrupted", __func__);
+
+ unsigned char pchMsgTmp[4];
+ try {
+ // de-serialize file header (network specific magic number) and ..
+ ssBanlist >> FLATDATA(pchMsgTmp);
+
+ // ... verify the network matches ours
+ if (memcmp(pchMsgTmp, Params().MessageStart(), sizeof(pchMsgTmp)))
+ return error("%s: Invalid network magic number", __func__);
+
+ // de-serialize address data into one CAddrMan object
+ ssBanlist >> banSet;
+ }
+ catch (const std::exception& e) {
+ return error("%s: Deserialize or I/O error - %s", __func__, e.what());
+ }
+
+ return true;
+}
+
+CAddrDB::CAddrDB()
+{
+ pathAddr = GetDataDir() / "peers.dat";
+}
+
+bool CAddrDB::Write(const CAddrMan& addr)
+{
+ // Generate random temporary filename
+ unsigned short randv = 0;
+ GetRandBytes((unsigned char*)&randv, sizeof(randv));
+ std::string tmpfn = strprintf("peers.dat.%04x", randv);
+
+ // serialize addresses, checksum data up to that point, then append csum
+ CDataStream ssPeers(SER_DISK, CLIENT_VERSION);
+ ssPeers << FLATDATA(Params().MessageStart());
+ ssPeers << addr;
+ uint256 hash = Hash(ssPeers.begin(), ssPeers.end());
+ ssPeers << hash;
+
+ // open temp output file, and associate with CAutoFile
+ boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
+ FILE *file = fopen(pathTmp.string().c_str(), "wb");
+ CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
+ if (fileout.IsNull())
+ return error("%s: Failed to open file %s", __func__, pathTmp.string());
+
+ // Write and commit header, data
+ try {
+ fileout << ssPeers;
+ }
+ catch (const std::exception& e) {
+ return error("%s: Serialize or I/O error - %s", __func__, e.what());
+ }
+ FileCommit(fileout.Get());
+ fileout.fclose();
+
+ // replace existing peers.dat, if any, with new peers.dat.XXXX
+ if (!RenameOver(pathTmp, pathAddr))
+ return error("%s: Rename-into-place failed", __func__);
+
+ return true;
+}
+
+bool CAddrDB::Read(CAddrMan& addr)
+{
+ // open input file, and associate with CAutoFile
+ FILE *file = fopen(pathAddr.string().c_str(), "rb");
+ CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
+ if (filein.IsNull())
+ return error("%s: Failed to open file %s", __func__, pathAddr.string());
+
+ // use file size to size memory buffer
+ uint64_t fileSize = boost::filesystem::file_size(pathAddr);
+ uint64_t dataSize = 0;
+ // Don't try to resize to a negative number if file is small
+ if (fileSize >= sizeof(uint256))
+ dataSize = fileSize - sizeof(uint256);
+ std::vector<unsigned char> vchData;
+ vchData.resize(dataSize);
+ uint256 hashIn;
+
+ // read data and checksum from file
+ try {
+ filein.read((char *)&vchData[0], dataSize);
+ filein >> hashIn;
+ }
+ catch (const std::exception& e) {
+ return error("%s: Deserialize or I/O error - %s", __func__, e.what());
+ }
+ filein.fclose();
+
+ CDataStream ssPeers(vchData, SER_DISK, CLIENT_VERSION);
+
+ // verify stored checksum matches input data
+ uint256 hashTmp = Hash(ssPeers.begin(), ssPeers.end());
+ if (hashIn != hashTmp)
+ return error("%s: Checksum mismatch, data corrupted", __func__);
+
+ return Read(addr, ssPeers);
+}
+
+bool CAddrDB::Read(CAddrMan& addr, CDataStream& ssPeers)
+{
+ unsigned char pchMsgTmp[4];
+ try {
+ // de-serialize file header (network specific magic number) and ..
+ ssPeers >> FLATDATA(pchMsgTmp);
+
+ // ... verify the network matches ours
+ if (memcmp(pchMsgTmp, Params().MessageStart(), sizeof(pchMsgTmp)))
+ return error("%s: Invalid network magic number", __func__);
+
+ // de-serialize address data into one CAddrMan object
+ ssPeers >> addr;
+ }
+ catch (const std::exception& e) {
+ // de-serialization has failed, ensure addrman is left in a clean state
+ addr.Clear();
+ return error("%s: Deserialize or I/O error - %s", __func__, e.what());
+ }
+
+ return true;
+}
diff --git a/src/addrdb.h b/src/addrdb.h
new file mode 100644
index 0000000000..62835a6fb4
--- /dev/null
+++ b/src/addrdb.h
@@ -0,0 +1,102 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// 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.
+
+#ifndef BITCOIN_ADDRDB_H
+#define BITCOIN_ADDRDB_H
+
+#include "serialize.h"
+
+#include <string>
+#include <map>
+#include <boost/filesystem/path.hpp>
+
+class CSubNet;
+class CAddrMan;
+class CDataStream;
+
+typedef enum BanReason
+{
+ BanReasonUnknown = 0,
+ BanReasonNodeMisbehaving = 1,
+ BanReasonManuallyAdded = 2
+} BanReason;
+
+class CBanEntry
+{
+public:
+ static const int CURRENT_VERSION=1;
+ int nVersion;
+ int64_t nCreateTime;
+ int64_t nBanUntil;
+ uint8_t banReason;
+
+ CBanEntry()
+ {
+ SetNull();
+ }
+
+ CBanEntry(int64_t nCreateTimeIn)
+ {
+ SetNull();
+ nCreateTime = nCreateTimeIn;
+ }
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(this->nVersion);
+ READWRITE(nCreateTime);
+ READWRITE(nBanUntil);
+ READWRITE(banReason);
+ }
+
+ void SetNull()
+ {
+ nVersion = CBanEntry::CURRENT_VERSION;
+ nCreateTime = 0;
+ nBanUntil = 0;
+ banReason = BanReasonUnknown;
+ }
+
+ std::string banReasonToString()
+ {
+ switch (banReason) {
+ case BanReasonNodeMisbehaving:
+ return "node misbehaving";
+ case BanReasonManuallyAdded:
+ return "manually added";
+ default:
+ return "unknown";
+ }
+ }
+};
+
+typedef std::map<CSubNet, CBanEntry> banmap_t;
+
+/** Access to the (IP) address database (peers.dat) */
+class CAddrDB
+{
+private:
+ boost::filesystem::path pathAddr;
+public:
+ CAddrDB();
+ bool Write(const CAddrMan& addr);
+ bool Read(CAddrMan& addr);
+ bool Read(CAddrMan& addr, CDataStream& ssPeers);
+};
+
+/** Access to the banlist database (banlist.dat) */
+class CBanDB
+{
+private:
+ boost::filesystem::path pathBanlist;
+public:
+ CBanDB();
+ bool Write(const banmap_t& banSet);
+ bool Read(banmap_t& banSet);
+};
+
+#endif // BITCOIN_ADDRDB_H
diff --git a/src/addrman.cpp b/src/addrman.cpp
index 078b9e1681..bfb8e94575 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -1,4 +1,5 @@
// Copyright (c) 2012 Pieter Wuille
+// 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.
@@ -196,6 +197,9 @@ void CAddrMan::MakeTried(CAddrInfo& info, int nId)
void CAddrMan::Good_(const CService& addr, int64_t nTime)
{
int nId;
+
+ nLastGood = nTime;
+
CAddrInfo* pinfo = Find(addr, &nId);
// if not found, bail out
@@ -220,7 +224,7 @@ void CAddrMan::Good_(const CService& addr, int64_t nTime)
return;
// find a bucket it is in now
- int nRnd = GetRandInt(ADDRMAN_NEW_BUCKET_COUNT);
+ int nRnd = RandomInt(ADDRMAN_NEW_BUCKET_COUNT);
int nUBucket = -1;
for (unsigned int n = 0; n < ADDRMAN_NEW_BUCKET_COUNT; n++) {
int nB = (n + nRnd) % ADDRMAN_NEW_BUCKET_COUNT;
@@ -251,6 +255,11 @@ bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimeP
int nId;
CAddrInfo* pinfo = Find(addr, &nId);
+ // Do not set a penality for a source's self-announcement
+ if (addr == source) {
+ nTimePenalty = 0;
+ }
+
if (pinfo) {
// periodically update nTime
bool fCurrentlyOnline = (GetAdjustedTime() - addr.nTime < 24 * 60 * 60);
@@ -259,7 +268,7 @@ bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimeP
pinfo->nTime = std::max((int64_t)0, addr.nTime - nTimePenalty);
// add services
- pinfo->nServices |= addr.nServices;
+ pinfo->nServices = ServiceFlags(pinfo->nServices | addr.nServices);
// do not update if no new information is present
if (!addr.nTime || (pinfo->nTime && addr.nTime <= pinfo->nTime))
@@ -277,7 +286,7 @@ bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimeP
int nFactor = 1;
for (int n = 0; n < pinfo->nRefCount; n++)
nFactor *= 2;
- if (nFactor > 1 && (GetRandInt(nFactor) != 0))
+ if (nFactor > 1 && (RandomInt(nFactor) != 0))
return false;
} else {
pinfo = Create(addr, source, &nId);
@@ -310,7 +319,7 @@ bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimeP
return fNew;
}
-void CAddrMan::Attempt_(const CService& addr, int64_t nTime)
+void CAddrMan::Attempt_(const CService& addr, bool fCountFailure, int64_t nTime)
{
CAddrInfo* pinfo = Find(addr);
@@ -326,7 +335,10 @@ void CAddrMan::Attempt_(const CService& addr, int64_t nTime)
// update info
info.nLastTry = nTime;
- info.nAttempts++;
+ if (fCountFailure && info.nLastCountAttempt < nLastGood) {
+ info.nLastCountAttempt = nTime;
+ info.nAttempts++;
+ }
}
CAddrInfo CAddrMan::Select_(bool newOnly)
@@ -339,12 +351,12 @@ CAddrInfo CAddrMan::Select_(bool newOnly)
// Use a 50% chance for choosing between tried and new table entries.
if (!newOnly &&
- (nTried > 0 && (nNew == 0 || GetRandInt(2) == 0))) {
+ (nTried > 0 && (nNew == 0 || RandomInt(2) == 0))) {
// use a tried node
double fChanceFactor = 1.0;
while (1) {
- int nKBucket = GetRandInt(ADDRMAN_TRIED_BUCKET_COUNT);
- int nKBucketPos = GetRandInt(ADDRMAN_BUCKET_SIZE);
+ int nKBucket = RandomInt(ADDRMAN_TRIED_BUCKET_COUNT);
+ int nKBucketPos = RandomInt(ADDRMAN_BUCKET_SIZE);
while (vvTried[nKBucket][nKBucketPos] == -1) {
nKBucket = (nKBucket + insecure_rand()) % ADDRMAN_TRIED_BUCKET_COUNT;
nKBucketPos = (nKBucketPos + insecure_rand()) % ADDRMAN_BUCKET_SIZE;
@@ -352,7 +364,7 @@ CAddrInfo CAddrMan::Select_(bool newOnly)
int nId = vvTried[nKBucket][nKBucketPos];
assert(mapInfo.count(nId) == 1);
CAddrInfo& info = mapInfo[nId];
- if (GetRandInt(1 << 30) < fChanceFactor * info.GetChance() * (1 << 30))
+ if (RandomInt(1 << 30) < fChanceFactor * info.GetChance() * (1 << 30))
return info;
fChanceFactor *= 1.2;
}
@@ -360,8 +372,8 @@ CAddrInfo CAddrMan::Select_(bool newOnly)
// use a new node
double fChanceFactor = 1.0;
while (1) {
- int nUBucket = GetRandInt(ADDRMAN_NEW_BUCKET_COUNT);
- int nUBucketPos = GetRandInt(ADDRMAN_BUCKET_SIZE);
+ int nUBucket = RandomInt(ADDRMAN_NEW_BUCKET_COUNT);
+ int nUBucketPos = RandomInt(ADDRMAN_BUCKET_SIZE);
while (vvNew[nUBucket][nUBucketPos] == -1) {
nUBucket = (nUBucket + insecure_rand()) % ADDRMAN_NEW_BUCKET_COUNT;
nUBucketPos = (nUBucketPos + insecure_rand()) % ADDRMAN_BUCKET_SIZE;
@@ -369,7 +381,7 @@ CAddrInfo CAddrMan::Select_(bool newOnly)
int nId = vvNew[nUBucket][nUBucketPos];
assert(mapInfo.count(nId) == 1);
CAddrInfo& info = mapInfo[nId];
- if (GetRandInt(1 << 30) < fChanceFactor * info.GetChance() * (1 << 30))
+ if (RandomInt(1 << 30) < fChanceFactor * info.GetChance() * (1 << 30))
return info;
fChanceFactor *= 1.2;
}
@@ -465,7 +477,7 @@ void CAddrMan::GetAddr_(std::vector<CAddress>& vAddr)
if (vAddr.size() >= nNodes)
break;
- int nRndPos = GetRandInt(vRandom.size() - n) + n;
+ int nRndPos = RandomInt(vRandom.size() - n) + n;
SwapRandom(n, nRndPos);
assert(mapInfo.count(vRandom[n]) == 1);
@@ -494,3 +506,25 @@ void CAddrMan::Connected_(const CService& addr, int64_t nTime)
if (nTime - info.nTime > nUpdateInterval)
info.nTime = nTime;
}
+
+void CAddrMan::SetServices_(const CService& addr, ServiceFlags nServices)
+{
+ CAddrInfo* pinfo = Find(addr);
+
+ // if not found, bail out
+ if (!pinfo)
+ return;
+
+ CAddrInfo& info = *pinfo;
+
+ // check whether we are talking about the exact same CService (including same port)
+ if (info != addr)
+ return;
+
+ // update info
+ info.nServices = nServices;
+}
+
+int CAddrMan::RandomInt(int nMax){
+ return GetRandInt(nMax);
+}
diff --git a/src/addrman.h b/src/addrman.h
index 1123caabfa..9bab39049d 100644
--- a/src/addrman.h
+++ b/src/addrman.h
@@ -1,11 +1,12 @@
// Copyright (c) 2012 Pieter Wuille
+// 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_ADDRMAN_H
#define BITCOIN_ADDRMAN_H
-#include "netbase.h"
+#include "netaddress.h"
#include "protocol.h"
#include "random.h"
#include "sync.h"
@@ -28,6 +29,9 @@ public:
//! last try whatsoever by us (memory only)
int64_t nLastTry;
+ //! last counted attempt (memory only)
+ int64_t nLastCountAttempt;
+
private:
//! where knowledge about this address first came from
CNetAddr source;
@@ -65,6 +69,7 @@ public:
{
nLastSuccess = 0;
nLastTry = 0;
+ nLastCountAttempt = 0;
nAttempts = 0;
nRefCount = 0;
fInTried = false;
@@ -175,9 +180,6 @@ private:
//! critical section to protect the inner data structures
mutable CCriticalSection cs;
- //! secret key to randomize bucket select with
- uint256 nKey;
-
//! last used nId
int nIdCount;
@@ -202,7 +204,12 @@ private:
//! list of "new" buckets
int vvNew[ADDRMAN_NEW_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE];
+ //! last time Good was called (memory only)
+ int64_t nLastGood;
+
protected:
+ //! secret key to randomize bucket select with
+ uint256 nKey;
//! Find an entry.
CAddrInfo* Find(const CNetAddr& addr, int *pnId = NULL);
@@ -230,11 +237,14 @@ protected:
bool Add_(const CAddress &addr, const CNetAddr& source, int64_t nTimePenalty);
//! Mark an entry as attempted to connect.
- void Attempt_(const CService &addr, int64_t nTime);
+ void Attempt_(const CService &addr, bool fCountFailure, int64_t nTime);
//! Select an address to connect to, if newOnly is set to true, only the new table is selected from.
CAddrInfo Select_(bool newOnly);
+ //! Wraps GetRandInt to allow tests to override RandomInt and make it determinismistic.
+ virtual int RandomInt(int nMax);
+
#ifdef DEBUG_ADDRMAN
//! Perform consistency check. Returns an error code or zero.
int Check_();
@@ -246,6 +256,9 @@ protected:
//! Mark an entry as currently-connected-to.
void Connected_(const CService &addr, int64_t nTime);
+ //! Update an entry's service bits.
+ void SetServices_(const CService &addr, ServiceFlags nServices);
+
public:
/**
* serialized format:
@@ -347,6 +360,14 @@ public:
nUBuckets ^= (1 << 30);
}
+ if (nNew > ADDRMAN_NEW_BUCKET_COUNT * ADDRMAN_BUCKET_SIZE) {
+ throw std::ios_base::failure("Corrupt CAddrMan serialization, nNew exceeds limit.");
+ }
+
+ if (nTried > ADDRMAN_TRIED_BUCKET_COUNT * ADDRMAN_BUCKET_SIZE) {
+ throw std::ios_base::failure("Corrupt CAddrMan serialization, nTried exceeds limit.");
+ }
+
// Deserialize entries from the new table.
for (int n = 0; n < nNew; n++) {
CAddrInfo &info = mapInfo[n];
@@ -447,6 +468,7 @@ public:
nIdCount = 0;
nTried = 0;
nNew = 0;
+ nLastGood = 1; //Initially at 1 so that "never" is strictly worse.
}
CAddrMan()
@@ -521,12 +543,12 @@ public:
}
//! Mark an entry as connection attempted to.
- void Attempt(const CService &addr, int64_t nTime = GetAdjustedTime())
+ void Attempt(const CService &addr, bool fCountFailure, int64_t nTime = GetAdjustedTime())
{
{
LOCK(cs);
Check();
- Attempt_(addr, nTime);
+ Attempt_(addr, fCountFailure, nTime);
Check();
}
}
@@ -569,10 +591,13 @@ public:
Check();
}
}
-
- //! Ensure that bucket placement is always the same for testing purposes.
- void MakeDeterministic(){
- nKey.SetNull(); //Do not use outside of tests.
+
+ void SetServices(const CService &addr, ServiceFlags nServices)
+ {
+ LOCK(cs);
+ Check();
+ SetServices_(addr, nServices);
+ Check();
}
};
diff --git a/src/alert.cpp b/src/alert.cpp
deleted file mode 100644
index 91e54a9178..0000000000
--- a/src/alert.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright (c) 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.
-
-#include "alert.h"
-
-#include "clientversion.h"
-#include "net.h"
-#include "pubkey.h"
-#include "timedata.h"
-#include "ui_interface.h"
-#include "util.h"
-#include "utilstrencodings.h"
-
-#include <stdint.h>
-#include <algorithm>
-#include <map>
-
-#include <boost/algorithm/string/classification.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/foreach.hpp>
-#include <boost/thread.hpp>
-
-using namespace std;
-
-map<uint256, CAlert> mapAlerts;
-CCriticalSection cs_mapAlerts;
-
-void CUnsignedAlert::SetNull()
-{
- nVersion = 1;
- nRelayUntil = 0;
- nExpiration = 0;
- nID = 0;
- nCancel = 0;
- setCancel.clear();
- nMinVer = 0;
- nMaxVer = 0;
- setSubVer.clear();
- nPriority = 0;
-
- strComment.clear();
- strStatusBar.clear();
- strReserved.clear();
-}
-
-std::string CUnsignedAlert::ToString() const
-{
- std::string strSetCancel;
- BOOST_FOREACH(int n, setCancel)
- strSetCancel += strprintf("%d ", n);
- std::string strSetSubVer;
- BOOST_FOREACH(const std::string& str, setSubVer)
- strSetSubVer += "\"" + str + "\" ";
- return strprintf(
- "CAlert(\n"
- " nVersion = %d\n"
- " nRelayUntil = %d\n"
- " nExpiration = %d\n"
- " nID = %d\n"
- " nCancel = %d\n"
- " setCancel = %s\n"
- " nMinVer = %d\n"
- " nMaxVer = %d\n"
- " setSubVer = %s\n"
- " nPriority = %d\n"
- " strComment = \"%s\"\n"
- " strStatusBar = \"%s\"\n"
- ")\n",
- nVersion,
- nRelayUntil,
- nExpiration,
- nID,
- nCancel,
- strSetCancel,
- nMinVer,
- nMaxVer,
- strSetSubVer,
- nPriority,
- strComment,
- strStatusBar);
-}
-
-void CAlert::SetNull()
-{
- CUnsignedAlert::SetNull();
- vchMsg.clear();
- vchSig.clear();
-}
-
-bool CAlert::IsNull() const
-{
- return (nExpiration == 0);
-}
-
-uint256 CAlert::GetHash() const
-{
- return Hash(this->vchMsg.begin(), this->vchMsg.end());
-}
-
-bool CAlert::IsInEffect() const
-{
- return (GetAdjustedTime() < nExpiration);
-}
-
-bool CAlert::Cancels(const CAlert& alert) const
-{
- if (!IsInEffect())
- return false; // this was a no-op before 31403
- return (alert.nID <= nCancel || setCancel.count(alert.nID));
-}
-
-bool CAlert::AppliesTo(int nVersion, const std::string& strSubVerIn) const
-{
- // TODO: rework for client-version-embedded-in-strSubVer ?
- return (IsInEffect() &&
- nMinVer <= nVersion && nVersion <= nMaxVer &&
- (setSubVer.empty() || setSubVer.count(strSubVerIn)));
-}
-
-bool CAlert::AppliesToMe() const
-{
- return AppliesTo(PROTOCOL_VERSION, FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector<std::string>()));
-}
-
-bool CAlert::RelayTo(CNode* pnode) const
-{
- if (!IsInEffect())
- return false;
- // don't relay to nodes which haven't sent their version message
- if (pnode->nVersion == 0)
- return false;
- // returns true if wasn't already contained in the set
- if (pnode->setKnown.insert(GetHash()).second)
- {
- if (AppliesTo(pnode->nVersion, pnode->strSubVer) ||
- AppliesToMe() ||
- GetAdjustedTime() < nRelayUntil)
- {
- pnode->PushMessage("alert", *this);
- return true;
- }
- }
- return false;
-}
-
-bool CAlert::CheckSignature(const std::vector<unsigned char>& alertKey) const
-{
- CPubKey key(alertKey);
- if (!key.Verify(Hash(vchMsg.begin(), vchMsg.end()), vchSig))
- return error("CAlert::CheckSignature(): verify signature failed");
-
- // Now unserialize the data
- CDataStream sMsg(vchMsg, SER_NETWORK, PROTOCOL_VERSION);
- sMsg >> *(CUnsignedAlert*)this;
- return true;
-}
-
-CAlert CAlert::getAlertByHash(const uint256 &hash)
-{
- CAlert retval;
- {
- LOCK(cs_mapAlerts);
- map<uint256, CAlert>::iterator mi = mapAlerts.find(hash);
- if(mi != mapAlerts.end())
- retval = mi->second;
- }
- return retval;
-}
-
-bool CAlert::ProcessAlert(const std::vector<unsigned char>& alertKey, bool fThread)
-{
- if (!CheckSignature(alertKey))
- return false;
- if (!IsInEffect())
- return false;
-
- // alert.nID=max is reserved for if the alert key is
- // compromised. It must have a pre-defined message,
- // must never expire, must apply to all versions,
- // and must cancel all previous
- // alerts or it will be ignored (so an attacker can't
- // send an "everything is OK, don't panic" version that
- // cannot be overridden):
- int maxInt = std::numeric_limits<int>::max();
- if (nID == maxInt)
- {
- if (!(
- nExpiration == maxInt &&
- nCancel == (maxInt-1) &&
- nMinVer == 0 &&
- nMaxVer == maxInt &&
- setSubVer.empty() &&
- nPriority == maxInt &&
- strStatusBar == "URGENT: Alert key compromised, upgrade required"
- ))
- return false;
- }
-
- {
- LOCK(cs_mapAlerts);
- // Cancel previous alerts
- for (map<uint256, CAlert>::iterator mi = mapAlerts.begin(); mi != mapAlerts.end();)
- {
- const CAlert& alert = (*mi).second;
- if (Cancels(alert))
- {
- LogPrint("alert", "cancelling alert %d\n", alert.nID);
- uiInterface.NotifyAlertChanged((*mi).first, CT_DELETED);
- mapAlerts.erase(mi++);
- }
- else if (!alert.IsInEffect())
- {
- LogPrint("alert", "expiring alert %d\n", alert.nID);
- uiInterface.NotifyAlertChanged((*mi).first, CT_DELETED);
- mapAlerts.erase(mi++);
- }
- else
- mi++;
- }
-
- // Check if this alert has been cancelled
- BOOST_FOREACH(PAIRTYPE(const uint256, CAlert)& item, mapAlerts)
- {
- const CAlert& alert = item.second;
- if (alert.Cancels(*this))
- {
- LogPrint("alert", "alert already cancelled by %d\n", alert.nID);
- return false;
- }
- }
-
- // Add to mapAlerts
- mapAlerts.insert(make_pair(GetHash(), *this));
- // Notify UI and -alertnotify if it applies to me
- if(AppliesToMe())
- {
- uiInterface.NotifyAlertChanged(GetHash(), CT_NEW);
- Notify(strStatusBar, fThread);
- }
- }
-
- LogPrint("alert", "accepted alert %d, AppliesToMe()=%d\n", nID, AppliesToMe());
- return true;
-}
-
-void
-CAlert::Notify(const std::string& strMessage, bool fThread)
-{
- std::string strCmd = GetArg("-alertnotify", "");
- if (strCmd.empty()) return;
-
- // Alert text should be plain ascii coming from a trusted source, but to
- // be safe we first strip anything not in safeChars, then add single quotes around
- // the whole string before passing it to the shell:
- std::string singleQuote("'");
- std::string safeStatus = SanitizeString(strMessage);
- safeStatus = singleQuote+safeStatus+singleQuote;
- boost::replace_all(strCmd, "%s", safeStatus);
-
- if (fThread)
- boost::thread t(runCommand, strCmd); // thread runs free
- else
- runCommand(strCmd);
-}
diff --git a/src/alert.h b/src/alert.h
deleted file mode 100644
index 4f9fff9181..0000000000
--- a/src/alert.h
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (c) 2010 Satoshi Nakamoto
-// Copyright (c) 2009-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.
-
-#ifndef BITCOIN_ALERT_H
-#define BITCOIN_ALERT_H
-
-#include "serialize.h"
-#include "sync.h"
-
-#include <map>
-#include <set>
-#include <stdint.h>
-#include <string>
-
-class CAlert;
-class CNode;
-class uint256;
-
-extern std::map<uint256, CAlert> mapAlerts;
-extern CCriticalSection cs_mapAlerts;
-
-/** Alerts are for notifying old versions if they become too obsolete and
- * need to upgrade. The message is displayed in the status bar.
- * Alert messages are broadcast as a vector of signed data. Unserializing may
- * not read the entire buffer if the alert is for a newer version, but older
- * versions can still relay the original data.
- */
-class CUnsignedAlert
-{
-public:
- int nVersion;
- int64_t nRelayUntil; // when newer nodes stop relaying to newer nodes
- int64_t nExpiration;
- int nID;
- int nCancel;
- std::set<int> setCancel;
- int nMinVer; // lowest version inclusive
- int nMaxVer; // highest version inclusive
- std::set<std::string> setSubVer; // empty matches all
- int nPriority;
-
- // Actions
- std::string strComment;
- std::string strStatusBar;
- std::string strReserved;
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(this->nVersion);
- nVersion = this->nVersion;
- READWRITE(nRelayUntil);
- READWRITE(nExpiration);
- READWRITE(nID);
- READWRITE(nCancel);
- READWRITE(setCancel);
- READWRITE(nMinVer);
- READWRITE(nMaxVer);
- READWRITE(setSubVer);
- READWRITE(nPriority);
-
- READWRITE(LIMITED_STRING(strComment, 65536));
- READWRITE(LIMITED_STRING(strStatusBar, 256));
- READWRITE(LIMITED_STRING(strReserved, 256));
- }
-
- void SetNull();
-
- std::string ToString() const;
-};
-
-/** An alert is a combination of a serialized CUnsignedAlert and a signature. */
-class CAlert : public CUnsignedAlert
-{
-public:
- std::vector<unsigned char> vchMsg;
- std::vector<unsigned char> vchSig;
-
- CAlert()
- {
- SetNull();
- }
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(vchMsg);
- READWRITE(vchSig);
- }
-
- void SetNull();
- bool IsNull() const;
- uint256 GetHash() const;
- bool IsInEffect() const;
- bool Cancels(const CAlert& alert) 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;
- bool ProcessAlert(const std::vector<unsigned char>& alertKey, bool fThread = true); // fThread means run -alertnotify in a free-running thread
- static void Notify(const std::string& strMessage, bool fThread);
-
- /*
- * Get copy of (active) alert object by hash. Returns a null alert if it is not found.
- */
- static CAlert getAlertByHash(const uint256 &hash);
-};
-
-#endif // BITCOIN_ALERT_H
diff --git a/src/amount.cpp b/src/amount.cpp
index b469181984..7b8618de33 100644
--- a/src/amount.cpp
+++ b/src/amount.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -9,20 +9,30 @@
const std::string CURRENCY_UNIT = "BTC";
-CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nSize)
+CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nBytes_)
{
+ assert(nBytes_ <= uint64_t(std::numeric_limits<int64_t>::max()));
+ int64_t nSize = int64_t(nBytes_);
+
if (nSize > 0)
- nSatoshisPerK = nFeePaid*1000/nSize;
+ nSatoshisPerK = nFeePaid * 1000 / nSize;
else
nSatoshisPerK = 0;
}
-CAmount CFeeRate::GetFee(size_t nSize) const
+CAmount CFeeRate::GetFee(size_t nBytes_) const
{
- CAmount nFee = nSatoshisPerK*nSize / 1000;
+ assert(nBytes_ <= uint64_t(std::numeric_limits<int64_t>::max()));
+ int64_t nSize = int64_t(nBytes_);
+
+ CAmount nFee = nSatoshisPerK * nSize / 1000;
- if (nFee == 0 && nSatoshisPerK > 0)
- nFee = nSatoshisPerK;
+ if (nFee == 0 && nSize != 0) {
+ if (nSatoshisPerK > 0)
+ nFee = CAmount(1);
+ if (nSatoshisPerK < 0)
+ nFee = CAmount(-1);
+ }
return nFee;
}
diff --git a/src/amount.h b/src/amount.h
index a2e4a59d1f..5e52f37f23 100644
--- a/src/amount.h
+++ b/src/amount.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -11,6 +11,7 @@
#include <stdlib.h>
#include <string>
+/** Amount in satoshis (Can be negative) */
typedef int64_t CAmount;
static const CAmount COIN = 100000000;
@@ -30,22 +31,28 @@ extern const std::string CURRENCY_UNIT;
static const CAmount MAX_MONEY = 21000000 * COIN;
inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
-/** Type-safe wrapper class for fee rates
- * (how much to pay based on transaction size)
+/**
+ * Fee rate in satoshis per kilobyte: CAmount / kB
*/
class CFeeRate
{
private:
CAmount nSatoshisPerK; // unit is satoshis-per-1,000-bytes
public:
+ /** Fee rate of 0 satoshis per kB */
CFeeRate() : nSatoshisPerK(0) { }
explicit CFeeRate(const CAmount& _nSatoshisPerK): nSatoshisPerK(_nSatoshisPerK) { }
- CFeeRate(const CAmount& nFeePaid, size_t nSize);
+ /** Constructor for a fee rate in satoshis per kB. The size in bytes must not exceed (2^63 - 1)*/
+ CFeeRate(const CAmount& nFeePaid, size_t nBytes);
CFeeRate(const CFeeRate& other) { nSatoshisPerK = other.nSatoshisPerK; }
-
- CAmount GetFee(size_t size) const; // unit returned is satoshis
- CAmount GetFeePerK() const { return GetFee(1000); } // satoshis-per-1000-bytes
-
+ /**
+ * Return the fee in satoshis for the given size in bytes.
+ */
+ CAmount GetFee(size_t nBytes) const;
+ /**
+ * Return the fee in satoshis for a size of 1000 bytes
+ */
+ CAmount GetFeePerK() const { return GetFee(1000); }
friend bool operator<(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK < b.nSatoshisPerK; }
friend bool operator>(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK > b.nSatoshisPerK; }
friend bool operator==(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK == b.nSatoshisPerK; }
diff --git a/src/arith_uint256.h b/src/arith_uint256.h
index 103c78bb8e..ba3d620158 100644
--- a/src/arith_uint256.h
+++ b/src/arith_uint256.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin developers
+// 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.
diff --git a/src/base58.cpp b/src/base58.cpp
index c809185056..d1d60a6f1d 100644
--- a/src/base58.cpp
+++ b/src/base58.cpp
@@ -1,4 +1,4 @@
-// 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.
@@ -68,26 +68,31 @@ std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
{
// Skip & count leading zeroes.
int zeroes = 0;
+ int length = 0;
while (pbegin != pend && *pbegin == 0) {
pbegin++;
zeroes++;
}
// Allocate enough space in big-endian base58 representation.
- std::vector<unsigned char> b58((pend - pbegin) * 138 / 100 + 1); // log(256) / log(58), rounded up.
+ int size = (pend - pbegin) * 138 / 100 + 1; // log(256) / log(58), rounded up.
+ std::vector<unsigned char> b58(size);
// Process the bytes.
while (pbegin != pend) {
int carry = *pbegin;
+ int i = 0;
// Apply "b58 = b58 * 256 + ch".
- for (std::vector<unsigned char>::reverse_iterator it = b58.rbegin(); it != b58.rend(); it++) {
+ for (std::vector<unsigned char>::reverse_iterator it = b58.rbegin(); (carry != 0 || i < length) && (it != b58.rend()); it++, i++) {
carry += 256 * (*it);
*it = carry % 58;
carry /= 58;
}
+
assert(carry == 0);
+ length = i;
pbegin++;
}
// Skip leading zeroes in base58 result.
- std::vector<unsigned char>::iterator it = b58.begin();
+ std::vector<unsigned char>::iterator it = b58.begin() + (size - length);
while (it != b58.end() && *it == 0)
it++;
// Translate the result into a string.
@@ -172,7 +177,7 @@ bool CBase58Data::SetString(const char* psz, unsigned int nVersionBytes)
vchData.resize(vchTemp.size() - nVersionBytes);
if (!vchData.empty())
memcpy(&vchData[0], &vchTemp[nVersionBytes], vchData.size());
- memory_cleanse(&vchTemp[0], vchData.size());
+ memory_cleanse(&vchTemp[0], vchTemp.size());
return true;
}
diff --git a/src/base58.h b/src/base58.h
index 90014b9496..cccebc9e0e 100644
--- a/src/base58.h
+++ b/src/base58.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -164,7 +164,7 @@ public:
CBitcoinExtKeyBase() {}
};
-typedef CBitcoinExtKeyBase<CExtKey, 74, CChainParams::EXT_SECRET_KEY> CBitcoinExtKey;
-typedef CBitcoinExtKeyBase<CExtPubKey, 74, CChainParams::EXT_PUBLIC_KEY> CBitcoinExtPubKey;
+typedef CBitcoinExtKeyBase<CExtKey, BIP32_EXTKEY_SIZE, CChainParams::EXT_SECRET_KEY> CBitcoinExtKey;
+typedef CBitcoinExtKeyBase<CExtPubKey, BIP32_EXTKEY_SIZE, CChainParams::EXT_PUBLIC_KEY> CBitcoinExtPubKey;
#endif // BITCOIN_BASE58_H
diff --git a/src/bench/base58.cpp b/src/bench/base58.cpp
new file mode 100644
index 0000000000..1279c3e7df
--- /dev/null
+++ b/src/bench/base58.cpp
@@ -0,0 +1,56 @@
+// Copyright (c) 2016 the Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "bench.h"
+
+#include "main.h"
+#include "base58.h"
+
+#include <vector>
+#include <string>
+
+
+static void Base58Encode(benchmark::State& state)
+{
+ unsigned char buff[32] = {
+ 17, 79, 8, 99, 150, 189, 208, 162, 22, 23, 203, 163, 36, 58, 147,
+ 227, 139, 2, 215, 100, 91, 38, 11, 141, 253, 40, 117, 21, 16, 90,
+ 200, 24
+ };
+ unsigned char* b = buff;
+ while (state.KeepRunning()) {
+ EncodeBase58(b, b + 32);
+ }
+}
+
+
+static void Base58CheckEncode(benchmark::State& state)
+{
+ unsigned char buff[32] = {
+ 17, 79, 8, 99, 150, 189, 208, 162, 22, 23, 203, 163, 36, 58, 147,
+ 227, 139, 2, 215, 100, 91, 38, 11, 141, 253, 40, 117, 21, 16, 90,
+ 200, 24
+ };
+ unsigned char* b = buff;
+ std::vector<unsigned char> vch;
+ vch.assign(b, b + 32);
+ while (state.KeepRunning()) {
+ EncodeBase58Check(vch);
+ }
+}
+
+
+static void Base58Decode(benchmark::State& state)
+{
+ const char* addr = "17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem";
+ std::vector<unsigned char> vch;
+ while (state.KeepRunning()) {
+ DecodeBase58(addr, vch);
+ }
+}
+
+
+BENCHMARK(Base58Encode);
+BENCHMARK(Base58CheckEncode);
+BENCHMARK(Base58Decode);
diff --git a/src/bench/bench.cpp b/src/bench/bench.cpp
index 6ee3cdc27a..227546a7a7 100644
--- a/src/bench/bench.cpp
+++ b/src/bench/bench.cpp
@@ -5,6 +5,7 @@
#include "bench.h"
#include <iostream>
+#include <iomanip>
#include <sys/time.h>
using namespace benchmark;
@@ -25,7 +26,7 @@ BenchRunner::BenchRunner(std::string name, BenchFunction func)
void
BenchRunner::RunAll(double elapsedTimeForOne)
{
- std::cout << "Benchmark" << "," << "count" << "," << "min" << "," << "max" << "," << "average" << "\n";
+ std::cout << "#Benchmark" << "," << "count" << "," << "min" << "," << "max" << "," << "average" << "\n";
for (std::map<std::string,BenchFunction>::iterator it = benchmarks.begin();
it != benchmarks.end(); ++it) {
@@ -38,22 +39,34 @@ BenchRunner::RunAll(double elapsedTimeForOne)
bool State::KeepRunning()
{
+ if (count & countMask) {
+ ++count;
+ return true;
+ }
double now;
if (count == 0) {
- beginTime = now = gettimedouble();
+ lastTime = beginTime = now = gettimedouble();
}
else {
- // timeCheckCount is used to avoid calling gettime most of the time,
- // so benchmarks that run very quickly get consistent results.
- if ((count+1)%timeCheckCount != 0) {
- ++count;
- return true; // keep going
- }
now = gettimedouble();
- double elapsedOne = (now - lastTime)/timeCheckCount;
+ double elapsed = now - lastTime;
+ double elapsedOne = elapsed * countMaskInv;
if (elapsedOne < minTime) minTime = elapsedOne;
if (elapsedOne > maxTime) maxTime = elapsedOne;
- if (elapsedOne*timeCheckCount < maxElapsed/16) timeCheckCount *= 2;
+ if (elapsed*128 < maxElapsed) {
+ // If the execution was much too fast (1/128th of maxElapsed), increase the count mask by 8x and restart timing.
+ // The restart avoids including the overhead of this code in the measurement.
+ countMask = ((countMask<<3)|7) & ((1LL<<60)-1);
+ countMaskInv = 1./(countMask+1);
+ count = 0;
+ minTime = std::numeric_limits<double>::max();
+ maxTime = std::numeric_limits<double>::min();
+ return true;
+ }
+ if (elapsed*16 < maxElapsed) {
+ countMask = ((countMask<<1)|1) & ((1LL<<60)-1);
+ countMaskInv = 1./(countMask+1);
+ }
}
lastTime = now;
++count;
@@ -64,7 +77,7 @@ bool State::KeepRunning()
// Output results
double average = (now-beginTime)/count;
- std::cout << name << "," << count << "," << minTime << "," << maxTime << "," << average << "\n";
+ std::cout << std::fixed << std::setprecision(15) << name << "," << count << "," << minTime << "," << maxTime << "," << average << "\n";
return false;
}
diff --git a/src/bench/bench.h b/src/bench/bench.h
index 5ce13c642b..f13b145aaf 100644
--- a/src/bench/bench.h
+++ b/src/bench/bench.h
@@ -40,14 +40,15 @@ namespace benchmark {
std::string name;
double maxElapsed;
double beginTime;
- double lastTime, minTime, maxTime;
+ double lastTime, minTime, maxTime, countMaskInv;
int64_t count;
- int64_t timeCheckCount;
+ int64_t countMask;
public:
State(std::string _name, double _maxElapsed) : name(_name), maxElapsed(_maxElapsed), count(0) {
minTime = std::numeric_limits<double>::max();
maxTime = std::numeric_limits<double>::min();
- timeCheckCount = 1;
+ countMask = 1;
+ countMaskInv = 1./(countMask + 1);
}
bool KeepRunning();
};
diff --git a/src/bench/crypto_hash.cpp b/src/bench/crypto_hash.cpp
new file mode 100644
index 0000000000..168006154f
--- /dev/null
+++ b/src/bench/crypto_hash.cpp
@@ -0,0 +1,78 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <iostream>
+
+#include "bench.h"
+#include "bloom.h"
+#include "hash.h"
+#include "uint256.h"
+#include "utiltime.h"
+#include "crypto/ripemd160.h"
+#include "crypto/sha1.h"
+#include "crypto/sha256.h"
+#include "crypto/sha512.h"
+
+/* Number of bytes to hash per iteration */
+static const uint64_t BUFFER_SIZE = 1000*1000;
+
+static void RIPEMD160(benchmark::State& state)
+{
+ uint8_t hash[CRIPEMD160::OUTPUT_SIZE];
+ std::vector<uint8_t> in(BUFFER_SIZE,0);
+ while (state.KeepRunning())
+ CRIPEMD160().Write(begin_ptr(in), in.size()).Finalize(hash);
+}
+
+static void SHA1(benchmark::State& state)
+{
+ uint8_t hash[CSHA1::OUTPUT_SIZE];
+ std::vector<uint8_t> in(BUFFER_SIZE,0);
+ while (state.KeepRunning())
+ CSHA1().Write(begin_ptr(in), in.size()).Finalize(hash);
+}
+
+static void SHA256(benchmark::State& state)
+{
+ uint8_t hash[CSHA256::OUTPUT_SIZE];
+ std::vector<uint8_t> in(BUFFER_SIZE,0);
+ while (state.KeepRunning())
+ CSHA256().Write(begin_ptr(in), in.size()).Finalize(hash);
+}
+
+static void SHA256_32b(benchmark::State& state)
+{
+ std::vector<uint8_t> in(32,0);
+ while (state.KeepRunning()) {
+ for (int i = 0; i < 1000000; i++) {
+ CSHA256().Write(begin_ptr(in), in.size()).Finalize(&in[0]);
+ }
+ }
+}
+
+static void SHA512(benchmark::State& state)
+{
+ uint8_t hash[CSHA512::OUTPUT_SIZE];
+ std::vector<uint8_t> in(BUFFER_SIZE,0);
+ while (state.KeepRunning())
+ CSHA512().Write(begin_ptr(in), in.size()).Finalize(hash);
+}
+
+static void SipHash_32b(benchmark::State& state)
+{
+ uint256 x;
+ while (state.KeepRunning()) {
+ for (int i = 0; i < 1000000; i++) {
+ *((uint64_t*)x.begin()) = SipHashUint256(0, i, x);
+ }
+ }
+}
+
+BENCHMARK(RIPEMD160);
+BENCHMARK(SHA1);
+BENCHMARK(SHA256);
+BENCHMARK(SHA512);
+
+BENCHMARK(SHA256_32b);
+BENCHMARK(SipHash_32b);
diff --git a/src/bench/rollingbloom.cpp b/src/bench/rollingbloom.cpp
new file mode 100644
index 0000000000..73c02cf718
--- /dev/null
+++ b/src/bench/rollingbloom.cpp
@@ -0,0 +1,43 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <iostream>
+
+#include "bench.h"
+#include "bloom.h"
+#include "utiltime.h"
+
+static void RollingBloom(benchmark::State& state)
+{
+ CRollingBloomFilter filter(120000, 0.000001);
+ std::vector<unsigned char> data(32);
+ uint32_t count = 0;
+ uint32_t nEntriesPerGeneration = (120000 + 1) / 2;
+ uint32_t countnow = 0;
+ uint64_t match = 0;
+ while (state.KeepRunning()) {
+ count++;
+ data[0] = count;
+ data[1] = count >> 8;
+ data[2] = count >> 16;
+ data[3] = count >> 24;
+ if (countnow == nEntriesPerGeneration) {
+ int64_t b = GetTimeMicros();
+ filter.insert(data);
+ int64_t e = GetTimeMicros();
+ std::cout << "RollingBloom-refresh,1," << (e-b)*0.000001 << "," << (e-b)*0.000001 << "," << (e-b)*0.000001 << "\n";
+ countnow = 0;
+ } else {
+ filter.insert(data);
+ }
+ countnow++;
+ data[0] = count >> 24;
+ data[1] = count >> 16;
+ data[2] = count >> 8;
+ data[3] = count;
+ match += filter.contains(data);
+ }
+}
+
+BENCHMARK(RollingBloom);
diff --git a/src/bitcoin-cli-res.rc b/src/bitcoin-cli-res.rc
index 1e4aa609bb..58f8f1e8a2 100644
--- a/src/bitcoin-cli-res.rc
+++ b/src/bitcoin-cli-res.rc
@@ -17,7 +17,7 @@ BEGIN
BLOCK "040904E4" // U.S. English - multilingual (hex)
BEGIN
VALUE "CompanyName", "Bitcoin"
- VALUE "FileDescription", "bitcoin-cli (JSON-RPC client for Bitcoin Core)"
+ VALUE "FileDescription", "bitcoin-cli (JSON-RPC client for " PACKAGE_NAME ")"
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", "bitcoin-cli"
VALUE "LegalCopyright", COPYRIGHT_STR
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp
index 2fa91e4e77..9d4c4e53bd 100644
--- a/src/bitcoin-cli.cpp
+++ b/src/bitcoin-cli.cpp
@@ -1,12 +1,16 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "chainparamsbase.h"
#include "clientversion.h"
-#include "rpcclient.h"
-#include "rpcprotocol.h"
+#include "rpc/client.h"
+#include "rpc/protocol.h"
#include "util.h"
#include "utilstrencodings.h"
@@ -39,6 +43,7 @@ std::string HelpMessageCli()
strUsage += HelpMessageOpt("-rpcuser=<user>", _("Username for JSON-RPC connections"));
strUsage += HelpMessageOpt("-rpcpassword=<pw>", _("Password for JSON-RPC connections"));
strUsage += HelpMessageOpt("-rpcclienttimeout=<n>", strprintf(_("Timeout during HTTP requests (default: %d)"), DEFAULT_HTTP_CLIENT_TIMEOUT));
+ strUsage += HelpMessageOpt("-stdin", _("Read extra arguments from standard input, one per line until EOF/Ctrl-D (recommended for sensitive information such as passphrases)"));
return strUsage;
}
@@ -69,10 +74,10 @@ static bool AppInitRPC(int argc, char* argv[])
//
ParseParameters(argc, argv);
if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help") || mapArgs.count("-version")) {
- std::string strUsage = _("Bitcoin Core RPC client version") + " " + FormatFullVersion() + "\n";
+ std::string strUsage = strprintf(_("%s RPC client version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n";
if (!mapArgs.count("-version")) {
strUsage += "\n" + _("Usage:") + "\n" +
- " bitcoin-cli [options] <command> [params] " + _("Send command to Bitcoin Core") + "\n" +
+ " bitcoin-cli [options] <command> [params] " + strprintf(_("Send command to %s"), _(PACKAGE_NAME)) + "\n" +
" bitcoin-cli [options] help " + _("List commands") + "\n" +
" bitcoin-cli [options] help <command> " + _("Get help for a command") + "\n";
@@ -87,7 +92,7 @@ static bool AppInitRPC(int argc, char* argv[])
return false;
}
try {
- ReadConfigFile(mapArgs, mapMultiArgs);
+ ReadConfigFile(GetArg("-conf", BITCOIN_CONF_FILENAME), mapArgs, mapMultiArgs);
} catch (const std::exception& e) {
fprintf(stderr,"Error reading configuration file: %s\n", e.what());
return false;
@@ -111,17 +116,42 @@ static bool AppInitRPC(int argc, char* argv[])
/** Reply structure for request_done to fill in */
struct HTTPReply
{
+ HTTPReply(): status(0), error(-1) {}
+
int status;
+ int error;
std::string body;
};
+const char *http_errorstring(int code)
+{
+ switch(code) {
+#if LIBEVENT_VERSION_NUMBER >= 0x02010300
+ case EVREQ_HTTP_TIMEOUT:
+ return "timeout reached";
+ case EVREQ_HTTP_EOF:
+ return "EOF reached";
+ case EVREQ_HTTP_INVALID_HEADER:
+ return "error while reading header, or invalid header";
+ case EVREQ_HTTP_BUFFER_ERROR:
+ return "error encountered while reading or writing";
+ case EVREQ_HTTP_REQUEST_CANCEL:
+ return "request was canceled";
+ case EVREQ_HTTP_DATA_TOO_LONG:
+ return "response body is larger than allowed";
+#endif
+ default:
+ return "unknown";
+ }
+}
+
static void http_request_done(struct evhttp_request *req, void *ctx)
{
HTTPReply *reply = static_cast<HTTPReply*>(ctx);
if (req == NULL) {
- /* If req is NULL, it means an error occurred while connecting, but
- * I'm not sure how to find out which one. We also don't really care.
+ /* If req is NULL, it means an error occurred while connecting: the
+ * error code will have been passed to http_error_cb.
*/
reply->status = 0;
return;
@@ -140,6 +170,14 @@ static void http_request_done(struct evhttp_request *req, void *ctx)
}
}
+#if LIBEVENT_VERSION_NUMBER >= 0x02010300
+static void http_error_cb(enum evhttp_request_error err, void *ctx)
+{
+ HTTPReply *reply = static_cast<HTTPReply*>(ctx);
+ reply->error = err;
+}
+#endif
+
UniValue CallRPC(const string& strMethod, const UniValue& params)
{
std::string host = GetArg("-rpcconnect", DEFAULT_RPCCONNECT);
@@ -160,6 +198,9 @@ UniValue CallRPC(const string& strMethod, const UniValue& params)
struct evhttp_request *req = evhttp_request_new(http_request_done, (void*)&response); // TODO RAII
if (req == NULL)
throw runtime_error("create http request failed");
+#if LIBEVENT_VERSION_NUMBER >= 0x02010300
+ evhttp_request_set_error_cb(req, http_error_cb);
+#endif
// Get credentials
std::string strRPCUserColonPass;
@@ -168,7 +209,7 @@ UniValue CallRPC(const string& strMethod, const UniValue& params)
if (!GetAuthCookie(&strRPCUserColonPass)) {
throw runtime_error(strprintf(
_("Could not locate RPC credentials. No authentication cookie could be found, and no rpcpassword is set in the configuration file (%s)"),
- GetConfigFile().string().c_str()));
+ GetConfigFile(GetArg("-conf", BITCOIN_CONF_FILENAME)).string().c_str()));
}
} else {
@@ -199,7 +240,7 @@ UniValue CallRPC(const string& strMethod, const UniValue& params)
event_base_free(base);
if (response.status == 0)
- throw CConnectionFailed("couldn't connect to server");
+ throw CConnectionFailed(strprintf("couldn't connect to server (%d %s)", response.error, http_errorstring(response.error)));
else if (response.status == HTTP_UNAUTHORIZED)
throw runtime_error("incorrect rpcuser or rpcpassword (authorization failed)");
else if (response.status >= 400 && response.status != HTTP_BAD_REQUEST && response.status != HTTP_NOT_FOUND && response.status != HTTP_INTERNAL_SERVER_ERROR)
@@ -228,15 +269,17 @@ int CommandLineRPC(int argc, char *argv[])
argc--;
argv++;
}
-
- // Method
- if (argc < 2)
- throw runtime_error("too few parameters");
- string strMethod = argv[1];
-
- // Parameters default to strings
- std::vector<std::string> strParams(&argv[2], &argv[argc]);
- UniValue params = RPCConvertValues(strMethod, strParams);
+ std::vector<std::string> args = std::vector<std::string>(&argv[1], &argv[argc]);
+ if (GetBoolArg("-stdin", false)) {
+ // Read one arg per line from stdin and append
+ std::string line;
+ while (std::getline(std::cin,line))
+ args.push_back(line);
+ }
+ if (args.size() < 1)
+ throw runtime_error("too few parameters (need at least command)");
+ std::string strMethod = args[0];
+ UniValue params = RPCConvertValues(strMethod, std::vector<std::string>(args.begin()+1, args.end()));
// Execute and handle connection failures with -rpcwait
const bool fWait = GetBoolArg("-rpcwait", false);
@@ -307,7 +350,7 @@ int main(int argc, char* argv[])
SetupEnvironment();
if (!SetupNetworking()) {
fprintf(stderr, "Error: Initializing networking failed\n");
- exit(1);
+ return EXIT_FAILURE;
}
try {
diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp
index 9f8b2b98af..cb863bda19 100644
--- a/src/bitcoin-tx.cpp
+++ b/src/bitcoin-tx.cpp
@@ -1,7 +1,11 @@
-// 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "base58.h"
#include "clientversion.h"
#include "coins.h"
@@ -47,7 +51,7 @@ static bool AppInitRawTx(int argc, char* argv[])
if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help"))
{
// First part of help message is specific to this utility
- std::string strUsage = _("Bitcoin Core bitcoin-tx utility version") + " " + FormatFullVersion() + "\n\n" +
+ std::string strUsage = strprintf(_("%s bitcoin-tx utility version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n\n" +
_("Usage:") + "\n" +
" bitcoin-tx [options] <hex-tx> [commands] " + _("Update hex-encoded bitcoin transaction") + "\n" +
" bitcoin-tx [options] -create [commands] " + _("Create hex-encoded bitcoin transaction") + "\n" +
@@ -67,7 +71,7 @@ static bool AppInitRawTx(int argc, char* argv[])
strUsage = HelpMessageGroup(_("Commands:"));
strUsage += HelpMessageOpt("delin=N", _("Delete input N from TX"));
strUsage += HelpMessageOpt("delout=N", _("Delete output N from TX"));
- strUsage += HelpMessageOpt("in=TXID:VOUT", _("Add input to TX"));
+ strUsage += HelpMessageOpt("in=TXID:VOUT(:SEQUENCE_NUMBER)", _("Add input to TX"));
strUsage += HelpMessageOpt("locktime=N", _("Set TX lock time to N"));
strUsage += HelpMessageOpt("nversion=N", _("Set TX version to N"));
strUsage += HelpMessageOpt("outaddr=VALUE:ADDRESS", _("Add address-based output to TX"));
@@ -177,30 +181,35 @@ static void MutateTxLocktime(CMutableTransaction& tx, const string& cmdVal)
static void MutateTxAddInput(CMutableTransaction& tx, const string& strInput)
{
+ std::vector<std::string> vStrInputParts;
+ boost::split(vStrInputParts, strInput, boost::is_any_of(":"));
+
// separate TXID:VOUT in string
- size_t pos = strInput.find(':');
- if ((pos == string::npos) ||
- (pos == 0) ||
- (pos == (strInput.size() - 1)))
+ if (vStrInputParts.size()<2)
throw runtime_error("TX input missing separator");
// extract and validate TXID
- string strTxid = strInput.substr(0, pos);
+ string strTxid = vStrInputParts[0];
if ((strTxid.size() != 64) || !IsHex(strTxid))
throw runtime_error("invalid TX input txid");
uint256 txid(uint256S(strTxid));
static const unsigned int minTxOutSz = 9;
- static const unsigned int maxVout = MAX_BLOCK_SIZE / minTxOutSz;
+ static const unsigned int maxVout = MAX_BLOCK_BASE_SIZE / minTxOutSz;
// extract and validate vout
- string strVout = strInput.substr(pos + 1, string::npos);
+ string strVout = vStrInputParts[1];
int vout = atoi(strVout);
if ((vout < 0) || (vout > (int)maxVout))
throw runtime_error("invalid TX input vout");
+ // extract the optional sequence number
+ uint32_t nSequenceIn=std::numeric_limits<unsigned int>::max();
+ if (vStrInputParts.size() > 2)
+ nSequenceIn = std::stoul(vStrInputParts[2]);
+
// append to transaction input list
- CTxIn txin(txid, vout);
+ CTxIn txin(txid, vout, CScript(), nSequenceIn);
tx.vin.push_back(txin);
}
@@ -354,6 +363,18 @@ vector<unsigned char> ParseHexUO(map<string,UniValue>& o, string strKey)
return ParseHexUV(o[strKey], strKey);
}
+static CAmount AmountFromValue(const UniValue& value)
+{
+ if (!value.isNum() && !value.isStr())
+ throw runtime_error("Amount is not a number or string");
+ CAmount amount;
+ if (!ParseFixedPoint(value.getValStr(), 8, &amount))
+ throw runtime_error("Invalid amount");
+ if (!MoneyRange(amount))
+ throw runtime_error("Amount out of range");
+ return amount;
+}
+
static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
{
int nHashType = SIGHASH_ALL;
@@ -374,10 +395,8 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
if (!registers.count("privatekeys"))
throw runtime_error("privatekeys register variable must be set.");
- bool fGivenKeys = false;
CBasicKeyStore tempKeystore;
UniValue keysObj = registers["privatekeys"];
- fGivenKeys = true;
for (unsigned int kidx = 0; kidx < keysObj.size(); kidx++) {
if (!keysObj[kidx].isStr())
@@ -425,12 +444,15 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
if ((unsigned int)nOut >= coins->vout.size())
coins->vout.resize(nOut+1);
coins->vout[nOut].scriptPubKey = scriptPubKey;
- coins->vout[nOut].nValue = 0; // we don't know the actual output value
+ coins->vout[nOut].nValue = 0;
+ if (prevOut.exists("amount")) {
+ coins->vout[nOut].nValue = AmountFromValue(prevOut["amount"]);
+ }
}
// if redeemScript given and private keys given,
// add redeemScript to the tempKeystore so it can be signed:
- if (fGivenKeys && scriptPubKey.IsPayToScriptHash() &&
+ if ((scriptPubKey.IsPayToScriptHash() || scriptPubKey.IsPayToWitnessScriptHash()) &&
prevOut.exists("redeemScript")) {
UniValue v = prevOut["redeemScript"];
vector<unsigned char> rsData(ParseHexUV(v, "redeemScript"));
@@ -453,17 +475,19 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
continue;
}
const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey;
+ const CAmount& amount = coins->vout[txin.prevout.n].nValue;
- txin.scriptSig.clear();
+ SignatureData sigdata;
// Only sign SIGHASH_SINGLE if there's a corresponding output:
if (!fHashSingle || (i < mergedTx.vout.size()))
- SignSignature(keystore, prevPubKey, mergedTx, i, nHashType);
+ ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata);
// ... and merge in other signatures:
- BOOST_FOREACH(const CTransaction& 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)))
+ BOOST_FOREACH(const CTransaction& txv, txVariants)
+ sigdata = CombineSignatures(prevPubKey, MutableTransactionSignatureChecker(&mergedTx, i, amount), sigdata, DataFromTransaction(txv, i));
+ UpdateTransaction(mergedTx, i, sigdata);
+
+ if (!VerifyScript(txin.scriptSig, prevPubKey, mergedTx.wit.vtxinwit.size() > i ? &mergedTx.wit.vtxinwit[i].scriptWitness : NULL, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i, amount)))
fComplete = false;
}
@@ -491,7 +515,7 @@ public:
static void MutateTx(CMutableTransaction& tx, const string& command,
const string& commandVal)
{
- boost::scoped_ptr<Secp256k1Init> ecc;
+ std::unique_ptr<Secp256k1Init> ecc;
if (command == "nversion")
MutateTxVersion(tx, commandVal);
diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp
index 4cee2d3cf0..351463c256 100644
--- a/src/bitcoind.cpp
+++ b/src/bitcoind.cpp
@@ -1,18 +1,23 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "chainparams.h"
#include "clientversion.h"
-#include "rpcserver.h"
+#include "compat.h"
+#include "rpc/server.h"
#include "init.h"
#include "noui.h"
#include "scheduler.h"
#include "util.h"
#include "httpserver.h"
#include "httprpc.h"
-#include "rpcserver.h"
+#include "utilstrencodings.h"
#include <boost/algorithm/string/predicate.hpp>
#include <boost/filesystem.hpp>
@@ -36,8 +41,6 @@
* Use the buttons <code>Namespaces</code>, <code>Classes</code> or <code>Files</code> at the top of the page to start navigating the code.
*/
-static bool fDaemon;
-
void WaitForShutdown(boost::thread_group* threadGroup)
{
bool fShutdown = ShutdownRequested();
@@ -74,16 +77,16 @@ bool AppInit(int argc, char* argv[])
// Process help and version before taking care about datadir
if (mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help") || mapArgs.count("-version"))
{
- std::string strUsage = _("Bitcoin Core Daemon") + " " + _("version") + " " + FormatFullVersion() + "\n";
+ std::string strUsage = strprintf(_("%s Daemon"), _(PACKAGE_NAME)) + " " + _("version") + " " + FormatFullVersion() + "\n";
if (mapArgs.count("-version"))
{
- strUsage += LicenseInfo();
+ strUsage += FormatParagraph(LicenseInfo());
}
else
{
strUsage += "\n" + _("Usage:") + "\n" +
- " bitcoind [options] " + _("Start Bitcoin Core Daemon") + "\n";
+ " bitcoind [options] " + strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n";
strUsage += "\n" + HelpMessage(HMM_BITCOIND);
}
@@ -101,7 +104,7 @@ bool AppInit(int argc, char* argv[])
}
try
{
- ReadConfigFile(mapArgs, mapMultiArgs);
+ ReadConfigFile(GetArg("-conf", BITCOIN_CONF_FILENAME), mapArgs, mapMultiArgs);
} catch (const std::exception& e) {
fprintf(stderr,"Error reading configuration file: %s\n", e.what());
return false;
@@ -125,30 +128,21 @@ bool AppInit(int argc, char* argv[])
fprintf(stderr, "Error: There is no RPC client functionality in bitcoind anymore. Use the bitcoin-cli utility instead.\n");
exit(1);
}
-#ifndef WIN32
- fDaemon = GetBoolArg("-daemon", false);
- if (fDaemon)
+ if (GetBoolArg("-daemon", false))
{
+#if HAVE_DECL_DAEMON
fprintf(stdout, "Bitcoin server starting\n");
// Daemonize
- pid_t pid = fork();
- if (pid < 0)
- {
- fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);
+ if (daemon(1, 0)) { // don't chdir (1), do close FDs (0)
+ fprintf(stderr, "Error: daemon() failed: %s\n", strerror(errno));
return false;
}
- if (pid > 0) // Parent process, pid is child process id
- {
- return true;
- }
- // Child process falls through to rest of initialization
-
- pid_t sid = setsid();
- if (sid < 0)
- fprintf(stderr, "Error: setsid() returned %d errno %d\n", sid, errno);
+#else
+ fprintf(stderr, "Error: -daemon is not supported on this operating system\n");
+ return false;
+#endif // HAVE_DECL_DAEMON
}
-#endif
SoftSetBoolArg("-server", true);
// Set this early so that parameter interactions go to console
diff --git a/src/blockencodings.cpp b/src/blockencodings.cpp
new file mode 100644
index 0000000000..93d3fa372b
--- /dev/null
+++ b/src/blockencodings.cpp
@@ -0,0 +1,180 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "blockencodings.h"
+#include "consensus/consensus.h"
+#include "consensus/validation.h"
+#include "chainparams.h"
+#include "hash.h"
+#include "random.h"
+#include "streams.h"
+#include "txmempool.h"
+#include "main.h"
+#include "util.h"
+
+#include <unordered_map>
+
+#define MIN_TRANSACTION_BASE_SIZE (::GetSerializeSize(CTransaction(), SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS))
+
+CBlockHeaderAndShortTxIDs::CBlockHeaderAndShortTxIDs(const CBlock& block, bool fUseWTXID) :
+ nonce(GetRand(std::numeric_limits<uint64_t>::max())),
+ shorttxids(block.vtx.size() - 1), prefilledtxn(1), header(block) {
+ FillShortTxIDSelector();
+ //TODO: Use our mempool prior to block acceptance to predictively fill more than just the coinbase
+ prefilledtxn[0] = {0, block.vtx[0]};
+ for (size_t i = 1; i < block.vtx.size(); i++) {
+ const CTransaction& tx = block.vtx[i];
+ shorttxids[i - 1] = GetShortID(fUseWTXID ? tx.GetWitnessHash() : tx.GetHash());
+ }
+}
+
+void CBlockHeaderAndShortTxIDs::FillShortTxIDSelector() const {
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << header << nonce;
+ CSHA256 hasher;
+ hasher.Write((unsigned char*)&(*stream.begin()), stream.end() - stream.begin());
+ uint256 shorttxidhash;
+ hasher.Finalize(shorttxidhash.begin());
+ shorttxidk0 = shorttxidhash.GetUint64(0);
+ shorttxidk1 = shorttxidhash.GetUint64(1);
+}
+
+uint64_t CBlockHeaderAndShortTxIDs::GetShortID(const uint256& txhash) const {
+ static_assert(SHORTTXIDS_LENGTH == 6, "shorttxids calculation assumes 6-byte shorttxids");
+ return SipHashUint256(shorttxidk0, shorttxidk1, txhash) & 0xffffffffffffL;
+}
+
+
+
+ReadStatus PartiallyDownloadedBlock::InitData(const CBlockHeaderAndShortTxIDs& cmpctblock) {
+ if (cmpctblock.header.IsNull() || (cmpctblock.shorttxids.empty() && cmpctblock.prefilledtxn.empty()))
+ return READ_STATUS_INVALID;
+ if (cmpctblock.shorttxids.size() + cmpctblock.prefilledtxn.size() > MAX_BLOCK_BASE_SIZE / MIN_TRANSACTION_BASE_SIZE)
+ return READ_STATUS_INVALID;
+
+ assert(header.IsNull() && txn_available.empty());
+ header = cmpctblock.header;
+ txn_available.resize(cmpctblock.BlockTxCount());
+
+ int32_t lastprefilledindex = -1;
+ for (size_t i = 0; i < cmpctblock.prefilledtxn.size(); i++) {
+ if (cmpctblock.prefilledtxn[i].tx.IsNull())
+ return READ_STATUS_INVALID;
+
+ lastprefilledindex += cmpctblock.prefilledtxn[i].index + 1; //index is a uint16_t, so cant overflow here
+ if (lastprefilledindex > std::numeric_limits<uint16_t>::max())
+ return READ_STATUS_INVALID;
+ if ((uint32_t)lastprefilledindex > cmpctblock.shorttxids.size() + i) {
+ // If we are inserting a tx at an index greater than our full list of shorttxids
+ // plus the number of prefilled txn we've inserted, then we have txn for which we
+ // have neither a prefilled txn or a shorttxid!
+ return READ_STATUS_INVALID;
+ }
+ txn_available[lastprefilledindex] = std::make_shared<CTransaction>(cmpctblock.prefilledtxn[i].tx);
+ }
+ prefilled_count = cmpctblock.prefilledtxn.size();
+
+ // Calculate map of txids -> positions and check mempool to see what we have (or don't)
+ // Because well-formed cmpctblock messages will have a (relatively) uniform distribution
+ // of short IDs, any highly-uneven distribution of elements can be safely treated as a
+ // READ_STATUS_FAILED.
+ std::unordered_map<uint64_t, uint16_t> shorttxids(cmpctblock.shorttxids.size());
+ uint16_t index_offset = 0;
+ for (size_t i = 0; i < cmpctblock.shorttxids.size(); i++) {
+ while (txn_available[i + index_offset])
+ index_offset++;
+ shorttxids[cmpctblock.shorttxids[i]] = i + index_offset;
+ // To determine the chance that the number of entries in a bucket exceeds N,
+ // we use the fact that the number of elements in a single bucket is
+ // binomially distributed (with n = the number of shorttxids S, and p =
+ // 1 / the number of buckets), that in the worst case the number of buckets is
+ // equal to S (due to std::unordered_map having a default load factor of 1.0),
+ // and that the chance for any bucket to exceed N elements is at most
+ // buckets * (the chance that any given bucket is above N elements).
+ // Thus: P(max_elements_per_bucket > N) <= S * (1 - cdf(binomial(n=S,p=1/S), N)).
+ // If we assume blocks of up to 16000, allowing 12 elements per bucket should
+ // only fail once per ~1 million block transfers (per peer and connection).
+ if (shorttxids.bucket_size(shorttxids.bucket(cmpctblock.shorttxids[i])) > 12)
+ return READ_STATUS_FAILED;
+ }
+ // TODO: in the shortid-collision case, we should instead request both transactions
+ // which collided. Falling back to full-block-request here is overkill.
+ if (shorttxids.size() != cmpctblock.shorttxids.size())
+ return READ_STATUS_FAILED; // Short ID collision
+
+ std::vector<bool> have_txn(txn_available.size());
+ LOCK(pool->cs);
+ const std::vector<std::pair<uint256, CTxMemPool::txiter> >& vTxHashes = pool->vTxHashes;
+ for (size_t i = 0; i < vTxHashes.size(); i++) {
+ uint64_t shortid = cmpctblock.GetShortID(vTxHashes[i].first);
+ std::unordered_map<uint64_t, uint16_t>::iterator idit = shorttxids.find(shortid);
+ if (idit != shorttxids.end()) {
+ if (!have_txn[idit->second]) {
+ txn_available[idit->second] = vTxHashes[i].second->GetSharedTx();
+ have_txn[idit->second] = true;
+ mempool_count++;
+ } else {
+ // If we find two mempool txn that match the short id, just request it.
+ // This should be rare enough that the extra bandwidth doesn't matter,
+ // but eating a round-trip due to FillBlock failure would be annoying
+ if (txn_available[idit->second]) {
+ txn_available[idit->second].reset();
+ mempool_count--;
+ }
+ }
+ }
+ // Though ideally we'd continue scanning for the two-txn-match-shortid case,
+ // the performance win of an early exit here is too good to pass up and worth
+ // the extra risk.
+ if (mempool_count == shorttxids.size())
+ break;
+ }
+
+ LogPrint("cmpctblock", "Initialized PartiallyDownloadedBlock for block %s using a cmpctblock of size %lu\n", cmpctblock.header.GetHash().ToString(), cmpctblock.GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION));
+
+ return READ_STATUS_OK;
+}
+
+bool PartiallyDownloadedBlock::IsTxAvailable(size_t index) const {
+ assert(!header.IsNull());
+ assert(index < txn_available.size());
+ return txn_available[index] ? true : false;
+}
+
+ReadStatus PartiallyDownloadedBlock::FillBlock(CBlock& block, const std::vector<CTransaction>& vtx_missing) const {
+ assert(!header.IsNull());
+ block = header;
+ block.vtx.resize(txn_available.size());
+
+ size_t tx_missing_offset = 0;
+ for (size_t i = 0; i < txn_available.size(); i++) {
+ if (!txn_available[i]) {
+ if (vtx_missing.size() <= tx_missing_offset)
+ return READ_STATUS_INVALID;
+ block.vtx[i] = vtx_missing[tx_missing_offset++];
+ } else
+ block.vtx[i] = *txn_available[i];
+ }
+ if (vtx_missing.size() != tx_missing_offset)
+ return READ_STATUS_INVALID;
+
+ CValidationState state;
+ if (!CheckBlock(block, state, Params().GetConsensus())) {
+ // TODO: We really want to just check merkle tree manually here,
+ // but that is expensive, and CheckBlock caches a block's
+ // "checked-status" (in the CBlock?). CBlock should be able to
+ // check its own merkle root and cache that check.
+ if (state.CorruptionPossible())
+ return READ_STATUS_FAILED; // Possible Short ID collision
+ return READ_STATUS_INVALID;
+ }
+
+ LogPrint("cmpctblock", "Successfully reconstructed block %s with %lu txn prefilled, %lu txn from mempool and %lu txn requested\n", header.GetHash().ToString(), prefilled_count, mempool_count, vtx_missing.size());
+ if (vtx_missing.size() < 5) {
+ for(const CTransaction& tx : vtx_missing)
+ LogPrint("cmpctblock", "Reconstructed block %s required tx %s\n", header.GetHash().ToString(), tx.GetHash().ToString());
+ }
+
+ return READ_STATUS_OK;
+}
diff --git a/src/blockencodings.h b/src/blockencodings.h
new file mode 100644
index 0000000000..99b1cb140d
--- /dev/null
+++ b/src/blockencodings.h
@@ -0,0 +1,206 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_BLOCK_ENCODINGS_H
+#define BITCOIN_BLOCK_ENCODINGS_H
+
+#include "primitives/block.h"
+
+#include <memory>
+
+class CTxMemPool;
+
+// Dumb helper to handle CTransaction compression at serialize-time
+struct TransactionCompressor {
+private:
+ CTransaction& tx;
+public:
+ TransactionCompressor(CTransaction& txIn) : tx(txIn) {}
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(tx); //TODO: Compress tx encoding
+ }
+};
+
+class BlockTransactionsRequest {
+public:
+ // A BlockTransactionsRequest message
+ uint256 blockhash;
+ std::vector<uint16_t> indexes;
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(blockhash);
+ uint64_t indexes_size = (uint64_t)indexes.size();
+ READWRITE(COMPACTSIZE(indexes_size));
+ if (ser_action.ForRead()) {
+ size_t i = 0;
+ while (indexes.size() < indexes_size) {
+ indexes.resize(std::min((uint64_t)(1000 + indexes.size()), indexes_size));
+ for (; i < indexes.size(); i++) {
+ uint64_t index = 0;
+ READWRITE(COMPACTSIZE(index));
+ if (index > std::numeric_limits<uint16_t>::max())
+ throw std::ios_base::failure("index overflowed 16 bits");
+ indexes[i] = index;
+ }
+ }
+
+ uint16_t offset = 0;
+ for (size_t j = 0; j < indexes.size(); j++) {
+ if (uint64_t(indexes[j]) + uint64_t(offset) > std::numeric_limits<uint16_t>::max())
+ throw std::ios_base::failure("indexes overflowed 16 bits");
+ indexes[j] = indexes[j] + offset;
+ offset = indexes[j] + 1;
+ }
+ } else {
+ for (size_t i = 0; i < indexes.size(); i++) {
+ uint64_t index = indexes[i] - (i == 0 ? 0 : (indexes[i - 1] + 1));
+ READWRITE(COMPACTSIZE(index));
+ }
+ }
+ }
+};
+
+class BlockTransactions {
+public:
+ // A BlockTransactions message
+ uint256 blockhash;
+ std::vector<CTransaction> txn;
+
+ BlockTransactions() {}
+ BlockTransactions(const BlockTransactionsRequest& req) :
+ blockhash(req.blockhash), txn(req.indexes.size()) {}
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(blockhash);
+ uint64_t txn_size = (uint64_t)txn.size();
+ READWRITE(COMPACTSIZE(txn_size));
+ if (ser_action.ForRead()) {
+ size_t i = 0;
+ while (txn.size() < txn_size) {
+ txn.resize(std::min((uint64_t)(1000 + txn.size()), txn_size));
+ for (; i < txn.size(); i++)
+ READWRITE(REF(TransactionCompressor(txn[i])));
+ }
+ } else {
+ for (size_t i = 0; i < txn.size(); i++)
+ READWRITE(REF(TransactionCompressor(txn[i])));
+ }
+ }
+};
+
+// Dumb serialization/storage-helper for CBlockHeaderAndShortTxIDs and PartiallyDownlaodedBlock
+struct PrefilledTransaction {
+ // Used as an offset since last prefilled tx in CBlockHeaderAndShortTxIDs,
+ // as a proper transaction-in-block-index in PartiallyDownloadedBlock
+ uint16_t index;
+ CTransaction tx;
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ uint64_t idx = index;
+ READWRITE(COMPACTSIZE(idx));
+ if (idx > std::numeric_limits<uint16_t>::max())
+ throw std::ios_base::failure("index overflowed 16-bits");
+ index = idx;
+ READWRITE(REF(TransactionCompressor(tx)));
+ }
+};
+
+typedef enum ReadStatus_t
+{
+ READ_STATUS_OK,
+ READ_STATUS_INVALID, // Invalid object, peer is sending bogus crap
+ READ_STATUS_FAILED, // Failed to process object
+} ReadStatus;
+
+class CBlockHeaderAndShortTxIDs {
+private:
+ mutable uint64_t shorttxidk0, shorttxidk1;
+ uint64_t nonce;
+
+ void FillShortTxIDSelector() const;
+
+ friend class PartiallyDownloadedBlock;
+
+ static const int SHORTTXIDS_LENGTH = 6;
+protected:
+ std::vector<uint64_t> shorttxids;
+ std::vector<PrefilledTransaction> prefilledtxn;
+
+public:
+ CBlockHeader header;
+
+ // Dummy for deserialization
+ CBlockHeaderAndShortTxIDs() {}
+
+ CBlockHeaderAndShortTxIDs(const CBlock& block, bool fUseWTXID);
+
+ uint64_t GetShortID(const uint256& txhash) const;
+
+ size_t BlockTxCount() const { return shorttxids.size() + prefilledtxn.size(); }
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(header);
+ READWRITE(nonce);
+
+ uint64_t shorttxids_size = (uint64_t)shorttxids.size();
+ READWRITE(COMPACTSIZE(shorttxids_size));
+ if (ser_action.ForRead()) {
+ size_t i = 0;
+ while (shorttxids.size() < shorttxids_size) {
+ shorttxids.resize(std::min((uint64_t)(1000 + shorttxids.size()), shorttxids_size));
+ for (; i < shorttxids.size(); i++) {
+ uint32_t lsb = 0; uint16_t msb = 0;
+ READWRITE(lsb);
+ READWRITE(msb);
+ shorttxids[i] = (uint64_t(msb) << 32) | uint64_t(lsb);
+ static_assert(SHORTTXIDS_LENGTH == 6, "shorttxids serialization assumes 6-byte shorttxids");
+ }
+ }
+ } else {
+ for (size_t i = 0; i < shorttxids.size(); i++) {
+ uint32_t lsb = shorttxids[i] & 0xffffffff;
+ uint16_t msb = (shorttxids[i] >> 32) & 0xffff;
+ READWRITE(lsb);
+ READWRITE(msb);
+ }
+ }
+
+ READWRITE(prefilledtxn);
+
+ if (ser_action.ForRead())
+ FillShortTxIDSelector();
+ }
+};
+
+class PartiallyDownloadedBlock {
+protected:
+ std::vector<std::shared_ptr<const CTransaction> > txn_available;
+ size_t prefilled_count = 0, mempool_count = 0;
+ CTxMemPool* pool;
+public:
+ CBlockHeader header;
+ PartiallyDownloadedBlock(CTxMemPool* poolIn) : pool(poolIn) {}
+
+ ReadStatus InitData(const CBlockHeaderAndShortTxIDs& cmpctblock);
+ bool IsTxAvailable(size_t index) const;
+ ReadStatus FillBlock(CBlock& block, const std::vector<CTransaction>& vtx_missing) const;
+};
+
+#endif
diff --git a/src/bloom.cpp b/src/bloom.cpp
index de87206592..2677652ada 100644
--- a/src/bloom.cpp
+++ b/src/bloom.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
@@ -216,57 +216,100 @@ void CBloomFilter::UpdateEmptyFull()
isEmpty = empty;
}
-CRollingBloomFilter::CRollingBloomFilter(unsigned int nElements, double fpRate) :
- b1(nElements * 2, fpRate, 0), b2(nElements * 2, fpRate, 0)
+CRollingBloomFilter::CRollingBloomFilter(unsigned int nElements, double fpRate)
{
- // 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.
- nInsertions = 0;
- nBloomSize = nElements * 2;
-
+ double logFpRate = log(fpRate);
+ /* The optimal number of hash functions is log(fpRate) / log(0.5), but
+ * restrict it to the range 1-50. */
+ nHashFuncs = std::max(1, std::min((int)round(logFpRate / log(0.5)), 50));
+ /* In this rolling bloom filter, we'll store between 2 and 3 generations of nElements / 2 entries. */
+ nEntriesPerGeneration = (nElements + 1) / 2;
+ uint32_t nMaxElements = nEntriesPerGeneration * 3;
+ /* The maximum fpRate = pow(1.0 - exp(-nHashFuncs * nMaxElements / nFilterBits), nHashFuncs)
+ * => pow(fpRate, 1.0 / nHashFuncs) = 1.0 - exp(-nHashFuncs * nMaxElements / nFilterBits)
+ * => 1.0 - pow(fpRate, 1.0 / nHashFuncs) = exp(-nHashFuncs * nMaxElements / nFilterBits)
+ * => log(1.0 - pow(fpRate, 1.0 / nHashFuncs)) = -nHashFuncs * nMaxElements / nFilterBits
+ * => nFilterBits = -nHashFuncs * nMaxElements / log(1.0 - pow(fpRate, 1.0 / nHashFuncs))
+ * => nFilterBits = -nHashFuncs * nMaxElements / log(1.0 - exp(logFpRate / nHashFuncs))
+ */
+ uint32_t nFilterBits = (uint32_t)ceil(-1.0 * nHashFuncs * nMaxElements / log(1.0 - exp(logFpRate / nHashFuncs)));
+ data.clear();
+ /* For each data element we need to store 2 bits. If both bits are 0, the
+ * bit is treated as unset. If the bits are (01), (10), or (11), the bit is
+ * treated as set in generation 1, 2, or 3 respectively.
+ * These bits are stored in separate integers: position P corresponds to bit
+ * (P & 63) of the integers data[(P >> 6) * 2] and data[(P >> 6) * 2 + 1]. */
+ data.resize(((nFilterBits + 63) / 64) << 1);
reset();
}
+/* Similar to CBloomFilter::Hash */
+static inline uint32_t RollingBloomHash(unsigned int nHashNum, uint32_t nTweak, const std::vector<unsigned char>& vDataToHash) {
+ return MurmurHash3(nHashNum * 0xFBA4C795 + nTweak, vDataToHash);
+}
+
void CRollingBloomFilter::insert(const std::vector<unsigned char>& vKey)
{
- if (nInsertions == 0) {
- b1.clear();
- } else if (nInsertions == nBloomSize / 2) {
- b2.clear();
+ if (nEntriesThisGeneration == nEntriesPerGeneration) {
+ nEntriesThisGeneration = 0;
+ nGeneration++;
+ if (nGeneration == 4) {
+ nGeneration = 1;
+ }
+ uint64_t nGenerationMask1 = -(uint64_t)(nGeneration & 1);
+ uint64_t nGenerationMask2 = -(uint64_t)(nGeneration >> 1);
+ /* Wipe old entries that used this generation number. */
+ for (uint32_t p = 0; p < data.size(); p += 2) {
+ uint64_t p1 = data[p], p2 = data[p + 1];
+ uint64_t mask = (p1 ^ nGenerationMask1) | (p2 ^ nGenerationMask2);
+ data[p] = p1 & mask;
+ data[p + 1] = p2 & mask;
+ }
}
- b1.insert(vKey);
- b2.insert(vKey);
- if (++nInsertions == nBloomSize) {
- nInsertions = 0;
+ nEntriesThisGeneration++;
+
+ for (int n = 0; n < nHashFuncs; n++) {
+ uint32_t h = RollingBloomHash(n, nTweak, vKey);
+ int bit = h & 0x3F;
+ uint32_t pos = (h >> 6) % data.size();
+ /* The lowest bit of pos is ignored, and set to zero for the first bit, and to one for the second. */
+ data[pos & ~1] = (data[pos & ~1] & ~(((uint64_t)1) << bit)) | ((uint64_t)(nGeneration & 1)) << bit;
+ data[pos | 1] = (data[pos | 1] & ~(((uint64_t)1) << bit)) | ((uint64_t)(nGeneration >> 1)) << bit;
}
}
void CRollingBloomFilter::insert(const uint256& hash)
{
- vector<unsigned char> data(hash.begin(), hash.end());
- insert(data);
+ vector<unsigned char> vData(hash.begin(), hash.end());
+ insert(vData);
}
bool CRollingBloomFilter::contains(const std::vector<unsigned char>& vKey) const
{
- if (nInsertions < nBloomSize / 2) {
- return b2.contains(vKey);
+ for (int n = 0; n < nHashFuncs; n++) {
+ uint32_t h = RollingBloomHash(n, nTweak, vKey);
+ int bit = h & 0x3F;
+ uint32_t pos = (h >> 6) % data.size();
+ /* If the relevant bit is not set in either data[pos & ~1] or data[pos | 1], the filter does not contain vKey */
+ if (!(((data[pos & ~1] | data[pos | 1]) >> bit) & 1)) {
+ return false;
+ }
}
- return b1.contains(vKey);
+ return true;
}
bool CRollingBloomFilter::contains(const uint256& hash) const
{
- vector<unsigned char> data(hash.begin(), hash.end());
- return contains(data);
+ vector<unsigned char> vData(hash.begin(), hash.end());
+ return contains(vData);
}
void CRollingBloomFilter::reset()
{
- unsigned int nNewTweak = GetRand(std::numeric_limits<unsigned int>::max());
- b1.reset(nNewTweak);
- b2.reset(nNewTweak);
- nInsertions = 0;
+ nTweak = GetRand(std::numeric_limits<unsigned int>::max());
+ nEntriesThisGeneration = 0;
+ nGeneration = 1;
+ for (std::vector<uint64_t>::iterator it = data.begin(); it != data.end(); it++) {
+ *it = 0;
+ }
}
diff --git a/src/bloom.h b/src/bloom.h
index a4dba8cb4f..ad6de625d8 100644
--- a/src/bloom.h
+++ b/src/bloom.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
@@ -110,8 +110,11 @@ public:
* reset() is provided, which also changes nTweak to decrease the impact of
* false-positives.
*
- * contains(item) will always return true if item was one of the last N things
+ * contains(item) will always return true if item was one of the last N to 1.5*N
* insert()'ed ... but may also return true for items that were not inserted.
+ *
+ * It needs around 1.8 bytes per element per factor 0.1 of false positive rate.
+ * (More accurately: 3/(log(256)*log(2)) * log(1/fpRate) * nElements bytes)
*/
class CRollingBloomFilter
{
@@ -129,10 +132,12 @@ public:
void reset();
private:
- unsigned int nBloomSize;
- unsigned int nInsertions;
- CBloomFilter b1, b2;
+ int nEntriesPerGeneration;
+ int nEntriesThisGeneration;
+ int nGeneration;
+ std::vector<uint64_t> data;
+ unsigned int nTweak;
+ int nHashFuncs;
};
-
#endif // BITCOIN_BLOOM_H
diff --git a/src/chain.cpp b/src/chain.cpp
index 3450ed6c3f..77e924e703 100644
--- a/src/chain.cpp
+++ b/src/chain.cpp
@@ -93,6 +93,7 @@ CBlockIndex* CBlockIndex::GetAncestor(int height)
pindexWalk = pindexWalk->pskip;
heightWalk = heightSkip;
} else {
+ assert(pindexWalk->pprev);
pindexWalk = pindexWalk->pprev;
heightWalk--;
}
@@ -110,3 +111,35 @@ void CBlockIndex::BuildSkip()
if (pprev)
pskip = pprev->GetAncestor(GetSkipHeight(nHeight));
}
+
+arith_uint256 GetBlockProof(const CBlockIndex& block)
+{
+ arith_uint256 bnTarget;
+ bool fNegative;
+ bool fOverflow;
+ bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow);
+ if (fNegative || fOverflow || bnTarget == 0)
+ return 0;
+ // We need to compute 2**256 / (bnTarget+1), but we can't represent 2**256
+ // as it's too large for a arith_uint256. However, as 2**256 is at least as large
+ // as bnTarget+1, it is equal to ((2**256 - bnTarget - 1) / (bnTarget+1)) + 1,
+ // 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/chain.h b/src/chain.h
index 01be2d6e5c..6588e8f57d 100644
--- a/src/chain.h
+++ b/src/chain.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -14,7 +14,59 @@
#include <vector>
-#include <boost/foreach.hpp>
+class CBlockFileInfo
+{
+public:
+ unsigned int nBlocks; //!< number of blocks stored in file
+ unsigned int nSize; //!< number of used bytes of block file
+ unsigned int nUndoSize; //!< number of used bytes in the undo file
+ unsigned int nHeightFirst; //!< lowest height of block in file
+ unsigned int nHeightLast; //!< highest height of block in file
+ uint64_t nTimeFirst; //!< earliest time of block in file
+ uint64_t nTimeLast; //!< latest time of block in file
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(VARINT(nBlocks));
+ READWRITE(VARINT(nSize));
+ READWRITE(VARINT(nUndoSize));
+ READWRITE(VARINT(nHeightFirst));
+ READWRITE(VARINT(nHeightLast));
+ READWRITE(VARINT(nTimeFirst));
+ READWRITE(VARINT(nTimeLast));
+ }
+
+ void SetNull() {
+ nBlocks = 0;
+ nSize = 0;
+ nUndoSize = 0;
+ nHeightFirst = 0;
+ nHeightLast = 0;
+ nTimeFirst = 0;
+ nTimeLast = 0;
+ }
+
+ CBlockFileInfo() {
+ SetNull();
+ }
+
+ std::string ToString() const;
+
+ /** update statistics (does not update nSize) */
+ void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn) {
+ if (nBlocks==0 || nHeightFirst > nHeightIn)
+ nHeightFirst = nHeightIn;
+ if (nBlocks==0 || nTimeFirst > nTimeIn)
+ nTimeFirst = nTimeIn;
+ nBlocks++;
+ if (nHeightIn > nHeightLast)
+ nHeightLast = nHeightIn;
+ if (nTimeIn > nTimeLast)
+ nTimeLast = nTimeIn;
+ }
+};
struct CDiskBlockPos
{
@@ -56,7 +108,7 @@ struct CDiskBlockPos
};
-enum BlockStatus {
+enum BlockStatus: uint32_t {
//! Unused.
BLOCK_VALID_UNKNOWN = 0,
@@ -85,13 +137,15 @@ enum BlockStatus {
BLOCK_VALID_MASK = BLOCK_VALID_HEADER | BLOCK_VALID_TREE | BLOCK_VALID_TRANSACTIONS |
BLOCK_VALID_CHAIN | BLOCK_VALID_SCRIPTS,
- BLOCK_HAVE_DATA = 8, //! full block available in blk*.dat
- BLOCK_HAVE_UNDO = 16, //! undo data available in rev*.dat
+ BLOCK_HAVE_DATA = 8, //!< full block available in blk*.dat
+ BLOCK_HAVE_UNDO = 16, //!< undo data available in rev*.dat
BLOCK_HAVE_MASK = BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO,
- BLOCK_FAILED_VALID = 32, //! stage after last reached validness failed
- BLOCK_FAILED_CHILD = 64, //! descends from failed block
+ BLOCK_FAILED_VALID = 32, //!< stage after last reached validness failed
+ BLOCK_FAILED_CHILD = 64, //!< descends from failed block
BLOCK_FAILED_MASK = BLOCK_FAILED_VALID | BLOCK_FAILED_CHILD,
+
+ BLOCK_OPT_WITNESS = 128, //!< block data in blk*.data was received with a witness-enforcing client
};
/** The block chain is a tree shaped structure starting with the
@@ -282,6 +336,10 @@ public:
const CBlockIndex* GetAncestor(int height) const;
};
+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&);
+
/** Used to marshal pointers into hashes for db storage. */
class CDiskBlockIndex : public CBlockIndex
{
diff --git a/src/chainparams.cpp b/src/chainparams.cpp
index a46866a2be..7279570855 100644
--- a/src/chainparams.cpp
+++ b/src/chainparams.cpp
@@ -1,5 +1,5 @@
// 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.
@@ -71,17 +71,32 @@ public:
CMainParams() {
strNetworkID = "main";
consensus.nSubsidyHalvingInterval = 210000;
- consensus.nMajorityEnforceBlockUpgrade = 750;
- consensus.nMajorityRejectBlockOutdated = 950;
- consensus.nMajorityWindow = 1000;
consensus.BIP34Height = 227931;
consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
+ consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
+ consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = false;
consensus.fPowNoRetargeting = false;
- /**
+ consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016
+ consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
+
+ // Deployment of BIP68, BIP112, and BIP113.
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1462060800; // May 1st, 2016
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017
+
+ // Deployment of SegWit (BIP141, BIP143, and BIP147)
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1479168000; // November 15th, 2016.
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 1510704000; // November 15th, 2017.
+
+ /**
* 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 32-bit integer with any alignment.
@@ -90,9 +105,7 @@ public:
pchMessageStart[1] = 0xbe;
pchMessageStart[2] = 0xb4;
pchMessageStart[3] = 0xd9;
- vAlertPubKey = ParseHex("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284");
nDefaultPort = 8333;
- nMaxTipAge = 24 * 60 * 60;
nPruneAfterHeight = 100000;
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
@@ -100,12 +113,13 @@ public:
assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
- vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be")); // Pieter Wuille
- vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me")); // Matt Corallo
+ // Note that of those with the service bits flag, most only support a subset of possible options
+ vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be", true)); // Pieter Wuille, only supports x1, x5, x9, and xd
+ vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me", true)); // Matt Corallo, only supports x9
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("bitcoinstats.com", "seed.bitcoinstats.com", true)); // Christian Decker, supports x1 - xf
vSeeds.push_back(CDNSSeedData("xf2.org", "bitseed.xf2.org")); // Jeff Garzik
- vSeeds.push_back(CDNSSeedData("bitcoin.jonasschnelli.ch", "seed.bitcoin.jonasschnelli.ch")); // Jonas Schnelli
+ vSeeds.push_back(CDNSSeedData("bitcoin.jonasschnelli.ch", "seed.bitcoin.jonasschnelli.ch", true)); // Jonas Schnelli, only supports x1, x5, x9, and xd
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);
@@ -153,23 +167,36 @@ public:
CTestNetParams() {
strNetworkID = "test";
consensus.nSubsidyHalvingInterval = 210000;
- consensus.nMajorityEnforceBlockUpgrade = 51;
- consensus.nMajorityRejectBlockOutdated = 75;
- consensus.nMajorityWindow = 100;
consensus.BIP34Height = 21111;
consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");
+ consensus.BIP65Height = 581885; // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6
+ consensus.BIP66Height = 330776; // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = true;
consensus.fPowNoRetargeting = false;
+ consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains
+ consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
+
+ // Deployment of BIP68, BIP112, and BIP113.
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1456790400; // March 1st, 2016
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017
+
+ // Deployment of SegWit (BIP141, BIP143, and BIP147)
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1462060800; // May 1st 2016
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 1493596800; // May 1st 2017
+
pchMessageStart[0] = 0x0b;
pchMessageStart[1] = 0x11;
pchMessageStart[2] = 0x09;
pchMessageStart[3] = 0x07;
- vAlertPubKey = ParseHex("04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a");
nDefaultPort = 18333;
- nMaxTipAge = 0x7fffffff;
nPruneAfterHeight = 1000;
genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);
@@ -179,8 +206,9 @@ public:
vFixedSeeds.clear();
vSeeds.clear();
- vSeeds.push_back(CDNSSeedData("alexykot.me", "testnet-seed.alexykot.me"));
- vSeeds.push_back(CDNSSeedData("bitcoin.petertodd.org", "testnet-seed.bitcoin.petertodd.org"));
+ // nodes with support for servicebits filtering should be at the top
+ vSeeds.push_back(CDNSSeedData("testnetbitcoin.jonasschnelli.ch", "testnet-seed.bitcoin.jonasschnelli.ch", true));
+ vSeeds.push_back(CDNSSeedData("petertodd.org", "seed.tbtc.petertodd.org", true));
vSeeds.push_back(CDNSSeedData("bluematt.me", "testnet-seed.bluematt.me"));
vSeeds.push_back(CDNSSeedData("bitcoin.schildbach.de", "testnet-seed.bitcoin.schildbach.de"));
@@ -218,22 +246,31 @@ public:
CRegTestParams() {
strNetworkID = "regtest";
consensus.nSubsidyHalvingInterval = 150;
- consensus.nMajorityEnforceBlockUpgrade = 750;
- consensus.nMajorityRejectBlockOutdated = 950;
- consensus.nMajorityWindow = 1000;
- consensus.BIP34Height = -1; // BIP34 has not necessarily activated on regtest
+ consensus.BIP34Height = 100000000; // BIP34 has not activated on regtest (far in the future so block v1 are not rejected in tests)
consensus.BIP34Hash = uint256();
+ consensus.BIP65Height = 1351; // BIP65 activated on regtest (Used in rpc activation tests)
+ consensus.BIP66Height = 1251; // BIP66 activated on regtest (Used in rpc activation tests)
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = true;
consensus.fPowNoRetargeting = true;
+ consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
+ consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 0;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 999999999999ULL;
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 0;
+ consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 999999999999ULL;
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 0;
+ consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 999999999999ULL;
pchMessageStart[0] = 0xfa;
pchMessageStart[1] = 0xbf;
pchMessageStart[2] = 0xb5;
pchMessageStart[3] = 0xda;
- nMaxTipAge = 24 * 60 * 60;
nDefaultPort = 18444;
nPruneAfterHeight = 1000;
@@ -242,8 +279,8 @@ public:
assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"));
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
- vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
- vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
+ vFixedSeeds.clear(); //!< Regtest mode doesn't have any fixed seeds.
+ vSeeds.clear(); //!< Regtest mode doesn't have any DNS seeds.
fMiningRequiresPeers = false;
fDefaultConsistencyChecks = true;
@@ -264,6 +301,12 @@ 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> >();
}
+
+ void UpdateBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout)
+ {
+ consensus.vDeployments[d].nStartTime = nStartTime;
+ consensus.vDeployments[d].nTimeout = nTimeout;
+ }
};
static CRegTestParams regTestParams;
@@ -291,3 +334,9 @@ void SelectParams(const std::string& network)
SelectBaseParams(network);
pCurrentParams = &Params(network);
}
+
+void UpdateRegtestBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout)
+{
+ regTestParams.UpdateBIP9Parameters(d, nStartTime, nTimeout);
+}
+
diff --git a/src/chainparams.h b/src/chainparams.h
index 8aa0c71d61..0c3820b7c6 100644
--- a/src/chainparams.h
+++ b/src/chainparams.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -15,7 +15,8 @@
struct CDNSSeedData {
std::string name, host;
- CDNSSeedData(const std::string &strName, const std::string &strHost) : name(strName), host(strHost) {}
+ bool supportsServiceBitsFiltering;
+ CDNSSeedData(const std::string &strName, const std::string &strHost, bool supportsServiceBitsFilteringIn = false) : name(strName), host(strHost), supportsServiceBitsFiltering(supportsServiceBitsFilteringIn) {}
};
struct SeedSpec6 {
@@ -54,7 +55,6 @@ public:
const Consensus::Params& GetConsensus() const { return consensus; }
const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; }
- const std::vector<unsigned char>& AlertKey() const { return vAlertPubKey; }
int GetDefaultPort() const { return nDefaultPort; }
const CBlock& GenesisBlock() const { return genesis; }
@@ -64,7 +64,6 @@ public:
bool DefaultConsistencyChecks() const { return fDefaultConsistencyChecks; }
/** Policy: Filter transactions that do not match well-defined patterns */
bool RequireStandard() const { return fRequireStandard; }
- int64_t MaxTipAge() const { return nMaxTipAge; }
uint64_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; }
@@ -81,10 +80,7 @@ protected:
Consensus::Params consensus;
CMessageHeader::MessageStartChars pchMessageStart;
- //! Raw pub key bytes for the broadcast alert signing key.
- std::vector<unsigned char> vAlertPubKey;
int nDefaultPort;
- long nMaxTipAge;
uint64_t nPruneAfterHeight;
std::vector<CDNSSeedData> vSeeds;
std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
@@ -116,4 +112,9 @@ CChainParams& Params(const std::string& chain);
*/
void SelectParams(const std::string& chain);
+/**
+ * Allows modifying the BIP9 regtest parameters.
+ */
+void UpdateRegtestBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout);
+
#endif // BITCOIN_CHAINPARAMS_H
diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp
index bc64cdc5d9..cb71a8b550 100644
--- a/src/chainparamsbase.cpp
+++ b/src/chainparamsbase.cpp
@@ -1,5 +1,5 @@
// 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.
diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h
index 9c3e9a0ebf..59493afb9b 100644
--- a/src/chainparamsbase.h
+++ b/src/chainparamsbase.h
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h
index 423362859f..1406e86805 100644
--- a/src/chainparamsseeds.h
+++ b/src/chainparamsseeds.h
@@ -8,885 +8,943 @@
* 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,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,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,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,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,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,0x05,0x02,0x91,0xc9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x16,0x8e,0xd6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x35,0xac,0xc5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xa1,0xa4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe6,0x8c,0xa6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe7,0x03,0x82}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xff,0x50,0x67}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0xca,0xe6,0x31}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x55,0x0b,0x82}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5b,0x61,0x19}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5e,0x64,0x7a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5f,0x63,0x84}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x73,0x08,0xce}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x7f,0x80,0xbf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x9a,0xb2,0x19}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcf,0x67,0x2b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcf,0x68,0x69}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd2,0xe6,0x96}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe0,0x12,0x54}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xf6,0xa8,0x6a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0xfe,0x40,0x2f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x06,0x47,0x7b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x06,0x47,0x7c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x0e,0x86,0x0d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x1e,0x24,0xdc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xa4,0x06,0x68}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xaa,0x6a,0xcb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xb9,0x86,0xc9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xcc,0x80,0x63}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xcc,0x80,0xdb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x01,0xdb,0x58}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x61,0x84,0x6d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa0,0x37}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa9,0x7b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x8b,0x20,0x2e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xdd,0xa3,0xda}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x26,0x82,0xc0,0x48}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x29,0x4b,0x60,0x50}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x03,0x00,0x31}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x48,0xb9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x60,0x81}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x38,0x04,0x3f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x00,0x7f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x50,0x66}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x61,0x1e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x84,0xdb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x15,0x61,0x87}, 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,0x2e,0x1c,0xce,0xbc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1d,0x14,0xd1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x32,0xea,0xb3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xa0,0xa8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa1,0x23}, 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,0xda,0xe3,0x5c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe2,0x6d,0x14}, 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,0xe3,0x42,0x8a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xa5,0x9a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xa5,0x9b}, 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,0xea,0x68,0x30}, 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,0x2e,0xf4,0x00,0x8a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xfe,0x48,0xc3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x05,0x0d,0x2c}, 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,0x32,0x1e,0x25,0x67}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x27,0x69,0x3c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x6a,0x28,0xe7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1d,0x00,0x25}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4c,0xc0,0xf6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x98,0xc0,0xb3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0x40,0xae}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xaf,0xa0,0x16}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xc7,0x80,0x00}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0x60,0xab,0x81}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0xa1,0xee,0x39}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xfb,0xc3,0xdd}, 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,0x6d,0x31,0x1a}, 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,0x3e,0x41,0x27,0x0c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6b,0xc8,0x1e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x85,0xc2,0x02}, 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,0xb7,0x16,0x32}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x55,0x78}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0xa2,0x59}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xee,0x22,0x7d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x19,0xab,0x49}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x1b,0xa6,0x1e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x35,0x89,0x65}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x47,0x48,0x2c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x53,0xe1,0x92}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x79,0x03,0xa3}, 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,0x42,0x1e,0x03,0x07}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x5e,0x83,0x3b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0xbc,0x88,0xe9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x0b,0xa2,0xda}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x17,0xe4,0x85}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x5a,0x89,0x59}, 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,0x96,0x69,0x4d}, 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,0x42,0xc2,0x26,0xfe}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xe7,0x61,0xac}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xf0,0xed,0x9b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x9f,0x0d,0x22}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0x4a,0xce}, 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,0x43,0xe3,0x48,0x11}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x41,0x78,0x35}, 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,0x44,0x90,0x04,0x22}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x27,0x31,0xc7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x32,0xab,0xcd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x41,0x29,0x15}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x71,0x62,0x3d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x77,0x61,0x27}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x92,0x46,0x7c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xc1,0x47,0x02}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x2e,0x0a,0xed}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x50,0xc8,0xbb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0xb9,0x61,0x75}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xfe,0xa0,0x19}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x1c,0xcb,0x05}, 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,0x53,0xc2,0x7a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x80,0x20,0xa7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xb3,0x88,0x50}, 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,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,0x4a,0x32,0x2c,0xc1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x48,0x3c,0x53}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x50,0xea,0x74}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xcf,0xe9,0xc1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x70,0xe9,0x80}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x76,0xa6,0xc5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x8c,0x00,0xf1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x9f,0xf0,0x42}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xae,0x05,0x1a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x48,0xa0,0xfc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x48,0xa0,0xfe}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x4a,0xaa,0x70}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x4f,0xc9,0x36}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xaf,0xa6,0xa4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xb3,0x69,0x1b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x44,0x25,0xc8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xea,0x31,0xc4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf7,0xe5,0x5d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x18,0x48,0x4e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2f,0x20,0x93}, 8333},
{{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,0x4e,0x79,0x45,0x17}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x81,0xa7,0x05}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0xc1,0x60,0x9b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x13,0x25,0xb3}, 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,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,0x4f,0x86,0xc9,0x42}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xa9,0x23,0xeb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x39,0xe3,0x0e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x40,0x41,0x57}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x56,0x5c,0x46}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x64,0xcb,0x97}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x65,0x20,0x79}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xa1,0xb2,0x49}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xf0,0x81,0xaa}, 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,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,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,0x51,0x07,0x0b,0x37}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x11,0x11,0x28}, 9333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x1e,0x27,0x53}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x5a,0x24,0x07}, 9444},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x88,0xe0,0x4d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xa2,0xe7,0xd3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb8,0x00,0x8f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xc6,0x80,0x56}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x0b,0x21,0xe5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x4f,0x80,0x86}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x76,0xe9,0x6f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x87,0x8b,0x1e}, 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,0xc8,0xcd,0x1e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6a,0x11}, 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,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,0x52,0xdd,0x6c,0x1b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x89,0x29,0x03}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x8e,0xc5,0xa8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x8f,0x82,0x13}, 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,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,0xb7,0x11,0xbf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe3,0xad,0x53}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe6,0x05,0x0f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe9,0x69,0x97}, 443},
+ {{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,0xfa,0x85,0x9e}, 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,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,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,0x54,0x18,0x45,0x3b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2a,0xc1,0x06}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2d,0x62,0x57}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x36,0x80,0x0b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd4,0xc8,0x18}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd7,0xc6,0x6d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xe6,0x04,0xb1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x5f,0xe4,0x53}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x5f,0xe4,0x7b}, 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,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,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,0x55,0xd6,0x93,0xa2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xf3,0xa8,0x04}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x01,0x00,0x12}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x4f,0x4d,0x6a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x5b,0x9c,0x6e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc4,0xde}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x55,0x4b,0x98}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x57,0x01,0xe6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x57,0x5c,0x66}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x59,0x45,0xca}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x61,0x48,0xe5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xa4,0x75,0x63}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0x20,0x83}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xca,0xe6,0x57}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd6,0xc1,0x9a}, 8343},
{{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,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,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,0x59,0x0a,0x9b,0x58}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x2e,0x65,0x2c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0xe0,0xd4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xae,0xf8,0x14}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xca,0xe7,0xc6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xd4,0x4b,0x06}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x95,0x26,0xac}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0xa9,0x6a,0x8b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x40,0x65,0x96}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x41,0xc4,0xb3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x79,0x50,0x11}, 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,0x91,0x4c,0x9c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x98,0x96,0x23}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc0,0x89,0x11}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc4,0xaa,0x6e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc5,0x2c,0x85}, 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,0x69,0x1c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd3,0x66,0x65}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd3,0x6a,0x22}, 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,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,0x5b,0xdc,0x2b,0x92}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xde,0x47,0x59}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe0,0x8c,0xf2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe5,0x4c,0x0e}, 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,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,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,0x5c,0x33,0xa7,0x58}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xf7,0xe5,0xa3}, 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,0x71,0x24,0xac}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xbc,0xe0,0xfd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x4b,0xef,0x45}, 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,0xd6,0x02,0x4a}, 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,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,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,0x5e,0xec,0xc6,0xfd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xf2,0xe5,0x9e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x54,0x8a,0x63}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x5f,0xa8,0x57}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x6e,0xea,0x5d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x82,0x09,0xc8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xa5,0xa8,0xa8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xaa,0xeb,0xfe}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd3,0x82,0x9a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x2e,0x44,0x68}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7f,0xca,0x94}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x4c,0xab,0x23}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xa0,0xa0,0x43}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0x7e,0xc5,0xbb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xc6,0xad,0x01}, 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,0x65,0xa4,0xc9,0xd0}, 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,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,0xe1,0xdf}, 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,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,0x83,0xc0,0x5e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x9b,0x2d,0xc9}, 8334},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc2,0x1c,0xc3}, 8663},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xd3,0x01,0x1b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdd,0x26,0xb1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0x09,0x4f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0x81,0xb2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xba,0xf9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xc2,0x0f}, 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,0x6a,0xb9,0x26,0x43}, 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,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,0xaa,0x0d,0xb8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xb5,0xfa,0xd8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbf,0x65,0x6f}, 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,0xbf,0x27,0x3c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3b,0x0c,0xa3}, 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,0x6d,0xc1,0xa0,0x8c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xc5,0x0d,0x36}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe6,0x07,0xf8}, 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,0x6d,0xec,0x89,0x50}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xfb,0xa1,0x79}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x70,0x41,0xe7,0xe2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x46,0xa6,0x39}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x9f,0x2a,0x50}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x75,0x12,0x49,0x22}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x43,0xc9,0x28}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x64,0x56,0xf6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x6e,0x68,0x98}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0xe0,0x40,0x8d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x37,0xc1,0x88}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x6a,0xa9,0xb2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xcb,0xae,0x0f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xff,0xe8,0x5e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0x94,0xa5,0xa5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0xe8,0x8d,0x1f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x1e,0x5c,0x45}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x27,0x8d,0xb6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x54,0xa7,0x14}, 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,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,0x7f,0x26,0xc3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x8c,0xe0,0xa2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x65,0x68}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xe9,0xe0,0x23}, 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,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,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,0x82,0xb4,0xe4,0x8a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xb9,0x90,0xd5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xff,0x49,0xcf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x85,0xda,0xe9,0x0b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0xf9,0x80,0x17}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x9f,0xea,0xea}, 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,0x8b,0xa2,0x02,0x91}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x17,0x75}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0x86,0x45,0xfd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xff,0xa2,0xd7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x7a,0xa3,0xbb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x91,0x83,0x03,0x36}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x91,0xff,0x04,0x5e}, 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,0x95,0xd2,0xa2,0xbb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x93,0x53,0x48,0x5b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x67,0x1c,0x44}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x05,0x20,0x66}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xd2,0xa4,0xc3}, 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,0x9f,0xfd,0x17,0x84}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x98,0x03,0x88,0x38}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9a,0x14,0xd0,0x19}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0xb5,0x68,0x95}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0xfd,0x60,0xe2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa0,0x24,0x82,0xb4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x01,0xe9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x04,0x7d}, 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,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,0xa2,0xfb,0x6c,0x35}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0x2c,0x02,0x30}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0x9e,0x24,0x11}, 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,0xa7,0xa0,0x24,0x3e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0xa0,0xa9,0x5c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa8,0x5d,0x81,0xdc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0x37,0x63,0x54}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0xe4,0x42,0x2b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x09,0xa9,0xf2}, 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,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,0xad,0xe6,0xe4,0x88}, 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,0xfe,0xeb,0x22}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x00,0x80,0xde}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x19,0x82,0x94}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x32,0x40,0x65}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x8c,0xe8,0x8d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x25,0x3e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x2e,0x09,0x60}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x7c,0x6e,0x1b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb1,0x27,0x10,0x66}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x11,0xad,0x02}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x05,0xf8}, 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,0x3e,0xcb,0xb9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4f,0xa0,0x76}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xa9,0xce,0xf4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xc1,0xea,0x3e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xc7,0x60,0x6c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x12,0x60}, 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,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,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,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,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,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,0xb2,0xff,0x29,0x7b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xd2,0x22,0x3a}, 9801},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0x5c,0xe2,0xd4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0xab,0xf6,0x8e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x17,0x08,0x09}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x3a,0xa2,0x23}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x9a,0x09,0xaa}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x08,0xee,0xa5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x18,0x61,0x0b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1f,0x89,0x8b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x26,0x2c,0x40}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x80,0xb4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x81,0xf4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x4d,0x81,0x77}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x4d,0x81,0x9c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x52,0xcb,0x5c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x14,0x61,0x12}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x7e,0x08,0x0e}, 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,0x9b,0x88,0x46}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xa6,0xe5,0x70}, 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,0xbc,0xe2,0xe1,0xae}, 8010},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xf2,0xab,0x08}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xf3,0x04,0x8b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x0a,0x09,0xea}, 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,0xbe,0x51,0xa0,0xb8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x55,0xc9,0x25}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x22,0xe3,0xe6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x4d,0xbd,0xc8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x7c,0xe0,0x07}, 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,0xc0,0xce,0xca,0x14}, 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,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,0x9f,0xe2,0x8b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x29,0xe5,0x82}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x29,0xe5,0x9c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x31,0x2b,0xdb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x93,0x47,0x78}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xb3,0x41,0xe9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xb7,0x63,0x2e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xc0,0x25,0x87}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xea,0xe0,0xc3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x3a,0x6c,0xd5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xbb,0x60,0x02}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xff,0x1f,0x3b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x24,0x06,0x65}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x3a,0xee,0xf3}, 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,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,0xc3,0xef,0x01,0x42}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x30,0xc4,0xe6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x32,0xc0,0xa0}, 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,0x54,0xc3,0xb3}, 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,0xc6,0xcc,0xe0,0x6a}, 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,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,0xc7,0xc9,0x6e,0x08}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xe9,0xea,0x5a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x74,0x62,0xb9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x3c,0x46,0x12}, 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,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,0x0c,0x40,0xe1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x70,0xcb,0x34}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcd,0xc8,0xf7,0x95}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xe2,0x8d,0xfd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xff,0x2a,0xca}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x35,0xa4,0x13}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x42,0x44,0x7f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x42,0x44,0x82}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x47,0xab,0xe8}, 8341},
{{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,0xd0,0x52,0x62,0xbd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x55,0xc1,0x1f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6f,0x30,0x29}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6f,0x30,0x2d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x22,0xe8,0x48}, 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,0x5a,0xe0,0x02}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x5a,0xe0,0x04}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7e,0x62,0xae}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x88,0x48,0x45}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xc3,0x04,0x4a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xc5,0x0d,0x3e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x48,0xe3,0x08}, 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,0x47,0xe9,0x7f}, 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,0xd4,0x9f,0x2c,0x32}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x05,0x24,0x3a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x39,0x21,0x0a}, 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,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,0x88,0x49,0x7d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x9b,0x03,0xd8}, 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,0xd5,0xa7,0x11,0x06}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xdf,0x8a,0x0d}, 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,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,0x26,0x81,0xa4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x30,0xa8,0x08}, 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,0xf5,0xce,0xb5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf9,0xcc,0xa1}, 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,0x0c,0x22,0x9e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0c,0xca,0x21}, 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,0x17,0x01,0x7e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x0b,0x8a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x6f,0x42,0x4f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x9b,0xca,0xbf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x9e,0x09,0x66}, 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},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0xf5,0xc4,0x25}, 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,0x16,0x20,0x0f,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x16,0x20,0x0f,0x00,0x82,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x19,0xf0,0x50,0x00,0x8d,0xe8,0x54,0x00,0x00,0xff,0xfe,0x12,0x55,0xe4}, 8333},
+ {{0x20,0x01,0x19,0xf0,0x6c,0x00,0x91,0x03,0x54,0x00,0x00,0xff,0xfe,0x10,0xa8,0xd3}, 8333},
+ {{0x20,0x01,0x1b,0x60,0x00,0x03,0x01,0x72,0x14,0x2b,0x6d,0xff,0xfe,0x7a,0x01,0x17}, 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,0x28,0x61,0x35,0x20,0x10,0x02,0x1e,0x0b,0xff,0xfe,0xe8,0xa3,0xc0}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x10,0x08,0x07,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7c}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0x45,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 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,0xaf,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8200},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xb2,0x6b,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,0x10,0x21,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,0x47,0x97,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0x53,0xdf,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,0x9d,0x3e,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,0xa3,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xb2,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xc1,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0x0c,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xc9,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 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,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x5f}, 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,0x52,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xe2}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0x3e,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0x62,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 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,0xb3,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0xbc,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0xbe,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0xd9,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 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,0x13,0xa2,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,0x2d,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x45,0x58,0x00,0x00,0x00,0x00,0x1d,0xf2,0x76,0xd3}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x4a,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x63,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x63,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 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,0x41,0xd0,0x00,0x0a,0xf9,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0d,0x20,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0e,0x02,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0xfc,0x8c,0xa2,0x00,0x7a,0x24,0xaf,0xff,0xfe,0x9d,0xc6,0x9b}, 8333},
+ {{0x20,0x01,0x41,0xf0,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333},
+ {{0x20,0x01,0x41,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x44,0xb8,0x41,0xbd,0x61,0x01,0x14,0x8e,0x40,0x22,0x49,0x50,0xe8,0x61}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x01,0x02,0xf9,0x00,0x00,0x00,0x01,0x10,0x7a,0xa3,0x01}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x0b,0x0a,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 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,0x27,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x41,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x50,0x7d,0x00,0x00,0x6a,0xb5,0x99,0xff,0xfe,0x73,0xac,0x18}, 8333},
+ {{0x20,0x01,0x04,0x70,0x58,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a}, 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,0x00,0x6f,0x03,0x27,0x91,0x3b,0x07,0xfe,0x85,0x45,0xa4,0xf5}, 8333},
+ {{0x20,0x01,0x04,0x70,0x7d,0xda,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 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,0x04,0x70,0xfa,0xb7,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
{{0x20,0x01,0x48,0x00,0x78,0x19,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x05,0xc8,0x28}, 8333},
+ {{0x20,0x01,0x48,0x00,0x78,0x19,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x05,0xc9,0xa0}, 8333},
+ {{0x20,0x01,0x48,0x01,0x78,0x19,0x00,0x74,0xb7,0x45,0xb9,0xd5,0xff,0x10,0xa6,0x1a}, 8333},
+ {{0x20,0x01,0x48,0x01,0x78,0x19,0x00,0x74,0xb7,0x45,0xb9,0xd5,0xff,0x10,0xaa,0xec}, 8333},
+ {{0x20,0x01,0x48,0x01,0x78,0x28,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x10,0x13,0x25}, 8333},
+ {{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x01,0xbe,0x76,0x4e,0xff,0xfe,0x20,0xf0,0x23}, 8333},
{{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x02,0x30,0xd7,0x17,0x75,0xff,0x20,0x18,0x58}, 8333},
+ {{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x6c,0x26}, 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,0x98,0x0d,0xc2,0x00,0x41,0x02,0x16,0x3e,0xff,0xfe,0x56,0xf6,0x59}, 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,0x4b,0xa0,0xff,0xff,0x01,0xbe,0x00,0x01,0x10,0x05,0x00,0x00,0x00,0x01}, 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,0x06,0x10,0x06,0x00,0x0a,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x06,0x7c,0x26,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 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,0x08,0xd8,0x09,0x65,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x93,0x43}, 8333},
+ {{0x20,0x01,0x09,0x80,0x46,0x50,0x00,0x01,0x02,0xe0,0x53,0xff,0xfe,0x13,0x24,0x49}, 8333},
+ {{0x20,0x01,0x09,0x81,0x00,0x46,0x00,0x01,0xba,0x27,0xeb,0xff,0xfe,0x5b,0xed,0xee}, 8333},
+ {{0x20,0x01,0x09,0xc8,0x53,0xe9,0x36,0x9a,0x02,0x26,0x2d,0xff,0xfe,0x1b,0x74,0x72}, 8333},
+ {{0x20,0x01,0x09,0xd8,0xca,0xfe,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87}, 8333},
+ {{0x20,0x01,0x0b,0x10,0x00,0x11,0x00,0x21,0x3e,0x07,0x54,0xff,0xfe,0x48,0x72,0x48}, 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,0x01,0x0b,0xc8,0x23,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x0b,0xc8,0x34,0x27,0x01,0x01,0x7a,0x4f,0x08,0xbe,0x26,0x11,0x6e,0x79}, 8333},
+ {{0x20,0x01,0x0b,0xc8,0x35,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x0c,0xc0,0xa0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x1d}, 8333},
+ {{0x20,0x01,0x0e,0x42,0x01,0x02,0x12,0x09,0x01,0x53,0x01,0x21,0x00,0x76,0x01,0x71}, 8333},
+ {{0x20,0x02,0x17,0xea,0x14,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xea,0x14,0xeb}, 8333},
+ {{0x20,0x02,0x02,0xf8,0x2b,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xf8,0x2b,0xc5}, 8333},
+ {{0x20,0x02,0x40,0x47,0x48,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x47,0x48,0x2c}, 8333},
+ {{0x20,0x02,0x45,0xc3,0x8c,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0xc3,0x8c,0xca}, 8333},
+ {{0x20,0x02,0x46,0xbb,0x8a,0x41,0x00,0x00,0x02,0x26,0xb0,0xff,0xfe,0xed,0x5f,0x12}, 8888},
+ {{0x20,0x02,0x46,0xbb,0x8c,0x3c,0x00,0x00,0x8d,0x55,0x8f,0xbb,0x15,0xfa,0xf4,0xe0}, 8765},
+ {{0x20,0x02,0x4c,0x48,0xa0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x48,0xa0,0xfe}, 8333},
+ {{0x20,0x02,0x4d,0x44,0x25,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x44,0x25,0xc8}, 8333},
+ {{0x20,0x02,0x50,0x5f,0xaa,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x5f,0xaa,0xa2}, 8333},
+ {{0x20,0x02,0x5b,0xc1,0x79,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xc1,0x79,0x9d}, 8333},
+ {{0x20,0x02,0x6d,0xec,0x54,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xec,0x54,0x72}, 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,0xac,0x52,0x94,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x52,0x94,0xe2}, 8333},
+ {{0x20,0x02,0xaf,0x7e,0x3e,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x7e,0x3e,0xca}, 8333},
{{0x20,0x02,0xb0,0x09,0x20,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x09,0x20,0xc5}, 8333},
+ {{0x20,0x02,0xc0,0x6f,0x39,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x6f,0x39,0xa0}, 8333},
+ {{0x20,0x02,0xc2,0x3a,0x73,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x3a,0x73,0x8a}, 8333},
+ {{0x20,0x02,0xc7,0x0f,0x74,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0f,0x74,0x42}, 8333},
+ {{0x20,0x02,0xce,0xc5,0xbe,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xc5,0xbe,0x4f}, 8333},
+ {{0x20,0x02,0xd1,0x49,0x9e,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x49,0x9e,0x3a}, 8333},
+ {{0x20,0x02,0xd9,0x17,0x0c,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x17,0x0c,0xa5}, 8333},
+ {{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x15,0x3f}, 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},
+ {{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xa8,0x19,0x34}, 8333},
+ {{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0xd6}, 8333},
+ {{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x42,0x80}, 8333},
+ {{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x66,0x0f}, 8333},
+ {{0x24,0x01,0x18,0x00,0x78,0x00,0x01,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x1c,0x05,0x59}, 8333},
+ {{0x24,0x01,0x18,0x00,0x78,0x00,0x01,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x1c,0x0a,0x7d}, 8333},
+ {{0x24,0x05,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40}, 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,0x26,0xbf,0xb6}, 8333},
+ {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0x88,0xe3}, 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,0x26,0xc4,0xb8}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x3b,0x1f,0x76}, 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,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x61,0x28,0x9b}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x69,0x89,0xe9}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0xac,0x15}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x98,0x68,0xbb}, 8333},
+ {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0x07,0x13}, 8333},
+ {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0x9e}, 8333},
+ {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x97,0xd8}, 8333},
+ {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x8f,0xeb}, 8333},
+ {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0xda,0x80}, 8333},
+ {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0x9b}, 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,0x67,0x0d,0x2e}, 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,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x4b,0xbe}, 8333},
+ {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xe4,0x4e,0x16}, 8333},
+ {{0x26,0x01,0x01,0x8d,0x83,0x00,0x58,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xe4}, 8333},
+ {{0x26,0x01,0x02,0x40,0x46,0x00,0x40,0xc0,0x02,0x50,0x56,0xff,0xfe,0xa4,0x63,0x05}, 8333},
+ {{0x26,0x01,0x05,0x81,0xc2,0x00,0xa7,0x19,0x54,0x2c,0x9c,0xd5,0x48,0x52,0xf7,0xd9}, 8333},
+ {{0x26,0x01,0x06,0x47,0x49,0x00,0x85,0xf1,0xca,0x2a,0x14,0xff,0xfe,0x51,0xbb,0x35}, 8333},
+ {{0x26,0x01,0x00,0xc2,0xc0,0x02,0xb3,0x00,0x54,0xa0,0x15,0xb5,0x19,0xf7,0x53,0x0d}, 8333},
+ {{0x26,0x02,0x03,0x06,0xcc,0xff,0xad,0x7f,0xb1,0x16,0x52,0xbe,0x64,0xba,0xdb,0x3a}, 8333},
+ {{0x26,0x02,0x00,0xae,0x19,0x82,0x94,0x00,0x08,0x46,0xf7,0x8c,0x0f,0xec,0x4d,0x57}, 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,0x75,0xd5,0xc1,0xc3}, 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,0xe8,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x9d,0x20,0x2e,0x3c}, 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,0x01,0x80,0x00,0x03,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0xde}, 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,0x04,0x60,0x00,0xff,0xc0,0x00,0x3c,0x64,0xa3,0x94,0xd0,0x4f,0x1d,0x1d,0xa8}, 8333},
+ {{0x26,0x05,0x60,0x00,0xf3,0x80,0x9a,0x01,0xba,0x09,0x8a,0xff,0xfe,0xd4,0x35,0x11}, 8333},
+ {{0x26,0x05,0x60,0x01,0xe0,0x0f,0x7b,0x00,0xc5,0x87,0x6d,0x91,0x6e,0xff,0xee,0xba}, 8333},
+ {{0x26,0x05,0xf7,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x25,0xc3,0x2a,0x3e}, 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,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x83}, 9334},
{{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,0x1c,0x2f,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,0x33,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x03,0x85,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,0x53,0x00,0x00,0x60,0x65,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x69,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x71,0x1a,0x00,0x78,0x00,0x00,0x00,0x00,0xa7,0xb5}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x07,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x08,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x95,0x2e,0x37,0x33,0x00,0x00,0x00,0x00,0x14,0x14}, 8333},
{{0x26,0x07,0xf1,0xc0,0x08,0x48,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x94,0x3c}, 8333},
+ {{0x26,0x07,0xf2,0xe0,0x00,0x0f,0x05,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x26,0x07,0xf7,0x48,0x12,0x00,0x00,0xf8,0x02,0x1e,0x67,0xff,0xfe,0x99,0x8f,0x07}, 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},
+ {{0x26,0x07,0xff,0x68,0x01,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x31}, 8333},
+ {{0x28,0x03,0x69,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x17}, 8333},
+ {{0x2a,0x00,0x10,0x98,0x00,0x00,0x00,0x80,0x10,0x00,0x00,0x25,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x00,0x11,0x78,0x00,0x02,0x00,0x43,0x50,0x54,0x00,0xff,0xfe,0x84,0xf8,0x6f}, 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,0x11,0x78,0x00,0x02,0x00,0x43,0x89,0x83,0xcc,0x27,0x0d,0x72,0xd9,0x7a}, 8333},
+ {{0x2a,0x00,0x13,0x28,0xe1,0x00,0xcc,0x42,0x02,0x30,0x48,0xff,0xfe,0x92,0x05,0x5c}, 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,0x00,0x16,0x30,0x00,0x02,0x18,0x02,0x01,0x88,0x01,0x22,0x00,0x91,0x00,0x11}, 8333},
+ {{0x2a,0x00,0x18,0xe0,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x00,0x18,0xe0,0x00,0x00,0xdc,0xc5,0x01,0x09,0x02,0x34,0x01,0x06,0x01,0x91}, 8333},
+ {{0x2a,0x00,0x1a,0x28,0x11,0x57,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xc7}, 8333},
+ {{0x2a,0x00,0x1c,0xa8,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0xfc,0x40,0xd1}, 8333},
+ {{0x2a,0x00,0x1c,0xa8,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x6d,0xce,0x2c}, 8333},
+ {{0x2a,0x00,0x71,0x43,0x01,0x00,0x00,0x00,0x02,0x16,0x3e,0xff,0xfe,0x2e,0x74,0xa3}, 8333},
+ {{0x2a,0x00,0x71,0x43,0x01,0x00,0x00,0x00,0x02,0x16,0x3e,0xff,0xfe,0xd3,0x5c,0x21}, 8333},
+ {{0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x23}, 8333},
+ {{0x2a,0x00,0xdc,0xc0,0x0e,0xda,0x00,0x98,0x01,0x83,0x01,0x93,0xc3,0x82,0x6b,0xdb}, 8333},
+ {{0x2a,0x00,0xdc,0xc0,0x0e,0xda,0x00,0x98,0x01,0x83,0x01,0x93,0xf7,0x2e,0xd9,0x43}, 8333},
+ {{0x2a,0x00,0xf8,0x20,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xaf,0x00,0x01}, 8333},
+ {{0x2a,0x00,0xf9,0x40,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x10,0x1d}, 8333},
+ {{0x2a,0x00,0xf9,0x40,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x06,0xac}, 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,0x02,0x38,0x42,0xdd,0xf9,0x00,0x7a,0x6c,0x2b,0xc6,0x40,0x41,0x0c,0x43}, 8333},
+ {{0x2a,0x01,0x02,0x38,0x43,0x13,0x63,0x00,0x21,0x89,0x1c,0x97,0x69,0x6b,0x05,0xea}, 8333},
+ {{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0x5c,0x33,0x91,0xf9,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,0x34,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x34,0xe4,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,0x0e,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,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 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,0x43,0xe4,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,0x23,0x4d,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,0x11,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x40,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 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,0x31,0x33,0xad,0xfe,0xa1,0x00,0x00,0x00,0x00,0x06,0x66}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x21,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x63,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x41,0x11,0x67,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,0x41,0x53,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x33,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x72,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02}, 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,0x21,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x41,0xc2,0x00,0x00,0x54,0x04,0xa6,0x7e,0xf2,0x50}, 8333},
{{0x2a,0x01,0x04,0xf8,0x01,0x51,0x51,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x52,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x54}, 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,0x60,0x51,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x72,0xc5,0x00,0x00,0x00,0x00,0x28,0x58,0xe1,0xc5}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x72,0xc5,0x00,0x00,0x00,0x00,0x59,0x3b,0x60,0xd5}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x81,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x13,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x22,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x51,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x60,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x70,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x91,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x21,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x44,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x51,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x0b,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x14,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x44,0x95,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,0x40,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x44,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x82,0x42,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,0x11,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x21,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x22,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x44,0x0b,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,0x23,0xd1,0x00,0x00,0x00,0x00,0xde,0xad,0xbe,0xef}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x50,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x51,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x53,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x53,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x19}, 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,0x21,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x02,0x33,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x03,0xe3,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,0x02,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x33,0x92,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,0x02,0x63,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x72,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x10,0x22,0x27,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,0x02,0x11,0x18,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x12,0x28,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x12,0x33,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 18333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x11,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x31,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x32,0x8c,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,0x04,0xf8,0x0c,0x17,0x19,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x1a,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x1a,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x02,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x04,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x07,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x0b,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x0d,0x16,0x93,0x84,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,0x06,0x80,0x00,0x10,0x00,0x10,0xf2,0xde,0xf1,0xff,0xfe,0xc9,0x0d,0xc0}, 8333},
+ {{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x01,0xf6,0x50,0x54,0x00,0xff,0xfe,0x30,0xe5,0x85}, 8333},
+ {{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x02,0x0b,0x50,0x54,0x00,0xff,0xfe,0x24,0x43,0x5e}, 8333},
+ {{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x04,0x3d,0x50,0x54,0x00,0xff,0xfe,0x4e,0x3d,0xd4}, 8333},
+ {{0x2a,0x01,0x07,0xc8,0xaa,0xad,0x02,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x07,0xc8,0xaa,0xb6,0x00,0xea,0x50,0x54,0x00,0xff,0xfe,0xff,0xea,0xc3}, 8333},
+ {{0x2a,0x01,0x07,0xc8,0xaa,0xb9,0x00,0x5a,0x50,0x54,0x00,0xff,0xfe,0x89,0x7b,0x26}, 8333},
+ {{0x2a,0x01,0x07,0xc8,0xaa,0xbc,0x02,0xc8,0x50,0x54,0x00,0xff,0xfe,0x35,0x65,0x81}, 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,0x18,0x39,0x42}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0x8c,0x87}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x62,0x06}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x67,0x55,0x9d}, 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,0x89,0x11,0x43}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x98,0x25,0x05}, 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,0x7e,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0xd7,0xb5}, 8333},
+ {{0x2a,0x01,0x0e,0x34,0xee,0x33,0x16,0x40,0xc5,0x04,0xf6,0x77,0xb2,0x8a,0xba,0x42}, 8333},
+ {{0x2a,0x01,0x0e,0x35,0x2e,0x7e,0x0b,0xc0,0xe0,0x79,0xf5,0x5e,0xce,0xf3,0xb5,0xd7}, 8333},
+ {{0x2a,0x01,0x0e,0x35,0x2e,0xe5,0x06,0x10,0x02,0x1f,0xd0,0xff,0xfe,0x4e,0x74,0x60}, 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,0x01,0x0e,0x35,0x8a,0xca,0x06,0xa0,0x02,0x11,0x0a,0xff,0xfe,0x5e,0x29,0x5e}, 8333},
+ {{0x2a,0x02,0x01,0x80,0x00,0x0a,0x00,0x18,0x00,0x81,0x00,0x07,0x00,0x11,0x00,0x50}, 8333},
+ {{0x2a,0x02,0x18,0x10,0x1d,0x87,0x6a,0x00,0x56,0x04,0xa6,0xff,0xfe,0x60,0xd8,0x7d}, 8333},
+ {{0x2a,0x02,0x21,0x68,0x11,0x44,0x5c,0x01,0xd6,0x3d,0x7e,0xff,0xfe,0xdd,0x4f,0x8e}, 8333},
+ {{0x2a,0x02,0x24,0x98,0x6d,0x7b,0x70,0x01,0xb5,0x08,0xb3,0x9d,0x2c,0xea,0x5b,0x7a}, 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,0x02,0x25,0x28,0x00,0xfa,0x1a,0x56,0x02,0x16,0x44,0xff,0xfe,0x6a,0xd1,0x12}, 8333},
+ {{0x2a,0x02,0x27,0xf8,0x20,0x12,0x00,0x00,0xe9,0xf7,0x26,0x8f,0xc4,0x41,0x61,0x29}, 8333},
+ {{0x2a,0x02,0x03,0x48,0x00,0x86,0x30,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x02,0x47,0x80,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x8a,0x01}, 8333},
+ {{0x2a,0x02,0x05,0x78,0x50,0x02,0x01,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x02,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x19,0x0b,0x69,0xe3}, 8333},
+ {{0x2a,0x02,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe8,0x93,0xd9,0xd6}, 8333},
+ {{0x2a,0x02,0x07,0x70,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x39}, 8333},
+ {{0x2a,0x02,0x7a,0xa0,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0xb3,0x81,0xa2}, 8333},
+ {{0x2a,0x02,0x80,0x10,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x59,0xb5}, 8333},
+ {{0x2a,0x02,0x81,0x0d,0x21,0xc0,0x0f,0x00,0xa2,0x48,0x1c,0xff,0xfe,0xb8,0x53,0x48}, 8333},
+ {{0x2a,0x02,0x0a,0x50,0x00,0x00,0x00,0x00,0x02,0x1b,0x24,0xff,0xfe,0x93,0x4e,0x39}, 8333},
+ {{0x2a,0x02,0x0a,0x80,0x00,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x01,0x58,0x30,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x05,0x46,0x92,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x03,0x00,0x00,0x71,0x58,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x22,0x44,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x03,0x33,0x39,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x03,0x78,0x44,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x05,0x62,0x88,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x03,0x00,0x00,0x59,0x12,0x00,0x01}, 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,0x40,0x00,0x00,0x06,0x80,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x03,0x40,0x00,0x00,0x06,0x80,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0xd0}, 8333},
+ {{0x2a,0x03,0x49,0x00,0xff,0xfc,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x0d,0x50,0x01}, 8333},
+ {{0x2a,0x03,0x0f,0x80,0xed,0x15,0x01,0x49,0x01,0x54,0x01,0x55,0x02,0x35,0x00,0x01}, 8333},
+ {{0x2a,0x03,0x0f,0x80,0xed,0x15,0x01,0x49,0x01,0x54,0x01,0x55,0x02,0x41,0x00,0x01}, 8333},
{{0x2a,0x03,0x0f,0x80,0xed,0x16,0x0c,0xa7,0xea,0x75,0xb1,0x2d,0x02,0xaf,0x9e,0x2a}, 8333},
+ {{0x2a,0x04,0x19,0x80,0x31,0x00,0x1a,0xab,0x02,0x90,0xfa,0xff,0xfe,0x70,0xa3,0xd8}, 8333},
+ {{0x2a,0x04,0x19,0x80,0x31,0x00,0x1a,0xab,0xe6,0x1d,0x2d,0xff,0xfe,0x29,0xf5,0x90}, 8333},
+ {{0x2a,0x04,0x2f,0x80,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89}, 8333},
+ {{0x2a,0x04,0xac,0x00,0x00,0x01,0x4a,0x0b,0x50,0x54,0x00,0xff,0xfe,0x00,0x5a,0xf5}, 8333},
+ {{0x2a,0x04,0xad,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0xda}, 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,0xdb,0x58,0x10,0x81,0x48,0x69,0x2c,0xb3,0x0d,0x6d}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe2,0x7f,0xf3,0x20,0xef,0x72,0xaf,0x4d,0x29,0x3c}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xef,0x3c,0x49,0x0b,0xc1,0x74,0xc2,0x92,0x86,0xe1}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe8,0x27,0xf9,0x43,0xad,0x67,0xfd,0x74,0x25,0x43}, 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,0x07,0x9c,0x11,0x9b,0x2d,0xf7,0xd7,0xf2,0x5e,0x9b}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x00,0x7d,0xc3,0xfd,0xcb,0x7a,0xff,0x07,0xdc,0x48}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x03,0x34,0x0e,0x44,0x07,0x5c,0xcb,0x4b,0xe7,0xcb}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x06,0x69,0x75,0xcb,0x88,0x3c,0x63,0xa6,0x11,0xff}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0x26,0x27,0x21,0xbf,0x0a,0x38,0xe7,0xfe,0xc1}, 8333},
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0x26,0x27,0x21,0xae,0x94,0xd5,0xc2,0x72,0x24}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0xbf,0x87,0xf8,0x8f,0x6b,0x04,0xb5,0xc3,0xfa}, 8333},
{{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,0x11,0x08,0x94,0x72,0x0f,0x2c,0xb6,0xc9,0x6f,0x22}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x12,0xc9,0x76,0x66,0x08,0x77,0xf0,0x71,0x81,0xdc}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x30,0x7b,0x87,0xc2,0x7e,0xd8,0xe9,0xbb,0x14,0xed}, 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,0x6f,0x34,0x7f,0xc7,0xce,0xa3,0x04,0x59,0x06,0x32}, 4176},
{{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,0x7a,0x4c,0x71,0x22,0xb9,0x53,0x89,0x19,0x12,0x43}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8d,0xbe,0xe1,0x25,0x73,0x45,0xf5,0xe6,0x10,0xad}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa5,0xa5,0xf4,0x4c,0x8f,0xfb,0xb7,0x84,0x36,0xee}, 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}
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb3,0xd1,0xf8,0xbe,0xa7,0x6b,0x46,0xbe,0xe8,0x84}, 8333}
};
static SeedSpec6 pnSeed6_test[] = {
diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp
index a9822eed89..aefddce464 100644
--- a/src/checkpoints.cpp
+++ b/src/checkpoints.cpp
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/checkpoints.h b/src/checkpoints.h
index 5fce6fa81e..cd25ea5379 100644
--- a/src/checkpoints.h
+++ b/src/checkpoints.h
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/checkqueue.h b/src/checkqueue.h
index 20ba25bb41..32e25d5c8c 100644
--- a/src/checkqueue.h
+++ b/src/checkqueue.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
diff --git a/src/clientversion.cpp b/src/clientversion.cpp
index aae0569bba..bfe9e16f80 100644
--- a/src/clientversion.cpp
+++ b/src/clientversion.cpp
@@ -67,16 +67,7 @@ const std::string CLIENT_NAME("Satoshi");
#endif
#endif
-#ifndef BUILD_DATE
-#ifdef GIT_COMMIT_DATE
-#define BUILD_DATE GIT_COMMIT_DATE
-#else
-#define BUILD_DATE __DATE__ ", " __TIME__
-#endif
-#endif
-
const std::string CLIENT_BUILD(BUILD_DESC CLIENT_VERSION_SUFFIX);
-const std::string CLIENT_DATE(BUILD_DATE);
static std::string FormatVersion(int nVersion)
{
diff --git a/src/clientversion.h b/src/clientversion.h
index 5a06b310a3..53ad460346 100644
--- a/src/clientversion.h
+++ b/src/clientversion.h
@@ -1,4 +1,4 @@
-// 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.
@@ -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 11
+#define CLIENT_VERSION_MINOR 13
#define CLIENT_VERSION_REVISION 99
#define CLIENT_VERSION_BUILD 0
@@ -26,7 +26,7 @@
* Copyright year (2009-this)
* Todo: update this when changing our copyright comments in the source
*/
-#define COPYRIGHT_YEAR 2015
+#define COPYRIGHT_YEAR 2016
#endif //HAVE_CONFIG_H
@@ -38,7 +38,7 @@
#define DO_STRINGIZE(X) #X
//! Copyright string used in Windows .rc files
-#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " The Bitcoin Core Developers"
+#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " " COPYRIGHT_HOLDERS_FINAL
/**
* bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
@@ -59,7 +59,6 @@ static const int CLIENT_VERSION =
extern const std::string CLIENT_NAME;
extern const std::string CLIENT_BUILD;
-extern const std::string CLIENT_DATE;
std::string FormatFullVersion();
diff --git a/src/coincontrol.h b/src/coincontrol.h
index 3945644ce8..e33adc4d2b 100644
--- a/src/coincontrol.h
+++ b/src/coincontrol.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -18,6 +18,10 @@ public:
bool fAllowWatchOnly;
//! Minimum absolute fee (not per kilobyte)
CAmount nMinimumTotalFee;
+ //! Override estimated feerate
+ bool fOverrideFeeRate;
+ //! Feerate to use if overrideFeeRate is true
+ CFeeRate nFeeRate;
CCoinControl()
{
@@ -31,6 +35,8 @@ public:
fAllowWatchOnly = false;
setSelected.clear();
nMinimumTotalFee = 0;
+ nFeeRate = CFeeRate(0);
+ fOverrideFeeRate = false;
}
bool HasSelected() const
@@ -38,10 +44,9 @@ public:
return (setSelected.size() > 0);
}
- bool IsSelected(const uint256& hash, unsigned int n) const
+ bool IsSelected(const COutPoint& output) const
{
- COutPoint outpt(hash, n);
- return (setSelected.count(outpt) > 0);
+ return (setSelected.count(output) > 0);
}
void Select(const COutPoint& output)
diff --git a/src/coins.cpp b/src/coins.cpp
index 122bf4e48d..8ff652b474 100644
--- a/src/coins.cpp
+++ b/src/coins.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
@@ -45,7 +45,7 @@ bool CCoinsView::GetCoins(const uint256 &txid, CCoins &coins) const { return fal
bool CCoinsView::HaveCoins(const uint256 &txid) const { return false; }
uint256 CCoinsView::GetBestBlock() const { return uint256(); }
bool CCoinsView::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) { return false; }
-bool CCoinsView::GetStats(CCoinsStats &stats) const { return false; }
+CCoinsViewCursor *CCoinsView::Cursor() const { return 0; }
CCoinsViewBacked::CCoinsViewBacked(CCoinsView *viewIn) : base(viewIn) { }
@@ -54,9 +54,9 @@ bool CCoinsViewBacked::HaveCoins(const uint256 &txid) const { return base->HaveC
uint256 CCoinsViewBacked::GetBestBlock() const { return base->GetBestBlock(); }
void CCoinsViewBacked::SetBackend(CCoinsView &viewIn) { base = &viewIn; }
bool CCoinsViewBacked::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) { return base->BatchWrite(mapCoins, hashBlock); }
-bool CCoinsViewBacked::GetStats(CCoinsStats &stats) const { return base->GetStats(stats); }
+CCoinsViewCursor *CCoinsViewBacked::Cursor() const { return base->Cursor(); }
-CCoinsKeyHasher::CCoinsKeyHasher() : salt(GetRandHash()) {}
+SaltedTxidHasher::SaltedTxidHasher() : k0(GetRand(std::numeric_limits<uint64_t>::max())), k1(GetRand(std::numeric_limits<uint64_t>::max())) {}
CCoinsViewCache::CCoinsViewCache(CCoinsView *baseIn) : CCoinsViewBacked(baseIn), hasModifier(false), cachedCoinsUsage(0) { }
@@ -117,11 +117,17 @@ CCoinsModifier CCoinsViewCache::ModifyCoins(const uint256 &txid) {
return CCoinsModifier(*this, ret.first, cachedCoinUsage);
}
-CCoinsModifier CCoinsViewCache::ModifyNewCoins(const uint256 &txid) {
+// ModifyNewCoins has to know whether the new outputs its creating are for a
+// coinbase or not. If they are for a coinbase, it can not mark them as fresh.
+// This is to ensure that the historical duplicate coinbases before BIP30 was
+// in effect will still be properly overwritten when spent.
+CCoinsModifier CCoinsViewCache::ModifyNewCoins(const uint256 &txid, bool coinbase) {
assert(!hasModifier);
std::pair<CCoinsMap::iterator, bool> ret = cacheCoins.insert(std::make_pair(txid, CCoinsCacheEntry()));
ret.first->second.coins.Clear();
- ret.first->second.flags = CCoinsCacheEntry::FRESH;
+ if (!coinbase) {
+ ret.first->second.flags = CCoinsCacheEntry::FRESH;
+ }
ret.first->second.flags |= CCoinsCacheEntry::DIRTY;
return CCoinsModifier(*this, ret.first, 0);
}
@@ -269,7 +275,7 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight, CAmount
assert(coins);
if (!coins->IsAvailable(txin.prevout.n)) continue;
if (coins->nHeight <= nHeight) {
- dResult += coins->vout[txin.prevout.n].nValue * (nHeight-coins->nHeight);
+ dResult += (double)(coins->vout[txin.prevout.n].nValue) * (nHeight-coins->nHeight);
inChainInputValue += coins->vout[txin.prevout.n].nValue;
}
}
@@ -294,3 +300,7 @@ CCoinsModifier::~CCoinsModifier()
cache.cachedCoinsUsage += it->second.coins.DynamicMemoryUsage();
}
}
+
+CCoinsViewCursor::~CCoinsViewCursor()
+{
+}
diff --git a/src/coins.h b/src/coins.h
index 60c1ba8a78..033651a435 100644
--- a/src/coins.h
+++ b/src/coins.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -8,6 +8,7 @@
#include "compressor.h"
#include "core_memusage.h"
+#include "hash.h"
#include "memusage.h"
#include "serialize.h"
#include "uint256.h"
@@ -264,21 +265,22 @@ public:
}
};
-class CCoinsKeyHasher
+class SaltedTxidHasher
{
private:
- uint256 salt;
+ /** Salt */
+ const uint64_t k0, k1;
public:
- CCoinsKeyHasher();
+ SaltedTxidHasher();
/**
* This *must* return size_t. With Boost 1.46 on 32-bit systems the
* unordered_map will behave unpredictably if the custom hasher returns a
* uint64_t, resulting in failures when syncing the chain (#4634).
*/
- size_t operator()(const uint256& key) const {
- return key.GetHash(salt);
+ size_t operator()(const uint256& txid) const {
+ return SipHashUint256(k0, k1, txid);
}
};
@@ -295,21 +297,28 @@ struct CCoinsCacheEntry
CCoinsCacheEntry() : coins(), flags(0) {}
};
-typedef boost::unordered_map<uint256, CCoinsCacheEntry, CCoinsKeyHasher> CCoinsMap;
+typedef boost::unordered_map<uint256, CCoinsCacheEntry, SaltedTxidHasher> CCoinsMap;
-struct CCoinsStats
+/** Cursor for iterating over CoinsView state */
+class CCoinsViewCursor
{
- int nHeight;
- uint256 hashBlock;
- uint64_t nTransactions;
- uint64_t nTransactionOutputs;
- uint64_t nSerializedSize;
- uint256 hashSerialized;
- CAmount nTotalAmount;
+public:
+ CCoinsViewCursor(const uint256 &hashBlockIn): hashBlock(hashBlockIn) {}
+ virtual ~CCoinsViewCursor();
- CCoinsStats() : nHeight(0), nTransactions(0), nTransactionOutputs(0), nSerializedSize(0), nTotalAmount(0) {}
-};
+ virtual bool GetKey(uint256 &key) const = 0;
+ virtual bool GetValue(CCoins &coins) const = 0;
+ /* Don't care about GetKeySize here */
+ virtual unsigned int GetValueSize() const = 0;
+ virtual bool Valid() const = 0;
+ virtual void Next() = 0;
+
+ //! Get best block at the time this cursor was created
+ const uint256 &GetBestBlock() const { return hashBlock; }
+private:
+ uint256 hashBlock;
+};
/** Abstract view on the open txout dataset. */
class CCoinsView
@@ -329,8 +338,8 @@ public:
//! The passed mapCoins can be modified.
virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
- //! Calculate statistics about the unspent transaction output set
- virtual bool GetStats(CCoinsStats &stats) const;
+ //! Get a cursor to iterate over the whole state
+ virtual CCoinsViewCursor *Cursor() const;
//! As we use CCoinsViews polymorphically, have a virtual destructor
virtual ~CCoinsView() {}
@@ -350,7 +359,7 @@ public:
uint256 GetBestBlock() const;
void SetBackend(CCoinsView &viewIn);
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
- bool GetStats(CCoinsStats &stats) const;
+ CCoinsViewCursor *Cursor() const;
};
@@ -435,7 +444,7 @@ public:
* would not properly overwrite the first coinbase of the pair. Simultaneous modifications
* are not allowed.
*/
- CCoinsModifier ModifyNewCoins(const uint256 &txid);
+ CCoinsModifier ModifyNewCoins(const uint256 &txid, bool coinbase);
/**
* Push the modifications applied to this cache to its base.
diff --git a/src/compat.h b/src/compat.h
index 20c2a25143..79a297e5e4 100644
--- a/src/compat.h
+++ b/src/compat.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -78,17 +78,6 @@ typedef u_int SOCKET;
#define MSG_NOSIGNAL 0
#endif
-#ifndef WIN32
-// PRIO_MAX is not defined on Solaris
-#ifndef PRIO_MAX
-#define PRIO_MAX 20
-#endif
-#define THREAD_PRIORITY_LOWEST PRIO_MAX
-#define THREAD_PRIORITY_BELOW_NORMAL 2
-#define THREAD_PRIORITY_NORMAL 0
-#define THREAD_PRIORITY_ABOVE_NORMAL (-2)
-#endif
-
#if HAVE_DECL_STRNLEN == 0
size_t strnlen( const char *start, size_t max_len);
#endif // HAVE_DECL_STRNLEN
diff --git a/src/compat/endian.h b/src/compat/endian.h
index 9fec2a07fa..6bfae42c77 100644
--- a/src/compat/endian.h
+++ b/src/compat/endian.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2014 The Bitcoin developers
+// Copyright (c) 2014-2015 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
diff --git a/src/compressor.h b/src/compressor.h
index 4a72090830..fa702f0dfa 100644
--- a/src/compressor.h
+++ b/src/compressor.h
@@ -86,8 +86,14 @@ public:
return;
}
nSize -= nSpecialScripts;
- script.resize(nSize);
- s >> REF(CFlatData(script));
+ if (nSize > MAX_SCRIPT_SIZE) {
+ // Overly long script, replace with a short invalid one
+ script << OP_RETURN;
+ s.ignore(nSize);
+ } else {
+ script.resize(nSize);
+ s >> REF(CFlatData(script));
+ }
}
};
diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h
index 6d6ce7e099..6908565866 100644
--- a/src/consensus/consensus.h
+++ b/src/consensus/consensus.h
@@ -1,20 +1,29 @@
// Copyright (c) 2009-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.
#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;
+#include <stdint.h>
+
+/** The maximum allowed size for a serialized block, in bytes (only for buffer size limits) */
+static const unsigned int MAX_BLOCK_SERIALIZED_SIZE = 4000000;
+/** The maximum allowed weight for a block, see BIP 141 (network rule) */
+static const unsigned int MAX_BLOCK_WEIGHT = 4000000;
+/** The maximum allowed size for a block excluding witness data, in bytes (network rule) */
+static const unsigned int MAX_BLOCK_BASE_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;
+static const int64_t MAX_BLOCK_SIGOPS_COST = 80000;
/** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */
static const int COINBASE_MATURITY = 100;
-/** Flags for LockTime() */
+/** Flags for nSequence and nLockTime locks */
enum {
+ /* Interpret sequence numbers as relative lock-time constraints. */
+ LOCKTIME_VERIFY_SEQUENCE = (1 << 0),
+
/* Use GetMedianTimePast() instead of nTime for end point timestamp. */
LOCKTIME_MEDIAN_TIME_PAST = (1 << 1),
};
diff --git a/src/consensus/merkle.cpp b/src/consensus/merkle.cpp
index 9a8afa8a33..35f7d2e05a 100644
--- a/src/consensus/merkle.cpp
+++ b/src/consensus/merkle.cpp
@@ -1,3 +1,7 @@
+// 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 "merkle.h"
#include "hash.h"
#include "utilstrencodings.h"
@@ -161,6 +165,17 @@ uint256 BlockMerkleRoot(const CBlock& block, bool* mutated)
return ComputeMerkleRoot(leaves, mutated);
}
+uint256 BlockWitnessMerkleRoot(const CBlock& block, bool* mutated)
+{
+ std::vector<uint256> leaves;
+ leaves.resize(block.vtx.size());
+ leaves[0].SetNull(); // The witness hash of the coinbase is 0.
+ for (size_t s = 1; s < block.vtx.size(); s++) {
+ leaves[s] = block.vtx[s].GetWitnessHash();
+ }
+ return ComputeMerkleRoot(leaves, mutated);
+}
+
std::vector<uint256> BlockMerkleBranch(const CBlock& block, uint32_t position)
{
std::vector<uint256> leaves;
diff --git a/src/consensus/merkle.h b/src/consensus/merkle.h
index 6ef59745ac..194aea9b75 100644
--- a/src/consensus/merkle.h
+++ b/src/consensus/merkle.h
@@ -23,6 +23,12 @@ uint256 ComputeMerkleRootFromBranch(const uint256& leaf, const std::vector<uint2
uint256 BlockMerkleRoot(const CBlock& block, bool* mutated = NULL);
/*
+ * Compute the Merkle root of the witness transactions in a block.
+ * *mutated is set to true if a duplicated subtree was found.
+ */
+uint256 BlockWitnessMerkleRoot(const CBlock& block, bool* mutated = NULL);
+
+/*
* Compute the Merkle branch for the tree of transactions in a block, for a
* given position.
* This can be verified using ComputeMerkleRootFromBranch.
diff --git a/src/consensus/params.h b/src/consensus/params.h
index 5ebc48a8df..0e73cace83 100644
--- a/src/consensus/params.h
+++ b/src/consensus/params.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -7,21 +7,53 @@
#define BITCOIN_CONSENSUS_PARAMS_H
#include "uint256.h"
+#include <map>
+#include <string>
namespace Consensus {
+
+enum DeploymentPos
+{
+ DEPLOYMENT_TESTDUMMY,
+ DEPLOYMENT_CSV, // Deployment of BIP68, BIP112, and BIP113.
+ DEPLOYMENT_SEGWIT, // Deployment of BIP141, BIP143, and BIP147.
+ // NOTE: Also add new deployments to VersionBitsDeploymentInfo in versionbits.cpp
+ MAX_VERSION_BITS_DEPLOYMENTS
+};
+
+/**
+ * Struct for each individual consensus rule change using BIP9.
+ */
+struct BIP9Deployment {
+ /** Bit position to select the particular bit in nVersion. */
+ int bit;
+ /** Start MedianTime for version bits miner confirmation. Can be a date in the past */
+ int64_t nStartTime;
+ /** Timeout/expiry MedianTime for the deployment attempt. */
+ int64_t nTimeout;
+};
+
/**
* Parameters that influence chain consensus.
*/
struct Params {
uint256 hashGenesisBlock;
int nSubsidyHalvingInterval;
- /** Used to check majorities for block version upgrade */
- int nMajorityEnforceBlockUpgrade;
- int nMajorityRejectBlockOutdated;
- int nMajorityWindow;
/** Block height and hash at which BIP34 becomes active */
int BIP34Height;
uint256 BIP34Hash;
+ /** Block height at which BIP65 becomes active */
+ int BIP65Height;
+ /** Block height at which BIP66 becomes active */
+ int BIP66Height;
+ /**
+ * Minimum blocks including miner confirmation of the total of 2016 blocks in a retargetting period,
+ * (nPowTargetTimespan / nPowTargetSpacing) which is also used for BIP9 deployments.
+ * Examples: 1916 for 95%, 1512 for testchains.
+ */
+ uint32_t nRuleChangeActivationThreshold;
+ uint32_t nMinerConfirmationWindow;
+ BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS];
/** Proof of work parameters */
uint256 powLimit;
bool fPowAllowMinDifficultyBlocks;
diff --git a/src/consensus/validation.h b/src/consensus/validation.h
index d6051edc38..3e24294a64 100644
--- a/src/consensus/validation.h
+++ b/src/consensus/validation.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -22,9 +22,9 @@ static const unsigned char REJECT_CHECKPOINT = 0x43;
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_VALID, //!< everything ok
+ MODE_INVALID, //!< network rule violation (DoS value may be set)
+ MODE_ERROR, //!< run-time error
} mode;
int nDoS;
std::string strRejectReason;
@@ -77,6 +77,9 @@ public:
bool CorruptionPossible() const {
return corruptionPossible;
}
+ void SetCorruptionPossible() {
+ corruptionPossible = true;
+ }
unsigned int GetRejectCode() const { return chRejectCode; }
std::string GetRejectReason() const { return strRejectReason; }
std::string GetDebugMessage() const { return strDebugMessage; }
diff --git a/src/core_io.h b/src/core_io.h
index ba5b4e6487..b559d44bf5 100644
--- a/src/core_io.h
+++ b/src/core_io.h
@@ -1,4 +1,4 @@
-// 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.
@@ -17,7 +17,7 @@ class UniValue;
// core_read.cpp
extern CScript ParseScript(const std::string& s);
extern std::string ScriptToAsmStr(const CScript& script, const bool fAttemptSighashDecode = false);
-extern bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx);
+extern bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx, bool fTryNoWitness = false);
extern bool DecodeHexBlk(CBlock&, const std::string& strHexBlk);
extern uint256 ParseHashUV(const UniValue& v, const std::string& strName);
extern uint256 ParseHashStr(const std::string&, const std::string& strName);
diff --git a/src/core_memusage.h b/src/core_memusage.h
index 450537d059..b8e0f08bbf 100644
--- a/src/core_memusage.h
+++ b/src/core_memusage.h
@@ -25,8 +25,28 @@ static inline size_t RecursiveDynamicUsage(const CTxOut& out) {
return RecursiveDynamicUsage(out.scriptPubKey);
}
+static inline size_t RecursiveDynamicUsage(const CScriptWitness& scriptWit) {
+ size_t mem = memusage::DynamicUsage(scriptWit.stack);
+ for (std::vector<std::vector<unsigned char> >::const_iterator it = scriptWit.stack.begin(); it != scriptWit.stack.end(); it++) {
+ mem += memusage::DynamicUsage(*it);
+ }
+ return mem;
+}
+
+static inline size_t RecursiveDynamicUsage(const CTxInWitness& txinwit) {
+ return RecursiveDynamicUsage(txinwit.scriptWitness);
+}
+
+static inline size_t RecursiveDynamicUsage(const CTxWitness& txwit) {
+ size_t mem = memusage::DynamicUsage(txwit.vtxinwit);
+ for (std::vector<CTxInWitness>::const_iterator it = txwit.vtxinwit.begin(); it != txwit.vtxinwit.end(); it++) {
+ mem += RecursiveDynamicUsage(*it);
+ }
+ return mem;
+}
+
static inline size_t RecursiveDynamicUsage(const CTransaction& tx) {
- size_t mem = memusage::DynamicUsage(tx.vin) + memusage::DynamicUsage(tx.vout);
+ size_t mem = memusage::DynamicUsage(tx.vin) + memusage::DynamicUsage(tx.vout) + RecursiveDynamicUsage(tx.wit);
for (std::vector<CTxIn>::const_iterator it = tx.vin.begin(); it != tx.vin.end(); it++) {
mem += RecursiveDynamicUsage(*it);
}
@@ -37,7 +57,7 @@ static inline size_t RecursiveDynamicUsage(const CTransaction& tx) {
}
static inline size_t RecursiveDynamicUsage(const CMutableTransaction& tx) {
- size_t mem = memusage::DynamicUsage(tx.vin) + memusage::DynamicUsage(tx.vout);
+ size_t mem = memusage::DynamicUsage(tx.vin) + memusage::DynamicUsage(tx.vout) + RecursiveDynamicUsage(tx.wit);
for (std::vector<CTxIn>::const_iterator it = tx.vin.begin(); it != tx.vin.end(); it++) {
mem += RecursiveDynamicUsage(*it);
}
diff --git a/src/core_read.cpp b/src/core_read.cpp
index 4be24f8e09..7cfda6dd6d 100644
--- a/src/core_read.cpp
+++ b/src/core_read.cpp
@@ -1,4 +1,4 @@
-// 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.
@@ -90,12 +90,26 @@ CScript ParseScript(const std::string& s)
return result;
}
-bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx)
+bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx, bool fTryNoWitness)
{
if (!IsHex(strHexTx))
return false;
vector<unsigned char> txData(ParseHex(strHexTx));
+
+ if (fTryNoWitness) {
+ CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS);
+ try {
+ ssData >> tx;
+ if (ssData.eof()) {
+ return true;
+ }
+ }
+ catch (const std::exception&) {
+ // Fall through.
+ }
+ }
+
CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION);
try {
ssData >> tx;
diff --git a/src/core_write.cpp b/src/core_write.cpp
index 533fedfe7a..ea01ddc10d 100644
--- a/src/core_write.cpp
+++ b/src/core_write.cpp
@@ -1,4 +1,4 @@
-// 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.
@@ -35,7 +35,7 @@ string FormatScript(const CScript& script)
} else if ((op >= OP_1 && op <= OP_16) || op == OP_1NEGATE) {
ret += strprintf("%i ", op - OP_1NEGATE - 1);
continue;
- } else if (op >= OP_NOP && op <= OP_CHECKMULTISIGVERIFY) {
+ } else if (op >= OP_NOP && op <= OP_NOP10) {
string str(GetOpName(op));
if (str.substr(0, 3) == string("OP_")) {
ret += str.substr(3, string::npos) + " ";
@@ -45,7 +45,7 @@ string FormatScript(const CScript& script)
if (vch.size() > 0) {
ret += strprintf("0x%x 0x%x ", HexStr(it2, it - vch.size()), HexStr(it - vch.size(), it));
} else {
- ret += strprintf("0x%x", HexStr(it2, it));
+ ret += strprintf("0x%x ", HexStr(it2, it));
}
continue;
}
@@ -151,11 +151,13 @@ void ScriptPubKeyToUniv(const CScript& scriptPubKey,
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry)
{
entry.pushKV("txid", tx.GetHash().GetHex());
+ entry.pushKV("hash", tx.GetWitnessHash().GetHex());
entry.pushKV("version", tx.nVersion);
entry.pushKV("locktime", (int64_t)tx.nLockTime);
UniValue vin(UniValue::VARR);
- BOOST_FOREACH(const CTxIn& txin, tx.vin) {
+ for (unsigned int i = 0; i < tx.vin.size(); i++) {
+ const CTxIn& txin = tx.vin[i];
UniValue in(UniValue::VOBJ);
if (tx.IsCoinBase())
in.pushKV("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()));
@@ -166,6 +168,13 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry)
o.pushKV("asm", ScriptToAsmStr(txin.scriptSig, true));
o.pushKV("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()));
in.pushKV("scriptSig", o);
+ if (!tx.wit.IsNull() && i < tx.wit.vtxinwit.size() && !tx.wit.vtxinwit[i].IsNull()) {
+ UniValue txinwitness(UniValue::VARR);
+ for (const auto& item : tx.wit.vtxinwit[i].scriptWitness.stack) {
+ txinwitness.push_back(HexStr(item.begin(), item.end()));
+ }
+ in.pushKV("txinwitness", txinwitness);
+ }
}
in.pushKV("sequence", (int64_t)txin.nSequence);
vin.push_back(in);
diff --git a/src/crypto/aes.cpp b/src/crypto/aes.cpp
new file mode 100644
index 0000000000..1d469d0fb4
--- /dev/null
+++ b/src/crypto/aes.cpp
@@ -0,0 +1,217 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "aes.h"
+#include "crypto/common.h"
+
+#include <assert.h>
+#include <string.h>
+
+extern "C" {
+#include "crypto/ctaes/ctaes.c"
+}
+
+AES128Encrypt::AES128Encrypt(const unsigned char key[16])
+{
+ AES128_init(&ctx, key);
+}
+
+AES128Encrypt::~AES128Encrypt()
+{
+ memset(&ctx, 0, sizeof(ctx));
+}
+
+void AES128Encrypt::Encrypt(unsigned char ciphertext[16], const unsigned char plaintext[16]) const
+{
+ AES128_encrypt(&ctx, 1, ciphertext, plaintext);
+}
+
+AES128Decrypt::AES128Decrypt(const unsigned char key[16])
+{
+ AES128_init(&ctx, key);
+}
+
+AES128Decrypt::~AES128Decrypt()
+{
+ memset(&ctx, 0, sizeof(ctx));
+}
+
+void AES128Decrypt::Decrypt(unsigned char plaintext[16], const unsigned char ciphertext[16]) const
+{
+ AES128_decrypt(&ctx, 1, plaintext, ciphertext);
+}
+
+AES256Encrypt::AES256Encrypt(const unsigned char key[32])
+{
+ AES256_init(&ctx, key);
+}
+
+AES256Encrypt::~AES256Encrypt()
+{
+ memset(&ctx, 0, sizeof(ctx));
+}
+
+void AES256Encrypt::Encrypt(unsigned char ciphertext[16], const unsigned char plaintext[16]) const
+{
+ AES256_encrypt(&ctx, 1, ciphertext, plaintext);
+}
+
+AES256Decrypt::AES256Decrypt(const unsigned char key[32])
+{
+ AES256_init(&ctx, key);
+}
+
+AES256Decrypt::~AES256Decrypt()
+{
+ memset(&ctx, 0, sizeof(ctx));
+}
+
+void AES256Decrypt::Decrypt(unsigned char plaintext[16], const unsigned char ciphertext[16]) const
+{
+ AES256_decrypt(&ctx, 1, plaintext, ciphertext);
+}
+
+
+template <typename T>
+static int CBCEncrypt(const T& enc, const unsigned char iv[AES_BLOCKSIZE], const unsigned char* data, int size, bool pad, unsigned char* out)
+{
+ int written = 0;
+ int padsize = size % AES_BLOCKSIZE;
+ unsigned char mixed[AES_BLOCKSIZE];
+
+ if (!data || !size || !out)
+ return 0;
+
+ if (!pad && padsize != 0)
+ return 0;
+
+ memcpy(mixed, iv, AES_BLOCKSIZE);
+
+ // Write all but the last block
+ while (written + AES_BLOCKSIZE <= size) {
+ for (int i = 0; i != AES_BLOCKSIZE; i++)
+ mixed[i] ^= *data++;
+ enc.Encrypt(out + written, mixed);
+ memcpy(mixed, out + written, AES_BLOCKSIZE);
+ written += AES_BLOCKSIZE;
+ }
+ if (pad) {
+ // For all that remains, pad each byte with the value of the remaining
+ // space. If there is none, pad by a full block.
+ for (int i = 0; i != padsize; i++)
+ mixed[i] ^= *data++;
+ for (int i = padsize; i != AES_BLOCKSIZE; i++)
+ mixed[i] ^= AES_BLOCKSIZE - padsize;
+ enc.Encrypt(out + written, mixed);
+ written += AES_BLOCKSIZE;
+ }
+ return written;
+}
+
+template <typename T>
+static int CBCDecrypt(const T& dec, const unsigned char iv[AES_BLOCKSIZE], const unsigned char* data, int size, bool pad, unsigned char* out)
+{
+ unsigned char padsize = 0;
+ int written = 0;
+ bool fail = false;
+ const unsigned char* prev = iv;
+
+ if (!data || !size || !out)
+ return 0;
+
+ if (size % AES_BLOCKSIZE != 0)
+ return 0;
+
+ // Decrypt all data. Padding will be checked in the output.
+ while (written != size) {
+ dec.Decrypt(out, data + written);
+ for (int i = 0; i != AES_BLOCKSIZE; i++)
+ *out++ ^= prev[i];
+ prev = data + written;
+ written += AES_BLOCKSIZE;
+ }
+
+ // When decrypting padding, attempt to run in constant-time
+ if (pad) {
+ // If used, padding size is the value of the last decrypted byte. For
+ // it to be valid, It must be between 1 and AES_BLOCKSIZE.
+ padsize = *--out;
+ fail = !padsize | (padsize > AES_BLOCKSIZE);
+
+ // If not well-formed, treat it as though there's no padding.
+ padsize *= !fail;
+
+ // All padding must equal the last byte otherwise it's not well-formed
+ for (int i = AES_BLOCKSIZE; i != 0; i--)
+ fail |= ((i > AES_BLOCKSIZE - padsize) & (*out-- != padsize));
+
+ written -= padsize;
+ }
+ return written * !fail;
+}
+
+AES256CBCEncrypt::AES256CBCEncrypt(const unsigned char key[AES256_KEYSIZE], const unsigned char ivIn[AES_BLOCKSIZE], bool padIn)
+ : enc(key), pad(padIn)
+{
+ memcpy(iv, ivIn, AES_BLOCKSIZE);
+}
+
+int AES256CBCEncrypt::Encrypt(const unsigned char* data, int size, unsigned char* out) const
+{
+ return CBCEncrypt(enc, iv, data, size, pad, out);
+}
+
+AES256CBCEncrypt::~AES256CBCEncrypt()
+{
+ memset(iv, 0, sizeof(iv));
+}
+
+AES256CBCDecrypt::AES256CBCDecrypt(const unsigned char key[AES256_KEYSIZE], const unsigned char ivIn[AES_BLOCKSIZE], bool padIn)
+ : dec(key), pad(padIn)
+{
+ memcpy(iv, ivIn, AES_BLOCKSIZE);
+}
+
+
+int AES256CBCDecrypt::Decrypt(const unsigned char* data, int size, unsigned char* out) const
+{
+ return CBCDecrypt(dec, iv, data, size, pad, out);
+}
+
+AES256CBCDecrypt::~AES256CBCDecrypt()
+{
+ memset(iv, 0, sizeof(iv));
+}
+
+AES128CBCEncrypt::AES128CBCEncrypt(const unsigned char key[AES128_KEYSIZE], const unsigned char ivIn[AES_BLOCKSIZE], bool padIn)
+ : enc(key), pad(padIn)
+{
+ memcpy(iv, ivIn, AES_BLOCKSIZE);
+}
+
+AES128CBCEncrypt::~AES128CBCEncrypt()
+{
+ memset(iv, 0, AES_BLOCKSIZE);
+}
+
+int AES128CBCEncrypt::Encrypt(const unsigned char* data, int size, unsigned char* out) const
+{
+ return CBCEncrypt(enc, iv, data, size, pad, out);
+}
+
+AES128CBCDecrypt::AES128CBCDecrypt(const unsigned char key[AES128_KEYSIZE], const unsigned char ivIn[AES_BLOCKSIZE], bool padIn)
+ : dec(key), pad(padIn)
+{
+ memcpy(iv, ivIn, AES_BLOCKSIZE);
+}
+
+AES128CBCDecrypt::~AES128CBCDecrypt()
+{
+ memset(iv, 0, AES_BLOCKSIZE);
+}
+
+int AES128CBCDecrypt::Decrypt(const unsigned char* data, int size, unsigned char* out) const
+{
+ return CBCDecrypt(dec, iv, data, size, pad, out);
+}
diff --git a/src/crypto/aes.h b/src/crypto/aes.h
new file mode 100644
index 0000000000..8cae357c12
--- /dev/null
+++ b/src/crypto/aes.h
@@ -0,0 +1,118 @@
+// 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.
+//
+// C++ wrapper around ctaes, a constant-time AES implementation
+
+#ifndef BITCOIN_CRYPTO_AES_H
+#define BITCOIN_CRYPTO_AES_H
+
+extern "C" {
+#include "crypto/ctaes/ctaes.h"
+}
+
+static const int AES_BLOCKSIZE = 16;
+static const int AES128_KEYSIZE = 16;
+static const int AES256_KEYSIZE = 32;
+
+/** An encryption class for AES-128. */
+class AES128Encrypt
+{
+private:
+ AES128_ctx ctx;
+
+public:
+ AES128Encrypt(const unsigned char key[16]);
+ ~AES128Encrypt();
+ void Encrypt(unsigned char ciphertext[16], const unsigned char plaintext[16]) const;
+};
+
+/** A decryption class for AES-128. */
+class AES128Decrypt
+{
+private:
+ AES128_ctx ctx;
+
+public:
+ AES128Decrypt(const unsigned char key[16]);
+ ~AES128Decrypt();
+ void Decrypt(unsigned char plaintext[16], const unsigned char ciphertext[16]) const;
+};
+
+/** An encryption class for AES-256. */
+class AES256Encrypt
+{
+private:
+ AES256_ctx ctx;
+
+public:
+ AES256Encrypt(const unsigned char key[32]);
+ ~AES256Encrypt();
+ void Encrypt(unsigned char ciphertext[16], const unsigned char plaintext[16]) const;
+};
+
+/** A decryption class for AES-256. */
+class AES256Decrypt
+{
+private:
+ AES256_ctx ctx;
+
+public:
+ AES256Decrypt(const unsigned char key[32]);
+ ~AES256Decrypt();
+ void Decrypt(unsigned char plaintext[16], const unsigned char ciphertext[16]) const;
+};
+
+class AES256CBCEncrypt
+{
+public:
+ AES256CBCEncrypt(const unsigned char key[AES256_KEYSIZE], const unsigned char ivIn[AES_BLOCKSIZE], bool padIn);
+ ~AES256CBCEncrypt();
+ int Encrypt(const unsigned char* data, int size, unsigned char* out) const;
+
+private:
+ const AES256Encrypt enc;
+ const bool pad;
+ unsigned char iv[AES_BLOCKSIZE];
+};
+
+class AES256CBCDecrypt
+{
+public:
+ AES256CBCDecrypt(const unsigned char key[AES256_KEYSIZE], const unsigned char ivIn[AES_BLOCKSIZE], bool padIn);
+ ~AES256CBCDecrypt();
+ int Decrypt(const unsigned char* data, int size, unsigned char* out) const;
+
+private:
+ const AES256Decrypt dec;
+ const bool pad;
+ unsigned char iv[AES_BLOCKSIZE];
+};
+
+class AES128CBCEncrypt
+{
+public:
+ AES128CBCEncrypt(const unsigned char key[AES128_KEYSIZE], const unsigned char ivIn[AES_BLOCKSIZE], bool padIn);
+ ~AES128CBCEncrypt();
+ int Encrypt(const unsigned char* data, int size, unsigned char* out) const;
+
+private:
+ const AES128Encrypt enc;
+ const bool pad;
+ unsigned char iv[AES_BLOCKSIZE];
+};
+
+class AES128CBCDecrypt
+{
+public:
+ AES128CBCDecrypt(const unsigned char key[AES128_KEYSIZE], const unsigned char ivIn[AES_BLOCKSIZE], bool padIn);
+ ~AES128CBCDecrypt();
+ int Decrypt(const unsigned char* data, int size, unsigned char* out) const;
+
+private:
+ const AES128Decrypt dec;
+ const bool pad;
+ unsigned char iv[AES_BLOCKSIZE];
+};
+
+#endif // BITCOIN_CRYPTO_AES_H
diff --git a/src/crypto/ctaes/COPYING b/src/crypto/ctaes/COPYING
new file mode 100644
index 0000000000..415b202a2a
--- /dev/null
+++ b/src/crypto/ctaes/COPYING
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Pieter Wuille
+
+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/crypto/ctaes/README.md b/src/crypto/ctaes/README.md
new file mode 100644
index 0000000000..0e7fe17751
--- /dev/null
+++ b/src/crypto/ctaes/README.md
@@ -0,0 +1,41 @@
+ctaes
+=====
+
+Simple C module for constant-time AES encryption and decryption.
+
+Features:
+* Simple, pure C code without any dependencies.
+* No tables or data-dependent branches whatsoever, but using bit sliced approach from https://eprint.iacr.org/2009/129.pdf.
+* Very small object code: slightly over 4k of executable code when compiled with -Os.
+* Slower than implementations based on precomputed tables or specialized instructions, but can do ~15 MB/s on modern CPUs.
+
+Performance
+-----------
+
+Compiled with GCC 5.3.1 with -O3, on an Intel(R) Core(TM) i7-4800MQ CPU, numbers in CPU cycles:
+
+| Algorithm | Key schedule | Encryption per byte | Decryption per byte |
+| --------- | ------------:| -------------------:| -------------------:|
+| AES-128 | 2.8k | 154 | 161 |
+| AES-192 | 3.1k | 169 | 181 |
+| AES-256 | 4.0k | 191 | 203 |
+
+Build steps
+-----------
+
+Object code:
+
+ $ gcc -O3 ctaes.c -c -o ctaes.o
+
+Tests:
+
+ $ gcc -O3 ctaes.c test.c -o test
+
+Benchmark:
+
+ $ gcc -O3 ctaes.c bench.c -o bench
+
+Review
+------
+
+Results of a formal review of the code can be found in http://bitcoin.sipa.be/ctaes/review.zip
diff --git a/src/crypto/ctaes/bench.c b/src/crypto/ctaes/bench.c
new file mode 100644
index 0000000000..a86df496c8
--- /dev/null
+++ b/src/crypto/ctaes/bench.c
@@ -0,0 +1,170 @@
+#include <stdio.h>
+#include <math.h>
+#include "sys/time.h"
+
+#include "ctaes.h"
+
+static double gettimedouble(void) {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_usec * 0.000001 + tv.tv_sec;
+}
+
+static void print_number(double x) {
+ double y = x;
+ int c = 0;
+ if (y < 0.0) {
+ y = -y;
+ }
+ while (y < 100.0) {
+ y *= 10.0;
+ c++;
+ }
+ printf("%.*f", c, x);
+}
+
+static void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) {
+ int i;
+ double min = HUGE_VAL;
+ double sum = 0.0;
+ double max = 0.0;
+ for (i = 0; i < count; i++) {
+ double begin, total;
+ if (setup != NULL) {
+ setup(data);
+ }
+ begin = gettimedouble();
+ benchmark(data);
+ total = gettimedouble() - begin;
+ if (teardown != NULL) {
+ teardown(data);
+ }
+ if (total < min) {
+ min = total;
+ }
+ if (total > max) {
+ max = total;
+ }
+ sum += total;
+ }
+ printf("%s: min ", name);
+ print_number(min * 1000000000.0 / iter);
+ printf("ns / avg ");
+ print_number((sum / count) * 1000000000.0 / iter);
+ printf("ns / max ");
+ print_number(max * 1000000000.0 / iter);
+ printf("ns\n");
+}
+
+static void bench_AES128_init(void* data) {
+ AES128_ctx* ctx = (AES128_ctx*)data;
+ int i;
+ for (i = 0; i < 50000; i++) {
+ AES128_init(ctx, (unsigned char*)ctx);
+ }
+}
+
+static void bench_AES128_encrypt_setup(void* data) {
+ AES128_ctx* ctx = (AES128_ctx*)data;
+ static const unsigned char key[16] = {0};
+ AES128_init(ctx, key);
+}
+
+static void bench_AES128_encrypt(void* data) {
+ const AES128_ctx* ctx = (const AES128_ctx*)data;
+ unsigned char scratch[16] = {0};
+ int i;
+ for (i = 0; i < 4000000 / 16; i++) {
+ AES128_encrypt(ctx, 1, scratch, scratch);
+ }
+}
+
+static void bench_AES128_decrypt(void* data) {
+ const AES128_ctx* ctx = (const AES128_ctx*)data;
+ unsigned char scratch[16] = {0};
+ int i;
+ for (i = 0; i < 4000000 / 16; i++) {
+ AES128_decrypt(ctx, 1, scratch, scratch);
+ }
+}
+
+static void bench_AES192_init(void* data) {
+ AES192_ctx* ctx = (AES192_ctx*)data;
+ int i;
+ for (i = 0; i < 50000; i++) {
+ AES192_init(ctx, (unsigned char*)ctx);
+ }
+}
+
+static void bench_AES192_encrypt_setup(void* data) {
+ AES192_ctx* ctx = (AES192_ctx*)data;
+ static const unsigned char key[16] = {0};
+ AES192_init(ctx, key);
+}
+
+static void bench_AES192_encrypt(void* data) {
+ const AES192_ctx* ctx = (const AES192_ctx*)data;
+ unsigned char scratch[16] = {0};
+ int i;
+ for (i = 0; i < 4000000 / 16; i++) {
+ AES192_encrypt(ctx, 1, scratch, scratch);
+ }
+}
+
+static void bench_AES192_decrypt(void* data) {
+ const AES192_ctx* ctx = (const AES192_ctx*)data;
+ unsigned char scratch[16] = {0};
+ int i;
+ for (i = 0; i < 4000000 / 16; i++) {
+ AES192_decrypt(ctx, 1, scratch, scratch);
+ }
+}
+
+static void bench_AES256_init(void* data) {
+ AES256_ctx* ctx = (AES256_ctx*)data;
+ int i;
+ for (i = 0; i < 50000; i++) {
+ AES256_init(ctx, (unsigned char*)ctx);
+ }
+}
+
+
+static void bench_AES256_encrypt_setup(void* data) {
+ AES256_ctx* ctx = (AES256_ctx*)data;
+ static const unsigned char key[16] = {0};
+ AES256_init(ctx, key);
+}
+
+static void bench_AES256_encrypt(void* data) {
+ const AES256_ctx* ctx = (const AES256_ctx*)data;
+ unsigned char scratch[16] = {0};
+ int i;
+ for (i = 0; i < 4000000 / 16; i++) {
+ AES256_encrypt(ctx, 1, scratch, scratch);
+ }
+}
+
+static void bench_AES256_decrypt(void* data) {
+ const AES256_ctx* ctx = (const AES256_ctx*)data;
+ unsigned char scratch[16] = {0};
+ int i;
+ for (i = 0; i < 4000000 / 16; i++) {
+ AES256_decrypt(ctx, 1, scratch, scratch);
+ }
+}
+
+int main(void) {
+ AES128_ctx ctx128;
+ AES192_ctx ctx192;
+ AES256_ctx ctx256;
+ run_benchmark("aes128_init", bench_AES128_init, NULL, NULL, &ctx128, 20, 50000);
+ run_benchmark("aes128_encrypt_byte", bench_AES128_encrypt, bench_AES128_encrypt_setup, NULL, &ctx128, 20, 4000000);
+ run_benchmark("aes128_decrypt_byte", bench_AES128_decrypt, bench_AES128_encrypt_setup, NULL, &ctx128, 20, 4000000);
+ run_benchmark("aes192_init", bench_AES192_init, NULL, NULL, &ctx192, 20, 50000);
+ run_benchmark("aes192_encrypt_byte", bench_AES192_encrypt, bench_AES192_encrypt_setup, NULL, &ctx192, 20, 4000000);
+ run_benchmark("aes192_decrypt_byte", bench_AES192_decrypt, bench_AES192_encrypt_setup, NULL, &ctx192, 20, 4000000);
+ run_benchmark("aes256_init", bench_AES256_init, NULL, NULL, &ctx256, 20, 50000);
+ run_benchmark("aes256_encrypt_byte", bench_AES256_encrypt, bench_AES256_encrypt_setup, NULL, &ctx256, 20, 4000000);
+ run_benchmark("aes256_decrypt_byte", bench_AES256_decrypt, bench_AES256_encrypt_setup, NULL, &ctx256, 20, 4000000);
+ return 0;
+}
diff --git a/src/crypto/ctaes/ctaes.c b/src/crypto/ctaes/ctaes.c
new file mode 100644
index 0000000000..2389fc0bb2
--- /dev/null
+++ b/src/crypto/ctaes/ctaes.c
@@ -0,0 +1,556 @@
+ /*********************************************************************
+ * Copyright (c) 2016 Pieter Wuille *
+ * Distributed under the MIT software license, see the accompanying *
+ * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
+ **********************************************************************/
+
+/* Constant time, unoptimized, concise, plain C, AES implementation
+ * Based On:
+ * Emilia Kasper and Peter Schwabe, Faster and Timing-Attack Resistant AES-GCM
+ * http://www.iacr.org/archive/ches2009/57470001/57470001.pdf
+ * But using 8 16-bit integers representing a single AES state rather than 8 128-bit
+ * integers representing 8 AES states.
+ */
+
+#include "ctaes.h"
+
+/* Slice variable slice_i contains the i'th bit of the 16 state variables in this order:
+ * 0 1 2 3
+ * 4 5 6 7
+ * 8 9 10 11
+ * 12 13 14 15
+ */
+
+/** Convert a byte to sliced form, storing it corresponding to given row and column in s */
+static void LoadByte(AES_state* s, unsigned char byte, int r, int c) {
+ int i;
+ for (i = 0; i < 8; i++) {
+ s->slice[i] |= (byte & 1) << (r * 4 + c);
+ byte >>= 1;
+ }
+}
+
+/** Load 16 bytes of data into 8 sliced integers */
+static void LoadBytes(AES_state *s, const unsigned char* data16) {
+ int c;
+ for (c = 0; c < 4; c++) {
+ int r;
+ for (r = 0; r < 4; r++) {
+ LoadByte(s, *(data16++), r, c);
+ }
+ }
+}
+
+/** Convert 8 sliced integers into 16 bytes of data */
+static void SaveBytes(unsigned char* data16, const AES_state *s) {
+ int c;
+ for (c = 0; c < 4; c++) {
+ int r;
+ for (r = 0; r < 4; r++) {
+ int b;
+ uint8_t v = 0;
+ for (b = 0; b < 8; b++) {
+ v |= ((s->slice[b] >> (r * 4 + c)) & 1) << b;
+ }
+ *(data16++) = v;
+ }
+ }
+}
+
+/* S-box implementation based on the gate logic from:
+ * Joan Boyar and Rene Peralta, A depth-16 circuit for the AES S-box.
+ * https://eprint.iacr.org/2011/332.pdf
+*/
+static void SubBytes(AES_state *s, int inv) {
+ /* Load the bit slices */
+ uint16_t U0 = s->slice[7], U1 = s->slice[6], U2 = s->slice[5], U3 = s->slice[4];
+ uint16_t U4 = s->slice[3], U5 = s->slice[2], U6 = s->slice[1], U7 = s->slice[0];
+
+ uint16_t T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16;
+ uint16_t T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, D;
+ uint16_t M1, M6, M11, M13, M15, M20, M21, M22, M23, M25, M37, M38, M39, M40;
+ uint16_t M41, M42, M43, M44, M45, M46, M47, M48, M49, M50, M51, M52, M53, M54;
+ uint16_t M55, M56, M57, M58, M59, M60, M61, M62, M63;
+
+ if (inv) {
+ uint16_t R5, R13, R17, R18, R19;
+ /* Undo linear postprocessing */
+ T23 = U0 ^ U3;
+ T22 = ~(U1 ^ U3);
+ T2 = ~(U0 ^ U1);
+ T1 = U3 ^ U4;
+ T24 = ~(U4 ^ U7);
+ R5 = U6 ^ U7;
+ T8 = ~(U1 ^ T23);
+ T19 = T22 ^ R5;
+ T9 = ~(U7 ^ T1);
+ T10 = T2 ^ T24;
+ T13 = T2 ^ R5;
+ T3 = T1 ^ R5;
+ T25 = ~(U2 ^ T1);
+ R13 = U1 ^ U6;
+ T17 = ~(U2 ^ T19);
+ T20 = T24 ^ R13;
+ T4 = U4 ^ T8;
+ R17 = ~(U2 ^ U5);
+ R18 = ~(U5 ^ U6);
+ R19 = ~(U2 ^ U4);
+ D = U0 ^ R17;
+ T6 = T22 ^ R17;
+ T16 = R13 ^ R19;
+ T27 = T1 ^ R18;
+ T15 = T10 ^ T27;
+ T14 = T10 ^ R18;
+ T26 = T3 ^ T16;
+ } else {
+ /* Linear preprocessing. */
+ T1 = U0 ^ U3;
+ T2 = U0 ^ U5;
+ T3 = U0 ^ U6;
+ T4 = U3 ^ U5;
+ T5 = U4 ^ U6;
+ T6 = T1 ^ T5;
+ T7 = U1 ^ U2;
+ T8 = U7 ^ T6;
+ T9 = U7 ^ T7;
+ T10 = T6 ^ T7;
+ T11 = U1 ^ U5;
+ T12 = U2 ^ U5;
+ T13 = T3 ^ T4;
+ T14 = T6 ^ T11;
+ T15 = T5 ^ T11;
+ T16 = T5 ^ T12;
+ T17 = T9 ^ T16;
+ T18 = U3 ^ U7;
+ T19 = T7 ^ T18;
+ T20 = T1 ^ T19;
+ T21 = U6 ^ U7;
+ T22 = T7 ^ T21;
+ T23 = T2 ^ T22;
+ T24 = T2 ^ T10;
+ T25 = T20 ^ T17;
+ T26 = T3 ^ T16;
+ T27 = T1 ^ T12;
+ D = U7;
+ }
+
+ /* Non-linear transformation (identical to the code in SubBytes) */
+ M1 = T13 & T6;
+ M6 = T3 & T16;
+ M11 = T1 & T15;
+ M13 = (T4 & T27) ^ M11;
+ M15 = (T2 & T10) ^ M11;
+ M20 = T14 ^ M1 ^ (T23 & T8) ^ M13;
+ M21 = (T19 & D) ^ M1 ^ T24 ^ M15;
+ M22 = T26 ^ M6 ^ (T22 & T9) ^ M13;
+ M23 = (T20 & T17) ^ M6 ^ M15 ^ T25;
+ M25 = M22 & M20;
+ M37 = M21 ^ ((M20 ^ M21) & (M23 ^ M25));
+ M38 = M20 ^ M25 ^ (M21 | (M20 & M23));
+ M39 = M23 ^ ((M22 ^ M23) & (M21 ^ M25));
+ M40 = M22 ^ M25 ^ (M23 | (M21 & M22));
+ M41 = M38 ^ M40;
+ M42 = M37 ^ M39;
+ M43 = M37 ^ M38;
+ M44 = M39 ^ M40;
+ M45 = M42 ^ M41;
+ M46 = M44 & T6;
+ M47 = M40 & T8;
+ M48 = M39 & D;
+ M49 = M43 & T16;
+ M50 = M38 & T9;
+ M51 = M37 & T17;
+ M52 = M42 & T15;
+ M53 = M45 & T27;
+ M54 = M41 & T10;
+ M55 = M44 & T13;
+ M56 = M40 & T23;
+ M57 = M39 & T19;
+ M58 = M43 & T3;
+ M59 = M38 & T22;
+ M60 = M37 & T20;
+ M61 = M42 & T1;
+ M62 = M45 & T4;
+ M63 = M41 & T2;
+
+ if (inv){
+ /* Undo linear preprocessing */
+ uint16_t P0 = M52 ^ M61;
+ uint16_t P1 = M58 ^ M59;
+ uint16_t P2 = M54 ^ M62;
+ uint16_t P3 = M47 ^ M50;
+ uint16_t P4 = M48 ^ M56;
+ uint16_t P5 = M46 ^ M51;
+ uint16_t P6 = M49 ^ M60;
+ uint16_t P7 = P0 ^ P1;
+ uint16_t P8 = M50 ^ M53;
+ uint16_t P9 = M55 ^ M63;
+ uint16_t P10 = M57 ^ P4;
+ uint16_t P11 = P0 ^ P3;
+ uint16_t P12 = M46 ^ M48;
+ uint16_t P13 = M49 ^ M51;
+ uint16_t P14 = M49 ^ M62;
+ uint16_t P15 = M54 ^ M59;
+ uint16_t P16 = M57 ^ M61;
+ uint16_t P17 = M58 ^ P2;
+ uint16_t P18 = M63 ^ P5;
+ uint16_t P19 = P2 ^ P3;
+ uint16_t P20 = P4 ^ P6;
+ uint16_t P22 = P2 ^ P7;
+ uint16_t P23 = P7 ^ P8;
+ uint16_t P24 = P5 ^ P7;
+ uint16_t P25 = P6 ^ P10;
+ uint16_t P26 = P9 ^ P11;
+ uint16_t P27 = P10 ^ P18;
+ uint16_t P28 = P11 ^ P25;
+ uint16_t P29 = P15 ^ P20;
+ s->slice[7] = P13 ^ P22;
+ s->slice[6] = P26 ^ P29;
+ s->slice[5] = P17 ^ P28;
+ s->slice[4] = P12 ^ P22;
+ s->slice[3] = P23 ^ P27;
+ s->slice[2] = P19 ^ P24;
+ s->slice[1] = P14 ^ P23;
+ s->slice[0] = P9 ^ P16;
+ } else {
+ /* Linear postprocessing */
+ uint16_t L0 = M61 ^ M62;
+ uint16_t L1 = M50 ^ M56;
+ uint16_t L2 = M46 ^ M48;
+ uint16_t L3 = M47 ^ M55;
+ uint16_t L4 = M54 ^ M58;
+ uint16_t L5 = M49 ^ M61;
+ uint16_t L6 = M62 ^ L5;
+ uint16_t L7 = M46 ^ L3;
+ uint16_t L8 = M51 ^ M59;
+ uint16_t L9 = M52 ^ M53;
+ uint16_t L10 = M53 ^ L4;
+ uint16_t L11 = M60 ^ L2;
+ uint16_t L12 = M48 ^ M51;
+ uint16_t L13 = M50 ^ L0;
+ uint16_t L14 = M52 ^ M61;
+ uint16_t L15 = M55 ^ L1;
+ uint16_t L16 = M56 ^ L0;
+ uint16_t L17 = M57 ^ L1;
+ uint16_t L18 = M58 ^ L8;
+ uint16_t L19 = M63 ^ L4;
+ uint16_t L20 = L0 ^ L1;
+ uint16_t L21 = L1 ^ L7;
+ uint16_t L22 = L3 ^ L12;
+ uint16_t L23 = L18 ^ L2;
+ uint16_t L24 = L15 ^ L9;
+ uint16_t L25 = L6 ^ L10;
+ uint16_t L26 = L7 ^ L9;
+ uint16_t L27 = L8 ^ L10;
+ uint16_t L28 = L11 ^ L14;
+ uint16_t L29 = L11 ^ L17;
+ s->slice[7] = L6 ^ L24;
+ s->slice[6] = ~(L16 ^ L26);
+ s->slice[5] = ~(L19 ^ L28);
+ s->slice[4] = L6 ^ L21;
+ s->slice[3] = L20 ^ L22;
+ s->slice[2] = L25 ^ L29;
+ s->slice[1] = ~(L13 ^ L27);
+ s->slice[0] = ~(L6 ^ L23);
+ }
+}
+
+#define BIT_RANGE(from,to) (((1 << ((to) - (from))) - 1) << (from))
+
+#define BIT_RANGE_LEFT(x,from,to,shift) (((x) & BIT_RANGE((from), (to))) << (shift))
+#define BIT_RANGE_RIGHT(x,from,to,shift) (((x) & BIT_RANGE((from), (to))) >> (shift))
+
+static void ShiftRows(AES_state* s) {
+ int i;
+ for (i = 0; i < 8; i++) {
+ uint16_t v = s->slice[i];
+ s->slice[i] =
+ (v & BIT_RANGE(0, 4)) |
+ BIT_RANGE_LEFT(v, 4, 5, 3) | BIT_RANGE_RIGHT(v, 5, 8, 1) |
+ BIT_RANGE_LEFT(v, 8, 10, 2) | BIT_RANGE_RIGHT(v, 10, 12, 2) |
+ BIT_RANGE_LEFT(v, 12, 15, 1) | BIT_RANGE_RIGHT(v, 15, 16, 3);
+ }
+}
+
+static void InvShiftRows(AES_state* s) {
+ int i;
+ for (i = 0; i < 8; i++) {
+ uint16_t v = s->slice[i];
+ s->slice[i] =
+ (v & BIT_RANGE(0, 4)) |
+ BIT_RANGE_LEFT(v, 4, 7, 1) | BIT_RANGE_RIGHT(v, 7, 8, 3) |
+ BIT_RANGE_LEFT(v, 8, 10, 2) | BIT_RANGE_RIGHT(v, 10, 12, 2) |
+ BIT_RANGE_LEFT(v, 12, 13, 3) | BIT_RANGE_RIGHT(v, 13, 16, 1);
+ }
+}
+
+#define ROT(x,b) (((x) >> ((b) * 4)) | ((x) << ((4-(b)) * 4)))
+
+static void MixColumns(AES_state* s, int inv) {
+ /* The MixColumns transform treats the bytes of the columns of the state as
+ * coefficients of a 3rd degree polynomial over GF(2^8) and multiplies them
+ * by the fixed polynomial a(x) = {03}x^3 + {01}x^2 + {01}x + {02}, modulo
+ * x^4 + {01}.
+ *
+ * In the inverse transform, we multiply by the inverse of a(x),
+ * a^-1(x) = {0b}x^3 + {0d}x^2 + {09}x + {0e}. This is equal to
+ * a(x) * ({04}x^2 + {05}), so we can reuse the forward transform's code
+ * (found in OpenSSL's bsaes-x86_64.pl, attributed to Jussi Kivilinna)
+ *
+ * In the bitsliced representation, a multiplication of every column by x
+ * mod x^4 + 1 is simply a right rotation.
+ */
+
+ /* Shared for both directions is a multiplication by a(x), which can be
+ * rewritten as (x^3 + x^2 + x) + {02}*(x^3 + {01}).
+ *
+ * First compute s into the s? variables, (x^3 + {01}) * s into the s?_01
+ * variables and (x^3 + x^2 + x)*s into the s?_123 variables.
+ */
+ uint16_t s0 = s->slice[0], s1 = s->slice[1], s2 = s->slice[2], s3 = s->slice[3];
+ uint16_t s4 = s->slice[4], s5 = s->slice[5], s6 = s->slice[6], s7 = s->slice[7];
+ uint16_t s0_01 = s0 ^ ROT(s0, 1), s0_123 = ROT(s0_01, 1) ^ ROT(s0, 3);
+ uint16_t s1_01 = s1 ^ ROT(s1, 1), s1_123 = ROT(s1_01, 1) ^ ROT(s1, 3);
+ uint16_t s2_01 = s2 ^ ROT(s2, 1), s2_123 = ROT(s2_01, 1) ^ ROT(s2, 3);
+ uint16_t s3_01 = s3 ^ ROT(s3, 1), s3_123 = ROT(s3_01, 1) ^ ROT(s3, 3);
+ uint16_t s4_01 = s4 ^ ROT(s4, 1), s4_123 = ROT(s4_01, 1) ^ ROT(s4, 3);
+ uint16_t s5_01 = s5 ^ ROT(s5, 1), s5_123 = ROT(s5_01, 1) ^ ROT(s5, 3);
+ uint16_t s6_01 = s6 ^ ROT(s6, 1), s6_123 = ROT(s6_01, 1) ^ ROT(s6, 3);
+ uint16_t s7_01 = s7 ^ ROT(s7, 1), s7_123 = ROT(s7_01, 1) ^ ROT(s7, 3);
+ /* Now compute s = s?_123 + {02} * s?_01. */
+ s->slice[0] = s7_01 ^ s0_123;
+ s->slice[1] = s7_01 ^ s0_01 ^ s1_123;
+ s->slice[2] = s1_01 ^ s2_123;
+ s->slice[3] = s7_01 ^ s2_01 ^ s3_123;
+ s->slice[4] = s7_01 ^ s3_01 ^ s4_123;
+ s->slice[5] = s4_01 ^ s5_123;
+ s->slice[6] = s5_01 ^ s6_123;
+ s->slice[7] = s6_01 ^ s7_123;
+ if (inv) {
+ /* In the reverse direction, we further need to multiply by
+ * {04}x^2 + {05}, which can be written as {04} * (x^2 + {01}) + {01}.
+ *
+ * First compute (x^2 + {01}) * s into the t?_02 variables: */
+ uint16_t t0_02 = s->slice[0] ^ ROT(s->slice[0], 2);
+ uint16_t t1_02 = s->slice[1] ^ ROT(s->slice[1], 2);
+ uint16_t t2_02 = s->slice[2] ^ ROT(s->slice[2], 2);
+ uint16_t t3_02 = s->slice[3] ^ ROT(s->slice[3], 2);
+ uint16_t t4_02 = s->slice[4] ^ ROT(s->slice[4], 2);
+ uint16_t t5_02 = s->slice[5] ^ ROT(s->slice[5], 2);
+ uint16_t t6_02 = s->slice[6] ^ ROT(s->slice[6], 2);
+ uint16_t t7_02 = s->slice[7] ^ ROT(s->slice[7], 2);
+ /* And then update s += {04} * t?_02 */
+ s->slice[0] ^= t6_02;
+ s->slice[1] ^= t6_02 ^ t7_02;
+ s->slice[2] ^= t0_02 ^ t7_02;
+ s->slice[3] ^= t1_02 ^ t6_02;
+ s->slice[4] ^= t2_02 ^ t6_02 ^ t7_02;
+ s->slice[5] ^= t3_02 ^ t7_02;
+ s->slice[6] ^= t4_02;
+ s->slice[7] ^= t5_02;
+ }
+}
+
+static void AddRoundKey(AES_state* s, const AES_state* round) {
+ int b;
+ for (b = 0; b < 8; b++) {
+ s->slice[b] ^= round->slice[b];
+ }
+}
+
+/** column_0(s) = column_c(a) */
+static void GetOneColumn(AES_state* s, const AES_state* a, int c) {
+ int b;
+ for (b = 0; b < 8; b++) {
+ s->slice[b] = (a->slice[b] >> c) & 0x1111;
+ }
+}
+
+/** column_c1(r) |= (column_0(s) ^= column_c2(a)) */
+static void KeySetupColumnMix(AES_state* s, AES_state* r, const AES_state* a, int c1, int c2) {
+ int b;
+ for (b = 0; b < 8; b++) {
+ r->slice[b] |= ((s->slice[b] ^= ((a->slice[b] >> c2) & 0x1111)) & 0x1111) << c1;
+ }
+}
+
+/** Rotate the rows in s one position upwards, and xor in r */
+static void KeySetupTransform(AES_state* s, const AES_state* r) {
+ int b;
+ for (b = 0; b < 8; b++) {
+ s->slice[b] = ((s->slice[b] >> 4) | (s->slice[b] << 12)) ^ r->slice[b];
+ }
+}
+
+/* Multiply the cells in s by x, as polynomials over GF(2) mod x^8 + x^4 + x^3 + x + 1 */
+static void MultX(AES_state* s) {
+ uint16_t top = s->slice[7];
+ s->slice[7] = s->slice[6];
+ s->slice[6] = s->slice[5];
+ s->slice[5] = s->slice[4];
+ s->slice[4] = s->slice[3] ^ top;
+ s->slice[3] = s->slice[2] ^ top;
+ s->slice[2] = s->slice[1];
+ s->slice[1] = s->slice[0] ^ top;
+ s->slice[0] = top;
+}
+
+/** Expand the cipher key into the key schedule.
+ *
+ * state must be a pointer to an array of size nrounds + 1.
+ * key must be a pointer to 4 * nkeywords bytes.
+ *
+ * AES128 uses nkeywords = 4, nrounds = 10
+ * AES192 uses nkeywords = 6, nrounds = 12
+ * AES256 uses nkeywords = 8, nrounds = 14
+ */
+static void AES_setup(AES_state* rounds, const uint8_t* key, int nkeywords, int nrounds)
+{
+ int i;
+
+ /* The one-byte round constant */
+ AES_state rcon = {{1,0,0,0,0,0,0,0}};
+ /* The number of the word being generated, modulo nkeywords */
+ int pos = 0;
+ /* The column representing the word currently being processed */
+ AES_state column;
+
+ for (i = 0; i < nrounds + 1; i++) {
+ int b;
+ for (b = 0; b < 8; b++) {
+ rounds[i].slice[b] = 0;
+ }
+ }
+
+ /* The first nkeywords round columns are just taken from the key directly. */
+ for (i = 0; i < nkeywords; i++) {
+ int r;
+ for (r = 0; r < 4; r++) {
+ LoadByte(&rounds[i >> 2], *(key++), r, i & 3);
+ }
+ }
+
+ GetOneColumn(&column, &rounds[(nkeywords - 1) >> 2], (nkeywords - 1) & 3);
+
+ for (i = nkeywords; i < 4 * (nrounds + 1); i++) {
+ /* Transform column */
+ if (pos == 0) {
+ SubBytes(&column, 0);
+ KeySetupTransform(&column, &rcon);
+ MultX(&rcon);
+ } else if (nkeywords > 6 && pos == 4) {
+ SubBytes(&column, 0);
+ }
+ if (++pos == nkeywords) pos = 0;
+ KeySetupColumnMix(&column, &rounds[i >> 2], &rounds[(i - nkeywords) >> 2], i & 3, (i - nkeywords) & 3);
+ }
+}
+
+static void AES_encrypt(const AES_state* rounds, int nrounds, unsigned char* cipher16, const unsigned char* plain16) {
+ AES_state s = {{0}};
+ int round;
+
+ LoadBytes(&s, plain16);
+ AddRoundKey(&s, rounds++);
+
+ for (round = 1; round < nrounds; round++) {
+ SubBytes(&s, 0);
+ ShiftRows(&s);
+ MixColumns(&s, 0);
+ AddRoundKey(&s, rounds++);
+ }
+
+ SubBytes(&s, 0);
+ ShiftRows(&s);
+ AddRoundKey(&s, rounds);
+
+ SaveBytes(cipher16, &s);
+}
+
+static void AES_decrypt(const AES_state* rounds, int nrounds, unsigned char* plain16, const unsigned char* cipher16) {
+ /* Most AES decryption implementations use the alternate scheme
+ * (the Equivalent Inverse Cipher), which looks more like encryption, but
+ * needs different round constants. We can't reuse any code here anyway, so
+ * don't bother. */
+ AES_state s = {{0}};
+ int round;
+
+ rounds += nrounds;
+
+ LoadBytes(&s, cipher16);
+ AddRoundKey(&s, rounds--);
+
+ for (round = 1; round < nrounds; round++) {
+ InvShiftRows(&s);
+ SubBytes(&s, 1);
+ AddRoundKey(&s, rounds--);
+ MixColumns(&s, 1);
+ }
+
+ InvShiftRows(&s);
+ SubBytes(&s, 1);
+ AddRoundKey(&s, rounds);
+
+ SaveBytes(plain16, &s);
+}
+
+void AES128_init(AES128_ctx* ctx, const unsigned char* key16) {
+ AES_setup(ctx->rk, key16, 4, 10);
+}
+
+void AES128_encrypt(const AES128_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16) {
+ while (blocks--) {
+ AES_encrypt(ctx->rk, 10, cipher16, plain16);
+ cipher16 += 16;
+ plain16 += 16;
+ }
+}
+
+void AES128_decrypt(const AES128_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16) {
+ while (blocks--) {
+ AES_decrypt(ctx->rk, 10, plain16, cipher16);
+ cipher16 += 16;
+ plain16 += 16;
+ }
+}
+
+void AES192_init(AES192_ctx* ctx, const unsigned char* key24) {
+ AES_setup(ctx->rk, key24, 6, 12);
+}
+
+void AES192_encrypt(const AES192_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16) {
+ while (blocks--) {
+ AES_encrypt(ctx->rk, 12, cipher16, plain16);
+ cipher16 += 16;
+ plain16 += 16;
+ }
+
+}
+
+void AES192_decrypt(const AES192_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16) {
+ while (blocks--) {
+ AES_decrypt(ctx->rk, 12, plain16, cipher16);
+ cipher16 += 16;
+ plain16 += 16;
+ }
+}
+
+void AES256_init(AES256_ctx* ctx, const unsigned char* key32) {
+ AES_setup(ctx->rk, key32, 8, 14);
+}
+
+void AES256_encrypt(const AES256_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16) {
+ while (blocks--) {
+ AES_encrypt(ctx->rk, 14, cipher16, plain16);
+ cipher16 += 16;
+ plain16 += 16;
+ }
+}
+
+void AES256_decrypt(const AES256_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16) {
+ while (blocks--) {
+ AES_decrypt(ctx->rk, 14, plain16, cipher16);
+ cipher16 += 16;
+ plain16 += 16;
+ }
+}
diff --git a/src/crypto/ctaes/ctaes.h b/src/crypto/ctaes/ctaes.h
new file mode 100644
index 0000000000..2f0af04216
--- /dev/null
+++ b/src/crypto/ctaes/ctaes.h
@@ -0,0 +1,41 @@
+ /*********************************************************************
+ * Copyright (c) 2016 Pieter Wuille *
+ * Distributed under the MIT software license, see the accompanying *
+ * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
+ **********************************************************************/
+
+#ifndef _CTAES_H_
+#define _CTAES_H_ 1
+
+#include <stdint.h>
+#include <stdlib.h>
+
+typedef struct {
+ uint16_t slice[8];
+} AES_state;
+
+typedef struct {
+ AES_state rk[11];
+} AES128_ctx;
+
+typedef struct {
+ AES_state rk[13];
+} AES192_ctx;
+
+typedef struct {
+ AES_state rk[15];
+} AES256_ctx;
+
+void AES128_init(AES128_ctx* ctx, const unsigned char* key16);
+void AES128_encrypt(const AES128_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16);
+void AES128_decrypt(const AES128_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16);
+
+void AES192_init(AES192_ctx* ctx, const unsigned char* key24);
+void AES192_encrypt(const AES192_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16);
+void AES192_decrypt(const AES192_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16);
+
+void AES256_init(AES256_ctx* ctx, const unsigned char* key32);
+void AES256_encrypt(const AES256_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16);
+void AES256_decrypt(const AES256_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16);
+
+#endif
diff --git a/src/crypto/ctaes/test.c b/src/crypto/ctaes/test.c
new file mode 100644
index 0000000000..fce1696acd
--- /dev/null
+++ b/src/crypto/ctaes/test.c
@@ -0,0 +1,110 @@
+ /*********************************************************************
+ * Copyright (c) 2016 Pieter Wuille *
+ * Distributed under the MIT software license, see the accompanying *
+ * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
+ **********************************************************************/
+
+#include "ctaes.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+typedef struct {
+ int keysize;
+ const char* key;
+ const char* plain;
+ const char* cipher;
+} ctaes_test;
+
+static const ctaes_test ctaes_tests[] = {
+ /* AES test vectors from FIPS 197. */
+ {128, "000102030405060708090a0b0c0d0e0f", "00112233445566778899aabbccddeeff", "69c4e0d86a7b0430d8cdb78070b4c55a"},
+ {192, "000102030405060708090a0b0c0d0e0f1011121314151617", "00112233445566778899aabbccddeeff", "dda97ca4864cdfe06eaf70a0ec0d7191"},
+ {256, "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", "00112233445566778899aabbccddeeff", "8ea2b7ca516745bfeafc49904b496089"},
+
+ /* AES-ECB test vectors from NIST sp800-38a. */
+ {128, "2b7e151628aed2a6abf7158809cf4f3c", "6bc1bee22e409f96e93d7e117393172a", "3ad77bb40d7a3660a89ecaf32466ef97"},
+ {128, "2b7e151628aed2a6abf7158809cf4f3c", "ae2d8a571e03ac9c9eb76fac45af8e51", "f5d3d58503b9699de785895a96fdbaaf"},
+ {128, "2b7e151628aed2a6abf7158809cf4f3c", "30c81c46a35ce411e5fbc1191a0a52ef", "43b1cd7f598ece23881b00e3ed030688"},
+ {128, "2b7e151628aed2a6abf7158809cf4f3c", "f69f2445df4f9b17ad2b417be66c3710", "7b0c785e27e8ad3f8223207104725dd4"},
+ {192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "6bc1bee22e409f96e93d7e117393172a", "bd334f1d6e45f25ff712a214571fa5cc"},
+ {192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "ae2d8a571e03ac9c9eb76fac45af8e51", "974104846d0ad3ad7734ecb3ecee4eef"},
+ {192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "30c81c46a35ce411e5fbc1191a0a52ef", "ef7afd2270e2e60adce0ba2face6444e"},
+ {192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f69f2445df4f9b17ad2b417be66c3710", "9a4b41ba738d6c72fb16691603c18e0e"},
+ {256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "6bc1bee22e409f96e93d7e117393172a", "f3eed1bdb5d2a03c064b5a7e3db181f8"},
+ {256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "ae2d8a571e03ac9c9eb76fac45af8e51", "591ccb10d410ed26dc5ba74a31362870"},
+ {256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "30c81c46a35ce411e5fbc1191a0a52ef", "b6ed21b99ca6f4f9f153e7b1beafed1d"},
+ {256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "f69f2445df4f9b17ad2b417be66c3710", "23304b7a39f9f3ff067d8d8f9e24ecc7"}
+};
+
+static void from_hex(unsigned char* data, int len, const char* hex) {
+ int p;
+ for (p = 0; p < len; p++) {
+ int v = 0;
+ int n;
+ for (n = 0; n < 2; n++) {
+ assert((*hex >= '0' && *hex <= '9') || (*hex >= 'a' && *hex <= 'f'));
+ if (*hex >= '0' && *hex <= '9') {
+ v |= (*hex - '0') << (4 * (1 - n));
+ } else {
+ v |= (*hex - 'a' + 10) << (4 * (1 - n));
+ }
+ hex++;
+ }
+ *(data++) = v;
+ }
+ assert(*hex == 0);
+}
+
+int main(void) {
+ int i;
+ int fail = 0;
+ for (i = 0; i < sizeof(ctaes_tests) / sizeof(ctaes_tests[0]); i++) {
+ unsigned char key[32], plain[16], cipher[16], ciphered[16], deciphered[16];
+ const ctaes_test* test = &ctaes_tests[i];
+ assert(test->keysize == 128 || test->keysize == 192 || test->keysize == 256);
+ from_hex(plain, 16, test->plain);
+ from_hex(cipher, 16, test->cipher);
+ switch (test->keysize) {
+ case 128: {
+ AES128_ctx ctx;
+ from_hex(key, 16, test->key);
+ AES128_init(&ctx, key);
+ AES128_encrypt(&ctx, 1, ciphered, plain);
+ AES128_decrypt(&ctx, 1, deciphered, cipher);
+ break;
+ }
+ case 192: {
+ AES192_ctx ctx;
+ from_hex(key, 24, test->key);
+ AES192_init(&ctx, key);
+ AES192_encrypt(&ctx, 1, ciphered, plain);
+ AES192_decrypt(&ctx, 1, deciphered, cipher);
+ break;
+ }
+ case 256: {
+ AES256_ctx ctx;
+ from_hex(key, 32, test->key);
+ AES256_init(&ctx, key);
+ AES256_encrypt(&ctx, 1, ciphered, plain);
+ AES256_decrypt(&ctx, 1, deciphered, cipher);
+ break;
+ }
+ }
+ if (memcmp(cipher, ciphered, 16)) {
+ fprintf(stderr, "E(key=\"%s\", plain=\"%s\") != \"%s\"\n", test->key, test->plain, test->cipher);
+ fail++;
+ }
+ if (memcmp(plain, deciphered, 16)) {
+ fprintf(stderr, "D(key=\"%s\", cipher=\"%s\") != \"%s\"\n", test->key, test->cipher, test->plain);
+ fail++;
+ }
+ }
+ if (fail == 0) {
+ fprintf(stderr, "All tests succesful\n");
+ } else {
+ fprintf(stderr, "%i tests failed\n", fail);
+ }
+ return (fail != 0);
+}
diff --git a/src/crypto/ripemd160.h b/src/crypto/ripemd160.h
index 687204fdae..bd41f02508 100644
--- a/src/crypto/ripemd160.h
+++ b/src/crypto/ripemd160.h
@@ -14,7 +14,7 @@ class CRIPEMD160
private:
uint32_t s[5];
unsigned char buf[64];
- size_t bytes;
+ uint64_t bytes;
public:
static const size_t OUTPUT_SIZE = 20;
diff --git a/src/crypto/sha1.h b/src/crypto/sha1.h
index 7b2a21bc6c..8fb20810be 100644
--- a/src/crypto/sha1.h
+++ b/src/crypto/sha1.h
@@ -14,7 +14,7 @@ class CSHA1
private:
uint32_t s[5];
unsigned char buf[64];
- size_t bytes;
+ uint64_t bytes;
public:
static const size_t OUTPUT_SIZE = 20;
diff --git a/src/crypto/sha256.h b/src/crypto/sha256.h
index 85cf33739a..5b15b6a233 100644
--- a/src/crypto/sha256.h
+++ b/src/crypto/sha256.h
@@ -14,7 +14,7 @@ class CSHA256
private:
uint32_t s[8];
unsigned char buf[64];
- size_t bytes;
+ uint64_t bytes;
public:
static const size_t OUTPUT_SIZE = 32;
diff --git a/src/crypto/sha512.h b/src/crypto/sha512.h
index f1f17caf90..614681fae2 100644
--- a/src/crypto/sha512.h
+++ b/src/crypto/sha512.h
@@ -14,7 +14,7 @@ class CSHA512
private:
uint64_t s[8];
unsigned char buf[128];
- size_t bytes;
+ uint64_t bytes;
public:
static const size_t OUTPUT_SIZE = 64;
diff --git a/src/dbwrapper.cpp b/src/dbwrapper.cpp
index b6307cf0bf..4fa06135d2 100644
--- a/src/dbwrapper.cpp
+++ b/src/dbwrapper.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
@@ -15,20 +15,6 @@
#include <memenv.h>
#include <stdint.h>
-void HandleError(const leveldb::Status& status) throw(dbwrapper_error)
-{
- if (status.ok())
- return;
- LogPrintf("%s\n", status.ToString());
- if (status.IsCorruption())
- throw dbwrapper_error("Database corrupted");
- if (status.IsIOError())
- throw dbwrapper_error("Database I/O error");
- if (status.IsNotFound())
- throw dbwrapper_error("Database entry missing");
- throw dbwrapper_error("Unknown database error");
-}
-
static leveldb::Options GetOptions(size_t nCacheSize)
{
leveldb::Options options;
@@ -61,13 +47,13 @@ CDBWrapper::CDBWrapper(const boost::filesystem::path& path, size_t nCacheSize, b
if (fWipe) {
LogPrintf("Wiping LevelDB in %s\n", path.string());
leveldb::Status result = leveldb::DestroyDB(path.string(), options);
- HandleError(result);
+ dbwrapper_private::HandleError(result);
}
TryCreateDirectory(path);
LogPrintf("Opening LevelDB in %s\n", path.string());
}
leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb);
- HandleError(status);
+ dbwrapper_private::HandleError(status);
LogPrintf("Opened LevelDB successfully\n");
// The base-case obfuscation key, which is a noop.
@@ -84,10 +70,10 @@ CDBWrapper::CDBWrapper(const boost::filesystem::path& path, size_t nCacheSize, b
Write(OBFUSCATE_KEY_KEY, new_key);
obfuscate_key = new_key;
- LogPrintf("Wrote new obfuscate key for %s: %s\n", path.string(), GetObfuscateKeyHex());
+ LogPrintf("Wrote new obfuscate key for %s: %s\n", path.string(), HexStr(obfuscate_key));
}
- LogPrintf("Using obfuscation key for %s: %s\n", path.string(), GetObfuscateKeyHex());
+ LogPrintf("Using obfuscation key for %s: %s\n", path.string(), HexStr(obfuscate_key));
}
CDBWrapper::~CDBWrapper()
@@ -102,10 +88,10 @@ CDBWrapper::~CDBWrapper()
options.env = NULL;
}
-bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync) throw(dbwrapper_error)
+bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync)
{
leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch);
- HandleError(status);
+ dbwrapper_private::HandleError(status);
return true;
}
@@ -131,22 +117,35 @@ std::vector<unsigned char> CDBWrapper::CreateObfuscateKey() const
bool CDBWrapper::IsEmpty()
{
- boost::scoped_ptr<CDBIterator> it(NewIterator());
+ std::unique_ptr<CDBIterator> it(NewIterator());
it->SeekToFirst();
return !(it->Valid());
}
-const std::vector<unsigned char>& CDBWrapper::GetObfuscateKey() const
+CDBIterator::~CDBIterator() { delete piter; }
+bool CDBIterator::Valid() { return piter->Valid(); }
+void CDBIterator::SeekToFirst() { piter->SeekToFirst(); }
+void CDBIterator::Next() { piter->Next(); }
+
+namespace dbwrapper_private {
+
+void HandleError(const leveldb::Status& status)
{
- return obfuscate_key;
+ if (status.ok())
+ return;
+ LogPrintf("%s\n", status.ToString());
+ if (status.IsCorruption())
+ throw dbwrapper_error("Database corrupted");
+ if (status.IsIOError())
+ throw dbwrapper_error("Database I/O error");
+ if (status.IsNotFound())
+ throw dbwrapper_error("Database entry missing");
+ throw dbwrapper_error("Unknown database error");
}
-std::string CDBWrapper::GetObfuscateKeyHex() const
+const std::vector<unsigned char>& GetObfuscateKey(const CDBWrapper &w)
{
- return HexStr(obfuscate_key);
+ return w.obfuscate_key;
}
-CDBIterator::~CDBIterator() { delete piter; }
-bool CDBIterator::Valid() { return piter->Valid(); }
-void CDBIterator::SeekToFirst() { piter->SeekToFirst(); }
-void CDBIterator::Next() { piter->Next(); }
+};
diff --git a/src/dbwrapper.h b/src/dbwrapper.h
index 1d31ab8ae5..47bdb31b5b 100644
--- a/src/dbwrapper.h
+++ b/src/dbwrapper.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
@@ -23,7 +23,23 @@ public:
dbwrapper_error(const std::string& msg) : std::runtime_error(msg) {}
};
-void HandleError(const leveldb::Status& status) throw(dbwrapper_error);
+class CDBWrapper;
+
+/** These should be considered an implementation detail of the specific database.
+ */
+namespace dbwrapper_private {
+
+/** Handle database error by throwing dbwrapper_error exception.
+ */
+void HandleError(const leveldb::Status& status);
+
+/** Work around circular dependency, as well as for testing in dbwrapper_tests.
+ * Database obfuscation should be considered an implementation detail of the
+ * specific database.
+ */
+const std::vector<unsigned char>& GetObfuscateKey(const CDBWrapper &w);
+
+};
/** Batch of changes queued to be written to a CDBWrapper */
class CDBBatch
@@ -31,14 +47,14 @@ class CDBBatch
friend class CDBWrapper;
private:
+ const CDBWrapper &parent;
leveldb::WriteBatch batch;
- const std::vector<unsigned char> *obfuscate_key;
public:
/**
- * @param[in] obfuscate_key If passed, XOR data with this key.
+ * @param[in] _parent CDBWrapper that this batch is to be submitted to
*/
- CDBBatch(const std::vector<unsigned char> *obfuscate_key) : obfuscate_key(obfuscate_key) { };
+ CDBBatch(const CDBWrapper &_parent) : parent(_parent) { };
template <typename K, typename V>
void Write(const K& key, const V& value)
@@ -51,7 +67,7 @@ public:
CDataStream ssValue(SER_DISK, CLIENT_VERSION);
ssValue.reserve(ssValue.GetSerializeSize(value));
ssValue << value;
- ssValue.Xor(*obfuscate_key);
+ ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent));
leveldb::Slice slValue(&ssValue[0], ssValue.size());
batch.Put(slKey, slValue);
@@ -72,17 +88,17 @@ public:
class CDBIterator
{
private:
+ const CDBWrapper &parent;
leveldb::Iterator *piter;
- const std::vector<unsigned char> *obfuscate_key;
public:
/**
- * @param[in] piterIn The original leveldb iterator.
- * @param[in] obfuscate_key If passed, XOR data with this key.
+ * @param[in] _parent Parent CDBWrapper instance.
+ * @param[in] _piter The original leveldb iterator.
*/
- CDBIterator(leveldb::Iterator *piterIn, const std::vector<unsigned char>* obfuscate_key) :
- piter(piterIn), obfuscate_key(obfuscate_key) { };
+ CDBIterator(const CDBWrapper &_parent, leveldb::Iterator *_piter) :
+ parent(_parent), piter(_piter) { };
~CDBIterator();
bool Valid();
@@ -118,7 +134,7 @@ public:
leveldb::Slice slValue = piter->value();
try {
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
- ssValue.Xor(*obfuscate_key);
+ ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent));
ssValue >> value;
} catch (const std::exception&) {
return false;
@@ -134,6 +150,7 @@ public:
class CDBWrapper
{
+ friend const std::vector<unsigned char>& dbwrapper_private::GetObfuscateKey(const CDBWrapper &w);
private:
//! custom environment this database is using (may be NULL in case of default environment)
leveldb::Env* penv;
@@ -180,7 +197,7 @@ public:
~CDBWrapper();
template <typename K, typename V>
- bool Read(const K& key, V& value) const throw(dbwrapper_error)
+ bool Read(const K& key, V& value) const
{
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
ssKey.reserve(ssKey.GetSerializeSize(key));
@@ -193,7 +210,7 @@ public:
if (status.IsNotFound())
return false;
LogPrintf("LevelDB read failure: %s\n", status.ToString());
- HandleError(status);
+ dbwrapper_private::HandleError(status);
}
try {
CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION);
@@ -206,15 +223,15 @@ public:
}
template <typename K, typename V>
- bool Write(const K& key, const V& value, bool fSync = false) throw(dbwrapper_error)
+ bool Write(const K& key, const V& value, bool fSync = false)
{
- CDBBatch batch(&obfuscate_key);
+ CDBBatch batch(*this);
batch.Write(key, value);
return WriteBatch(batch, fSync);
}
template <typename K>
- bool Exists(const K& key) const throw(dbwrapper_error)
+ bool Exists(const K& key) const
{
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
ssKey.reserve(ssKey.GetSerializeSize(key));
@@ -227,20 +244,20 @@ public:
if (status.IsNotFound())
return false;
LogPrintf("LevelDB read failure: %s\n", status.ToString());
- HandleError(status);
+ dbwrapper_private::HandleError(status);
}
return true;
}
template <typename K>
- bool Erase(const K& key, bool fSync = false) throw(dbwrapper_error)
+ bool Erase(const K& key, bool fSync = false)
{
- CDBBatch batch(&obfuscate_key);
+ CDBBatch batch(*this);
batch.Erase(key);
return WriteBatch(batch, fSync);
}
- bool WriteBatch(CDBBatch& batch, bool fSync = false) throw(dbwrapper_error);
+ bool WriteBatch(CDBBatch& batch, bool fSync = false);
// not available for LevelDB; provide for compatibility with BDB
bool Flush()
@@ -248,32 +265,21 @@ public:
return true;
}
- bool Sync() throw(dbwrapper_error)
+ bool Sync()
{
- CDBBatch batch(&obfuscate_key);
+ CDBBatch batch(*this);
return WriteBatch(batch, true);
}
CDBIterator *NewIterator()
{
- return new CDBIterator(pdb->NewIterator(iteroptions), &obfuscate_key);
+ return new CDBIterator(*this, pdb->NewIterator(iteroptions));
}
/**
* Return true if the database managed by this class contains no entries.
*/
bool IsEmpty();
-
- /**
- * Accessor for obfuscate_key.
- */
- const std::vector<unsigned char>& GetObfuscateKey() const;
-
- /**
- * Return the obfuscate_key as a hex-formatted string.
- */
- std::string GetObfuscateKeyHex() const;
-
};
#endif // BITCOIN_DBWRAPPER_H
diff --git a/src/hash.cpp b/src/hash.cpp
index 9711293e38..20a83342db 100644
--- a/src/hash.cpp
+++ b/src/hash.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2013-2014 The Bitcoin Core developers
+// Copyright (c) 2013-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.
@@ -81,3 +81,130 @@ void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char he
num[3] = (nChild >> 0) & 0xFF;
CHMAC_SHA512(chainCode.begin(), chainCode.size()).Write(&header, 1).Write(data, 32).Write(num, 4).Finalize(output);
}
+
+#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
+
+#define SIPROUND do { \
+ v0 += v1; v1 = ROTL(v1, 13); v1 ^= v0; \
+ v0 = ROTL(v0, 32); \
+ v2 += v3; v3 = ROTL(v3, 16); v3 ^= v2; \
+ v0 += v3; v3 = ROTL(v3, 21); v3 ^= v0; \
+ v2 += v1; v1 = ROTL(v1, 17); v1 ^= v2; \
+ v2 = ROTL(v2, 32); \
+} while (0)
+
+CSipHasher::CSipHasher(uint64_t k0, uint64_t k1)
+{
+ v[0] = 0x736f6d6570736575ULL ^ k0;
+ v[1] = 0x646f72616e646f6dULL ^ k1;
+ v[2] = 0x6c7967656e657261ULL ^ k0;
+ v[3] = 0x7465646279746573ULL ^ k1;
+ count = 0;
+ tmp = 0;
+}
+
+CSipHasher& CSipHasher::Write(uint64_t data)
+{
+ uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
+
+ assert(count % 8 == 0);
+
+ v3 ^= data;
+ SIPROUND;
+ SIPROUND;
+ v0 ^= data;
+
+ v[0] = v0;
+ v[1] = v1;
+ v[2] = v2;
+ v[3] = v3;
+
+ count += 8;
+ return *this;
+}
+
+CSipHasher& CSipHasher::Write(const unsigned char* data, size_t size)
+{
+ uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
+ uint64_t t = tmp;
+ int c = count;
+
+ while (size--) {
+ t |= ((uint64_t)(*(data++))) << (8 * (c % 8));
+ c++;
+ if ((c & 7) == 0) {
+ v3 ^= t;
+ SIPROUND;
+ SIPROUND;
+ v0 ^= t;
+ t = 0;
+ }
+ }
+
+ v[0] = v0;
+ v[1] = v1;
+ v[2] = v2;
+ v[3] = v3;
+ count = c;
+ tmp = t;
+
+ return *this;
+}
+
+uint64_t CSipHasher::Finalize() const
+{
+ uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
+
+ uint64_t t = tmp | (((uint64_t)count) << 56);
+
+ v3 ^= t;
+ SIPROUND;
+ SIPROUND;
+ v0 ^= t;
+ v2 ^= 0xFF;
+ SIPROUND;
+ SIPROUND;
+ SIPROUND;
+ SIPROUND;
+ return v0 ^ v1 ^ v2 ^ v3;
+}
+
+uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256& val)
+{
+ /* Specialized implementation for efficiency */
+ uint64_t d = val.GetUint64(0);
+
+ uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
+ uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
+ uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
+ uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d;
+
+ SIPROUND;
+ SIPROUND;
+ v0 ^= d;
+ d = val.GetUint64(1);
+ v3 ^= d;
+ SIPROUND;
+ SIPROUND;
+ v0 ^= d;
+ d = val.GetUint64(2);
+ v3 ^= d;
+ SIPROUND;
+ SIPROUND;
+ v0 ^= d;
+ d = val.GetUint64(3);
+ v3 ^= d;
+ SIPROUND;
+ SIPROUND;
+ v0 ^= d;
+ v3 ^= ((uint64_t)4) << 59;
+ SIPROUND;
+ SIPROUND;
+ v0 ^= ((uint64_t)4) << 59;
+ v2 ^= 0xFF;
+ SIPROUND;
+ SIPROUND;
+ SIPROUND;
+ SIPROUND;
+ return v0 ^ v1 ^ v2 ^ v3;
+}
diff --git a/src/hash.h b/src/hash.h
index daa92a0097..db4e130ae7 100644
--- a/src/hash.h
+++ b/src/hash.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
@@ -171,4 +171,38 @@ unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char
void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]);
+/** SipHash-2-4 */
+class CSipHasher
+{
+private:
+ uint64_t v[4];
+ uint64_t tmp;
+ int count;
+
+public:
+ /** Construct a SipHash calculator initialized with 128-bit key (k0, k1) */
+ CSipHasher(uint64_t k0, uint64_t k1);
+ /** Hash a 64-bit integer worth of data
+ * It is treated as if this was the little-endian interpretation of 8 bytes.
+ * This function can only be used when a multiple of 8 bytes have been written so far.
+ */
+ CSipHasher& Write(uint64_t data);
+ /** Hash arbitrary bytes. */
+ CSipHasher& Write(const unsigned char* data, size_t size);
+ /** Compute the 64-bit SipHash-2-4 of the data written so far. The object remains untouched. */
+ uint64_t Finalize() const;
+};
+
+/** Optimized SipHash-2-4 implementation for uint256.
+ *
+ * It is identical to:
+ * SipHasher(k0, k1)
+ * .Write(val.GetUint64(0))
+ * .Write(val.GetUint64(1))
+ * .Write(val.GetUint64(2))
+ * .Write(val.GetUint64(3))
+ * .Finalize()
+ */
+uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256& val);
+
#endif // BITCOIN_HASH_H
diff --git a/src/httprpc.cpp b/src/httprpc.cpp
index 2920aa26f7..6a6c5276cc 100644
--- a/src/httprpc.cpp
+++ b/src/httprpc.cpp
@@ -1,10 +1,14 @@
+// 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 "httprpc.h"
#include "base58.h"
#include "chainparams.h"
#include "httpserver.h"
-#include "rpcprotocol.h"
-#include "rpcserver.h"
+#include "rpc/protocol.h"
+#include "rpc/server.h"
#include "random.h"
#include "sync.h"
#include "util.h"
@@ -17,6 +21,9 @@
#include <boost/algorithm/string.hpp> // boost::trim
#include <boost/foreach.hpp> //BOOST_FOREACH
+/** WWW-Authenticate to present with 401 Unauthorized response */
+static const char* WWW_AUTH_HEADER_DATA = "Basic realm=\"jsonrpc\"";
+
/** Simple one-shot callback timer to be used by the RPC mechanism to e.g.
* re-lock the wellet.
*/
@@ -38,7 +45,7 @@ private:
class HTTPRPCTimerInterface : public RPCTimerInterface
{
public:
- HTTPRPCTimerInterface(struct event_base* base) : base(base)
+ HTTPRPCTimerInterface(struct event_base* _base) : base(_base)
{
}
const char* Name()
@@ -147,6 +154,7 @@ static bool HTTPReq_JSONRPC(HTTPRequest* req, const std::string &)
// Check authorization
std::pair<bool, std::string> authHeader = req->GetHeader("authorization");
if (!authHeader.first) {
+ req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA);
req->WriteReply(HTTP_UNAUTHORIZED);
return false;
}
@@ -159,6 +167,7 @@ static bool HTTPReq_JSONRPC(HTTPRequest* req, const std::string &)
shouldn't have their RPC port exposed. */
MilliSleep(250);
+ req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA);
req->WriteReply(HTTP_UNAUTHORIZED);
return false;
}
@@ -210,7 +219,7 @@ static bool InitRPCAuthentication()
return false;
}
} else {
- LogPrintf("Config options rpcuser and rpcpassword will soon be deprecated. Locally-run instances may remove rpcuser to use cookie-based auth, or may be replaced with rpcauth. Please see share/rpcuser for rpcauth auth generation.");
+ LogPrintf("Config options rpcuser and rpcpassword will soon be deprecated. Locally-run instances may remove rpcuser to use cookie-based auth, or may be replaced with rpcauth. Please see share/rpcuser for rpcauth auth generation.\n");
strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"];
}
return true;
@@ -226,7 +235,7 @@ bool StartHTTPRPC()
assert(EventBase());
httpRPCTimerInterface = new HTTPRPCTimerInterface(EventBase());
- RPCRegisterTimerInterface(httpRPCTimerInterface);
+ RPCSetTimerInterface(httpRPCTimerInterface);
return true;
}
@@ -240,7 +249,7 @@ void StopHTTPRPC()
LogPrint("rpc", "Stopping HTTP RPC server\n");
UnregisterHTTPHandler("/", true);
if (httpRPCTimerInterface) {
- RPCUnregisterTimerInterface(httpRPCTimerInterface);
+ RPCUnsetTimerInterface(httpRPCTimerInterface);
delete httpRPCTimerInterface;
httpRPCTimerInterface = 0;
}
diff --git a/src/httpserver.cpp b/src/httpserver.cpp
index 91518d7c5f..b296b28503 100644
--- a/src/httpserver.cpp
+++ b/src/httpserver.cpp
@@ -8,7 +8,7 @@
#include "compat.h"
#include "util.h"
#include "netbase.h"
-#include "rpcprotocol.h" // For HTTP status codes
+#include "rpc/protocol.h" // For HTTP status codes
#include "sync.h"
#include "ui_interface.h"
@@ -19,6 +19,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
+#include <future>
#include <event2/event.h>
#include <event2/http.h>
@@ -34,10 +35,6 @@
#endif
#endif
-#include <boost/algorithm/string/case_conv.hpp> // for to_lower()
-#include <boost/foreach.hpp>
-#include <boost/scoped_ptr.hpp>
-
/** Maximum size of http request (request line + headers) */
static const size_t MAX_HEADERS_SIZE = 8192;
@@ -45,8 +42,8 @@ static const size_t MAX_HEADERS_SIZE = 8192;
class HTTPWorkItem : public HTTPClosure
{
public:
- HTTPWorkItem(HTTPRequest* req, const std::string &path, const HTTPRequestHandler& func):
- req(req), path(path), func(func)
+ HTTPWorkItem(std::unique_ptr<HTTPRequest> _req, const std::string &_path, const HTTPRequestHandler& _func):
+ req(std::move(_req)), path(_path), func(_func)
{
}
void operator()()
@@ -54,7 +51,7 @@ public:
func(req.get(), path);
}
- boost::scoped_ptr<HTTPRequest> req;
+ std::unique_ptr<HTTPRequest> req;
private:
std::string path;
@@ -69,10 +66,9 @@ class WorkQueue
{
private:
/** Mutex protects entire object */
- CWaitableCriticalSection cs;
- CConditionVariable cond;
- /* XXX in C++11 we can use std::unique_ptr here and avoid manual cleanup */
- std::deque<WorkItem*> queue;
+ std::mutex cs;
+ std::condition_variable cond;
+ std::deque<std::unique_ptr<WorkItem>> queue;
bool running;
size_t maxDepth;
int numThreads;
@@ -84,41 +80,37 @@ private:
WorkQueue &wq;
ThreadCounter(WorkQueue &w): wq(w)
{
- boost::lock_guard<boost::mutex> lock(wq.cs);
+ std::lock_guard<std::mutex> lock(wq.cs);
wq.numThreads += 1;
}
~ThreadCounter()
{
- boost::lock_guard<boost::mutex> lock(wq.cs);
+ std::lock_guard<std::mutex> lock(wq.cs);
wq.numThreads -= 1;
wq.cond.notify_all();
}
};
public:
- WorkQueue(size_t maxDepth) : running(true),
- maxDepth(maxDepth),
+ WorkQueue(size_t _maxDepth) : running(true),
+ maxDepth(_maxDepth),
numThreads(0)
{
}
- /*( Precondition: worker threads have all stopped
+ /** Precondition: worker threads have all stopped
* (call WaitExit)
*/
~WorkQueue()
{
- while (!queue.empty()) {
- delete queue.front();
- queue.pop_front();
- }
}
/** Enqueue a work item */
bool Enqueue(WorkItem* item)
{
- boost::unique_lock<boost::mutex> lock(cs);
+ std::unique_lock<std::mutex> lock(cs);
if (queue.size() >= maxDepth) {
return false;
}
- queue.push_back(item);
+ queue.emplace_back(std::unique_ptr<WorkItem>(item));
cond.notify_one();
return true;
}
@@ -127,31 +119,30 @@ public:
{
ThreadCounter count(*this);
while (running) {
- WorkItem* i = 0;
+ std::unique_ptr<WorkItem> i;
{
- boost::unique_lock<boost::mutex> lock(cs);
+ std::unique_lock<std::mutex> lock(cs);
while (running && queue.empty())
cond.wait(lock);
if (!running)
break;
- i = queue.front();
+ i = std::move(queue.front());
queue.pop_front();
}
(*i)();
- delete i;
}
}
/** Interrupt and exit loops */
void Interrupt()
{
- boost::unique_lock<boost::mutex> lock(cs);
+ std::unique_lock<std::mutex> lock(cs);
running = false;
cond.notify_all();
}
/** Wait for worker threads to exit */
void WaitExit()
{
- boost::unique_lock<boost::mutex> lock(cs);
+ std::unique_lock<std::mutex> lock(cs);
while (numThreads > 0)
cond.wait(lock);
}
@@ -159,7 +150,7 @@ public:
/** Return current depth of queue */
size_t Depth()
{
- boost::unique_lock<boost::mutex> lock(cs);
+ std::unique_lock<std::mutex> lock(cs);
return queue.size();
}
};
@@ -167,8 +158,8 @@ public:
struct HTTPPathHandler
{
HTTPPathHandler() {}
- HTTPPathHandler(std::string prefix, bool exactMatch, HTTPRequestHandler handler):
- prefix(prefix), exactMatch(exactMatch), handler(handler)
+ HTTPPathHandler(std::string _prefix, bool _exactMatch, HTTPRequestHandler _handler):
+ prefix(_prefix), exactMatch(_exactMatch), handler(_handler)
{
}
std::string prefix;
@@ -196,7 +187,7 @@ static bool ClientAllowed(const CNetAddr& netaddr)
{
if (!netaddr.IsValid())
return false;
- BOOST_FOREACH (const CSubNet& subnet, rpc_allow_subnets)
+ for(const CSubNet& subnet : rpc_allow_subnets)
if (subnet.Match(netaddr))
return true;
return false;
@@ -206,12 +197,17 @@ static bool ClientAllowed(const CNetAddr& netaddr)
static bool InitHTTPAllowList()
{
rpc_allow_subnets.clear();
- rpc_allow_subnets.push_back(CSubNet("127.0.0.0/8")); // always allow IPv4 local subnet
- rpc_allow_subnets.push_back(CSubNet("::1")); // always allow IPv6 localhost
+ CNetAddr localv4;
+ CNetAddr localv6;
+ LookupHost("127.0.0.1", localv4, false);
+ LookupHost("::1", localv6, false);
+ rpc_allow_subnets.push_back(CSubNet(localv4, 8)); // always allow IPv4 local subnet
+ rpc_allow_subnets.push_back(CSubNet(localv6)); // always allow IPv6 localhost
if (mapMultiArgs.count("-rpcallowip")) {
const std::vector<std::string>& vAllow = mapMultiArgs["-rpcallowip"];
- BOOST_FOREACH (std::string strAllow, vAllow) {
- CSubNet subnet(strAllow);
+ for (std::string strAllow : vAllow) {
+ CSubNet subnet;
+ LookupSubNet(strAllow.c_str(), subnet);
if (!subnet.IsValid()) {
uiInterface.ThreadSafeMessageBox(
strprintf("Invalid -rpcallowip subnet specification: %s. Valid 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).", strAllow),
@@ -222,7 +218,7 @@ static bool InitHTTPAllowList()
}
}
std::string strAllowed;
- BOOST_FOREACH (const CSubNet& subnet, rpc_allow_subnets)
+ for (const CSubNet& subnet : rpc_allow_subnets)
strAllowed += subnet.ToString() + " ";
LogPrint("http", "Allowing HTTP connections from: %s\n", strAllowed);
return true;
@@ -252,7 +248,7 @@ static std::string RequestMethodString(HTTPRequest::RequestMethod m)
/** HTTP request callback */
static void http_request_cb(struct evhttp_request* req, void* arg)
{
- std::auto_ptr<HTTPRequest> hreq(new HTTPRequest(req));
+ std::unique_ptr<HTTPRequest> hreq(new HTTPRequest(req));
LogPrint("http", "Received a %s request for %s from %s\n",
RequestMethodString(hreq->GetRequestMethod()), hreq->GetURI(), hreq->GetPeer().ToString());
@@ -288,12 +284,14 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
// Dispatch to worker thread
if (i != iend) {
- std::auto_ptr<HTTPWorkItem> item(new HTTPWorkItem(hreq.release(), path, i->handler));
+ std::unique_ptr<HTTPWorkItem> item(new HTTPWorkItem(std::move(hreq), path, i->handler));
assert(workQueue);
if (workQueue->Enqueue(item.get()))
item.release(); /* if true, queue took ownership */
- else
+ else {
+ LogPrintf("WARNING: request rejected because http work queue depth exceeded, it can be increased with the -rpcworkqueue= setting\n");
item->req->WriteReply(HTTP_INTERNAL, "Work queue depth exceeded");
+ }
} else {
hreq->WriteReply(HTTP_NOTFOUND);
}
@@ -307,13 +305,14 @@ static void http_reject_request_cb(struct evhttp_request* req, void*)
}
/** Event dispatcher thread */
-static void ThreadHTTP(struct event_base* base, struct evhttp* http)
+static bool ThreadHTTP(struct event_base* base, struct evhttp* http)
{
RenameThread("bitcoin-http");
LogPrint("http", "Entering http event loop\n");
event_base_dispatch(base);
// Event loop will be interrupted by InterruptHTTPServer()
LogPrint("http", "Exited http event loop\n");
+ return event_base_got_break(base) == 0;
}
/** Bind HTTP server to specified addresses */
@@ -442,17 +441,22 @@ bool InitHTTPServer()
return true;
}
-boost::thread threadHTTP;
+std::thread threadHTTP;
+std::future<bool> threadResult;
bool StartHTTPServer()
{
LogPrint("http", "Starting HTTP server\n");
int rpcThreads = std::max((long)GetArg("-rpcthreads", DEFAULT_HTTP_THREADS), 1L);
LogPrintf("HTTP: starting %d worker threads\n", rpcThreads);
- threadHTTP = boost::thread(boost::bind(&ThreadHTTP, eventBase, eventHTTP));
+ std::packaged_task<bool(event_base*, evhttp*)> task(ThreadHTTP);
+ threadResult = task.get_future();
+ threadHTTP = std::thread(std::move(task), eventBase, eventHTTP);
- for (int i = 0; i < rpcThreads; i++)
- boost::thread(boost::bind(&HTTPWorkQueueRun, workQueue));
+ for (int i = 0; i < rpcThreads; i++) {
+ std::thread rpc_worker(HTTPWorkQueueRun, workQueue);
+ rpc_worker.detach();
+ }
return true;
}
@@ -461,7 +465,7 @@ void InterruptHTTPServer()
LogPrint("http", "Interrupting HTTP server\n");
if (eventHTTP) {
// Unlisten sockets
- BOOST_FOREACH (evhttp_bound_socket *socket, boundSockets) {
+ for (evhttp_bound_socket *socket : boundSockets) {
evhttp_del_accept_socket(eventHTTP, socket);
}
// Reject requests on current connections
@@ -487,15 +491,11 @@ void StopHTTPServer()
// master that appears to be solved, so in the future that solution
// could be used again (if desirable).
// (see discussion in https://github.com/bitcoin/bitcoin/pull/6990)
-#if BOOST_VERSION >= 105000
- if (!threadHTTP.try_join_for(boost::chrono::milliseconds(2000))) {
-#else
- if (!threadHTTP.timed_join(boost::posix_time::milliseconds(2000))) {
-#endif
+ if (threadResult.valid() && threadResult.wait_for(std::chrono::milliseconds(2000)) == std::future_status::timeout) {
LogPrintf("HTTP event loop did not exit within allotted time, sending loopbreak\n");
event_base_loopbreak(eventBase);
- threadHTTP.join();
}
+ threadHTTP.join();
}
if (eventHTTP) {
evhttp_free(eventHTTP);
@@ -522,8 +522,8 @@ static void httpevent_callback_fn(evutil_socket_t, short, void* data)
delete self;
}
-HTTPEvent::HTTPEvent(struct event_base* base, bool deleteWhenTriggered, const boost::function<void(void)>& handler):
- deleteWhenTriggered(deleteWhenTriggered), handler(handler)
+HTTPEvent::HTTPEvent(struct event_base* base, bool _deleteWhenTriggered, const std::function<void(void)>& _handler):
+ deleteWhenTriggered(_deleteWhenTriggered), handler(_handler)
{
ev = event_new(base, -1, 0, httpevent_callback_fn, this);
assert(ev);
@@ -539,7 +539,7 @@ void HTTPEvent::trigger(struct timeval* tv)
else
evtimer_add(ev, tv); // trigger after timeval passed
}
-HTTPRequest::HTTPRequest(struct evhttp_request* req) : req(req),
+HTTPRequest::HTTPRequest(struct evhttp_request* _req) : req(_req),
replySent(false)
{
}
@@ -604,7 +604,7 @@ void HTTPRequest::WriteReply(int nStatus, const std::string& strReply)
assert(evb);
evbuffer_add(evb, strReply.data(), strReply.size());
HTTPEvent* ev = new HTTPEvent(eventBase, true,
- boost::bind(evhttp_send_reply, req, nStatus, (const char*)NULL, (struct evbuffer *)NULL));
+ std::bind(evhttp_send_reply, req, nStatus, (const char*)NULL, (struct evbuffer *)NULL));
ev->trigger(0);
replySent = true;
req = 0; // transferred back to main thread
@@ -619,7 +619,7 @@ CService HTTPRequest::GetPeer()
const char* address = "";
uint16_t port = 0;
evhttp_connection_get_peer(con, (char**)&address, &port);
- peer = CService(address, port);
+ peer = LookupNumeric(address, port);
}
return peer;
}
diff --git a/src/httpserver.h b/src/httpserver.h
index 20a119cc5c..49d67f4b88 100644
--- a/src/httpserver.h
+++ b/src/httpserver.h
@@ -7,9 +7,7 @@
#include <string>
#include <stdint.h>
-#include <boost/thread.hpp>
-#include <boost/scoped_ptr.hpp>
-#include <boost/function.hpp>
+#include <functional>
static const int DEFAULT_HTTP_THREADS=4;
static const int DEFAULT_HTTP_WORKQUEUE=16;
@@ -35,7 +33,7 @@ void InterruptHTTPServer();
void StopHTTPServer();
/** Handler for requests to a certain HTTP path */
-typedef boost::function<void(HTTPRequest* req, const std::string &)> HTTPRequestHandler;
+typedef std::function<bool(HTTPRequest* req, const std::string &)> HTTPRequestHandler;
/** Register handler for prefix.
* If multiple handlers match a prefix, the first-registered one will
* be invoked.
@@ -132,7 +130,7 @@ public:
* deleteWhenTriggered deletes this event object after the event is triggered (and the handler called)
* handler is the handler to call when the event is triggered.
*/
- HTTPEvent(struct event_base* base, bool deleteWhenTriggered, const boost::function<void(void)>& handler);
+ HTTPEvent(struct event_base* base, bool deleteWhenTriggered, const std::function<void(void)>& handler);
~HTTPEvent();
/** Trigger the event. If tv is 0, trigger it immediately. Otherwise trigger it after
@@ -141,7 +139,7 @@ public:
void trigger(struct timeval* tv);
bool deleteWhenTriggered;
- boost::function<void(void)> handler;
+ std::function<void(void)> handler;
private:
struct event* ev;
};
diff --git a/src/indirectmap.h b/src/indirectmap.h
new file mode 100644
index 0000000000..76da4a6bd5
--- /dev/null
+++ b/src/indirectmap.h
@@ -0,0 +1,56 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_INDIRECTMAP_H
+#define BITCOIN_INDIRECTMAP_H
+
+template <class T>
+struct DereferencingComparator { bool operator()(const T a, const T b) const { return *a < *b; } };
+
+/* Map whose keys are pointers, but are compared by their dereferenced values.
+ *
+ * Differs from a plain std::map<const K*, T, DereferencingComparator<K*> > in
+ * that methods that take a key for comparison take a K rather than taking a K*
+ * (taking a K* would be confusing, since it's the value rather than the address
+ * of the object for comparison that matters due to the dereferencing comparator).
+ *
+ * Objects pointed to by keys must not be modified in any way that changes the
+ * result of DereferencingComparator.
+ */
+template <class K, class T>
+class indirectmap {
+private:
+ typedef std::map<const K*, T, DereferencingComparator<const K*> > base;
+ base m;
+public:
+ typedef typename base::iterator iterator;
+ typedef typename base::const_iterator const_iterator;
+ typedef typename base::size_type size_type;
+ typedef typename base::value_type value_type;
+
+ // passthrough (pointer interface)
+ std::pair<iterator, bool> insert(const value_type& value) { return m.insert(value); }
+
+ // pass address (value interface)
+ iterator find(const K& key) { return m.find(&key); }
+ const_iterator find(const K& key) const { return m.find(&key); }
+ iterator lower_bound(const K& key) { return m.lower_bound(&key); }
+ const_iterator lower_bound(const K& key) const { return m.lower_bound(&key); }
+ size_type erase(const K& key) { return m.erase(&key); }
+ size_type count(const K& key) const { return m.count(&key); }
+
+ // passthrough
+ bool empty() const { return m.empty(); }
+ size_type size() const { return m.size(); }
+ size_type max_size() const { return m.max_size(); }
+ void clear() { m.clear(); }
+ iterator begin() { return m.begin(); }
+ iterator end() { return m.end(); }
+ const_iterator begin() const { return m.begin(); }
+ const_iterator end() const { return m.end(); }
+ const_iterator cbegin() const { return m.cbegin(); }
+ const_iterator cend() const { return m.cend(); }
+};
+
+#endif // BITCOIN_INDIRECTMAP_H
diff --git a/src/init.cpp b/src/init.cpp
index 645c8f94b1..eefef7ba0b 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -21,34 +21,37 @@
#include "key.h"
#include "main.h"
#include "miner.h"
+#include "netbase.h"
#include "net.h"
#include "policy/policy.h"
-#include "rpcserver.h"
+#include "rpc/server.h"
+#include "rpc/register.h"
#include "script/standard.h"
#include "script/sigcache.h"
#include "scheduler.h"
+#include "timedata.h"
#include "txdb.h"
#include "txmempool.h"
#include "torcontrol.h"
#include "ui_interface.h"
#include "util.h"
#include "utilmoneystr.h"
-#include "utilstrencodings.h"
#include "validationinterface.h"
#ifdef ENABLE_WALLET
-#include "wallet/db.h"
#include "wallet/wallet.h"
-#include "wallet/walletdb.h"
#endif
#include <stdint.h>
#include <stdio.h>
+#include <memory>
#ifndef WIN32
#include <signal.h>
#endif
+#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/replace.hpp>
+#include <boost/algorithm/string/split.hpp>
#include <boost/bind.hpp>
#include <boost/filesystem.hpp>
#include <boost/function.hpp>
@@ -62,15 +65,14 @@
using namespace std;
-#ifdef ENABLE_WALLET
-CWallet* pwalletMain = NULL;
-#endif
bool fFeeEstimatesInitialized = false;
static const bool DEFAULT_PROXYRANDOMIZE = true;
static const bool DEFAULT_REST_ENABLE = false;
static const bool DEFAULT_DISABLE_SAFEMODE = false;
static const bool DEFAULT_STOPAFTERBLOCKIMPORT = false;
+std::unique_ptr<CConnman> g_connman;
+
#if ENABLE_ZMQ
static CZMQNotificationInterface* pzmqNotificationInterface = NULL;
#endif
@@ -93,7 +95,6 @@ enum BindFlags {
};
static const char* FEE_ESTIMATES_FILENAME="fee_estimates.dat";
-CClientUIInterface uiInterface; // Declared but not defined in ui_interface.h
//////////////////////////////////////////////////////////////////////////////
//
@@ -125,7 +126,7 @@ CClientUIInterface uiInterface; // Declared but not defined in ui_interface.h
// shutdown thing.
//
-volatile bool fRequestShutdown = false;
+std::atomic<bool> fRequestShutdown(false);
void StartShutdown()
{
@@ -136,6 +137,11 @@ bool ShutdownRequested()
return fRequestShutdown;
}
+/**
+ * This is a minimally invasive approach to shutdown on LevelDB read errors from the
+ * chainstate, while keeping user interface out of the common library, which is shared
+ * between bitcoind, and bitcoin-qt and non-server tools.
+*/
class CCoinsViewErrorCatcher : public CCoinsViewBacked
{
public:
@@ -158,7 +164,7 @@ public:
static CCoinsViewDB *pcoinsdbview = NULL;
static CCoinsViewErrorCatcher *pcoinscatcher = NULL;
-static boost::scoped_ptr<ECCVerifyHandle> globalVerifyHandle;
+static std::unique_ptr<ECCVerifyHandle> globalVerifyHandle;
void Interrupt(boost::thread_group& threadGroup)
{
@@ -193,8 +199,9 @@ void Shutdown()
if (pwalletMain)
pwalletMain->Flush(false);
#endif
- GenerateBitcoins(false, 0, Params());
- StopNode();
+ MapPort(false);
+ g_connman.reset();
+
StopTorControl();
UnregisterNodeSignals(GetNodeSignals());
@@ -266,32 +273,26 @@ void HandleSIGHUP(int)
fReopenDebugLog = true;
}
-bool static InitError(const std::string &str)
-{
- uiInterface.ThreadSafeMessageBox(str, "", CClientUIInterface::MSG_ERROR);
- return false;
-}
-
-bool static InitWarning(const std::string &str)
-{
- uiInterface.ThreadSafeMessageBox(str, "", CClientUIInterface::MSG_WARNING);
- return true;
-}
-
-bool static Bind(const CService &addr, unsigned int flags) {
+bool static Bind(CConnman& connman, const CService &addr, unsigned int flags) {
if (!(flags & BF_EXPLICIT) && IsLimited(addr))
return false;
std::string strError;
- if (!BindListenPort(addr, strError, (flags & BF_WHITELIST) != 0)) {
+ if (!connman.BindListenPort(addr, strError, (flags & BF_WHITELIST) != 0)) {
if (flags & BF_REPORT_ERROR)
return InitError(strError);
return false;
}
return true;
}
+void OnRPCStarted()
+{
+ uiInterface.NotifyBlockTip.connect(&RPCNotifyBlockChange);
+}
void OnRPCStopped()
{
+ uiInterface.NotifyBlockTip.disconnect(&RPCNotifyBlockChange);
+ RPCNotifyBlockChange(false, nullptr);
cvBlockChange.notify_all();
LogPrint("rpc", "RPC stopped.\n");
}
@@ -312,8 +313,8 @@ std::string HelpMessage(HelpMessageMode mode)
// 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("-?", _("Print this help message and exit"));
+ strUsage += HelpMessageOpt("-version", _("Print version and exit"));
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)"));
if (showDebug)
@@ -323,12 +324,14 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-conf=<file>", strprintf(_("Specify configuration file (default: %s)"), BITCOIN_CONF_FILENAME));
if (mode == HMM_BITCOIND)
{
-#ifndef WIN32
+#if HAVE_DECL_DAEMON
strUsage += HelpMessageOpt("-daemon", _("Run in the background as a daemon and accept commands"));
#endif
}
strUsage += HelpMessageOpt("-datadir=<dir>", _("Specify data directory"));
strUsage += HelpMessageOpt("-dbcache=<n>", strprintf(_("Set database cache size in megabytes (%d to %d, default: %d)"), nMinDbCache, nMaxDbCache, nDefaultDbCache));
+ if (showDebug)
+ strUsage += HelpMessageOpt("-feefilter", strprintf("Tell other nodes to filter invs to us by our mempool min fee (default: %u)", DEFAULT_FEEFILTER));
strUsage += HelpMessageOpt("-loadblock=<file>", _("Imports blocks from external blk000??.dat file on startup"));
strUsage += HelpMessageOpt("-maxorphantx=<n>", strprintf(_("Keep at most <n> unconnectable transactions in memory (default: %u)"), DEFAULT_MAX_ORPHAN_TRANSACTIONS));
strUsage += HelpMessageOpt("-maxmempool=<n>", strprintf(_("Keep the transaction memory pool below <n> megabytes (default: %u)"), DEFAULT_MAX_MEMPOOL_SIZE));
@@ -341,7 +344,8 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-prune=<n>", strprintf(_("Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. "
"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"));
+ strUsage += HelpMessageOpt("-reindex-chainstate", _("Rebuild chain state from the currently indexed blocks"));
+ strUsage += HelpMessageOpt("-reindex", _("Rebuild chain state and block index from the blk*.dat files on disk"));
#ifndef WIN32
strUsage += HelpMessageOpt("-sysperms", _("Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)"));
#endif
@@ -363,12 +367,11 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-maxconnections=<n>", strprintf(_("Maintain at most <n> connections to peers (default: %u)"), DEFAULT_MAX_PEER_CONNECTIONS));
strUsage += HelpMessageOpt("-maxreceivebuffer=<n>", strprintf(_("Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)"), DEFAULT_MAXRECEIVEBUFFER));
strUsage += HelpMessageOpt("-maxsendbuffer=<n>", strprintf(_("Maximum per-connection send buffer, <n>*1000 bytes (default: %u)"), DEFAULT_MAXSENDBUFFER));
+ strUsage += HelpMessageOpt("-maxtimeadjustment", strprintf(_("Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)"), DEFAULT_MAX_TIME_ADJUSTMENT));
strUsage += HelpMessageOpt("-onion=<ip:port>", strprintf(_("Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)"), "-proxy"));
strUsage += HelpMessageOpt("-onlynet=<net>", _("Only connect to nodes in network <net> (ipv4, ipv6 or onion)"));
strUsage += HelpMessageOpt("-permitbaremultisig", strprintf(_("Relay non-P2SH multisig (default: %u)"), DEFAULT_PERMIT_BAREMULTISIG));
- strUsage += HelpMessageOpt("-peerbloomfilters", strprintf(_("Support filtering of blocks and transaction with bloom filters (default: %u)"), 1));
- if (showDebug)
- strUsage += HelpMessageOpt("-enforcenodebloom", strprintf("Enforce minimum protocol version to limit use of bloom filters (default: %u)", 0));
+ strUsage += HelpMessageOpt("-peerbloomfilters", strprintf(_("Support filtering of blocks and transaction with bloom filters (default: %u)"), DEFAULT_PEERBLOOMFILTERS));
strUsage += HelpMessageOpt("-port=<port>", strprintf(_("Listen for connections on <port> (default: %u or testnet: %u)"), Params(CBaseChainParams::MAIN).GetDefaultPort(), Params(CBaseChainParams::TESTNET).GetDefaultPort()));
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)"), DEFAULT_PROXYRANDOMIZE));
@@ -386,30 +389,12 @@ 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"));
- strUsage += HelpMessageOpt("-whitelistalwaysrelay", strprintf(_("Always relay transactions received from whitelisted peers (default: %d)"), DEFAULT_WHITELISTALWAYSRELAY));
+ strUsage += HelpMessageOpt("-whitelistrelay", strprintf(_("Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)"), DEFAULT_WHITELISTRELAY));
+ strUsage += HelpMessageOpt("-whitelistforcerelay", strprintf(_("Force relay of transactions from whitelisted peers even if they violate local relay policy (default: %d)"), DEFAULT_WHITELISTFORCERELAY));
strUsage += HelpMessageOpt("-maxuploadtarget=<n>", strprintf(_("Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)"), DEFAULT_MAX_UPLOAD_TARGET));
#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)"), DEFAULT_KEYPOOL_SIZE));
- strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf(_("Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)"),
- CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MINFEE)));
- strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in %s/kB) to add to transactions you send (default: %s)"),
- CURRENCY_UNIT, 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)"), DEFAULT_SEND_FREE_TRANSACTIONS));
- strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), DEFAULT_SPEND_ZEROCONF_CHANGE));
- 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 (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)"),
- CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MAXFEE)));
- 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"));
- strUsage += HelpMessageOpt("-walletbroadcast", _("Make the wallet broadcast transactions") + " " + strprintf(_("(default: %u)"), DEFAULT_WALLETBROADCAST));
- 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)"));
+ strUsage += CWallet::GetWalletHelpString(showDebug);
#endif
#if ENABLE_ZMQ
@@ -421,51 +406,50 @@ std::string HelpMessage(HelpMessageMode mode)
#endif
strUsage += HelpMessageGroup(_("Debugging/Testing options:"));
+ strUsage += HelpMessageOpt("-uacomment=<cmt>", _("Append comment to the user agent string"));
if (showDebug)
{
+ strUsage += HelpMessageOpt("-checkblockindex", strprintf("Do a full consistency check for mapBlockIndex, setBlockIndexCandidates, chainActive and mapBlocksUnlinked occasionally. Also sets -checkmempool (default: %u)", Params(CBaseChainParams::MAIN).DefaultConsistencyChecks()));
+ strUsage += HelpMessageOpt("-checkmempool=<n>", strprintf("Run checks every <n> transactions (default: %u)", Params(CBaseChainParams::MAIN).DefaultConsistencyChecks()));
strUsage += HelpMessageOpt("-checkpoints", strprintf("Disable expensive verification for known chain history (default: %u)", DEFAULT_CHECKPOINTS_ENABLED));
-#ifdef ENABLE_WALLET
- strUsage += HelpMessageOpt("-dblogsize=<n>", strprintf("Flush wallet database activity from memory to disk log every <n> megabytes (default: %u)", DEFAULT_WALLET_DBLOGSIZE));
-#endif
strUsage += HelpMessageOpt("-disablesafemode", strprintf("Disable safemode, override a real safe mode event (default: %u)", DEFAULT_DISABLE_SAFEMODE));
strUsage += HelpMessageOpt("-testsafemode", strprintf("Force safe mode (default: %u)", DEFAULT_TESTSAFEMODE));
strUsage += HelpMessageOpt("-dropmessagestest=<n>", "Randomly drop 1 of every <n> network messages");
strUsage += HelpMessageOpt("-fuzzmessagestest=<n>", "Randomly fuzz 1 of every <n> network messages");
-#ifdef ENABLE_WALLET
- strUsage += HelpMessageOpt("-flushwallet", strprintf("Run a thread to flush wallet periodically (default: %u)", DEFAULT_FLUSHWALLET));
-#endif
strUsage += HelpMessageOpt("-stopafterblockimport", strprintf("Stop running after importing blocks from disk (default: %u)", DEFAULT_STOPAFTERBLOCKIMPORT));
strUsage += HelpMessageOpt("-limitancestorcount=<n>", strprintf("Do not accept transactions if number of in-mempool ancestors is <n> or more (default: %u)", DEFAULT_ANCESTOR_LIMIT));
strUsage += HelpMessageOpt("-limitancestorsize=<n>", strprintf("Do not accept transactions whose size with all in-mempool ancestors exceeds <n> kilobytes (default: %u)", DEFAULT_ANCESTOR_SIZE_LIMIT));
strUsage += HelpMessageOpt("-limitdescendantcount=<n>", strprintf("Do not accept transactions if any ancestor would have <n> or more in-mempool descendants (default: %u)", DEFAULT_DESCENDANT_LIMIT));
strUsage += HelpMessageOpt("-limitdescendantsize=<n>", strprintf("Do not accept transactions if any ancestor would have more than <n> kilobytes of in-mempool descendants (default: %u).", DEFAULT_DESCENDANT_SIZE_LIMIT));
+ strUsage += HelpMessageOpt("-bip9params=deployment:start:end", "Use given start/end times for specified BIP9 deployment (regtest-only)");
}
- string debugCategories = "addrman, alert, bench, coindb, db, lock, rand, rpc, selectcoins, mempool, mempoolrej, net, proxy, prune, http, libevent, tor, zmq"; // Don't translate these and qt below
+ string debugCategories = "addrman, alert, bench, coindb, db, http, libevent, lock, mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, selectcoins, tor, zmq"; // 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 or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
- strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), DEFAULT_GENERATE));
- strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), DEFAULT_GENERATE_THREADS));
+ if (showDebug)
+ strUsage += HelpMessageOpt("-nodebug", "Turn off debugging messages, same as -debug=0");
strUsage += HelpMessageOpt("-help-debug", _("Show all debugging options (usage: --help -help-debug)"));
strUsage += HelpMessageOpt("-logips", strprintf(_("Include IP addresses in debug output (default: %u)"), DEFAULT_LOGIPS));
strUsage += HelpMessageOpt("-logtimestamps", strprintf(_("Prepend debug output with timestamp (default: %u)"), DEFAULT_LOGTIMESTAMPS));
if (showDebug)
{
strUsage += HelpMessageOpt("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS));
+ strUsage += HelpMessageOpt("-mocktime=<n>", "Replace actual time with <n> seconds since epoch (default: 0)");
strUsage += HelpMessageOpt("-limitfreerelay=<n>", strprintf("Continuously rate-limit free transactions to <n>*1000 bytes per minute (default: %u)", DEFAULT_LIMITFREERELAY));
strUsage += HelpMessageOpt("-relaypriority", strprintf("Require high priority for relaying free or low-fee transactions (default: %u)", DEFAULT_RELAYPRIORITY));
strUsage += HelpMessageOpt("-maxsigcachesize=<n>", strprintf("Limit size of signature cache to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_SIZE));
+ strUsage += HelpMessageOpt("-maxtipage=<n>", strprintf("Maximum tip age in seconds to consider node in initial block download (default: %u)", DEFAULT_MAX_TIP_AGE));
}
strUsage += HelpMessageOpt("-minrelaytxfee=<amt>", strprintf(_("Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)"),
CURRENCY_UNIT, FormatMoney(DEFAULT_MIN_RELAY_TX_FEE)));
+ strUsage += HelpMessageOpt("-maxtxfee=<amt>", strprintf(_("Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)"),
+ CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MAXFEE)));
strUsage += HelpMessageOpt("-printtoconsole", _("Send trace/debug info to console instead of debug.log file"));
if (showDebug)
{
strUsage += HelpMessageOpt("-printpriority", strprintf("Log transaction priority and fee per kB when mining blocks (default: %u)", DEFAULT_PRINTPRIORITY));
-#ifdef ENABLE_WALLET
- strUsage += HelpMessageOpt("-privdb", strprintf("Sets the DB_PRIVATE flag in the wallet db environment (default: %u)", DEFAULT_WALLET_PRIVDB));
-#endif
}
strUsage += HelpMessageOpt("-shrinkdebugfile", _("Shrink debug.log file on client startup (default: 1 when no -debug)"));
@@ -474,20 +458,23 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageGroup(_("Node relay options:"));
if (showDebug)
strUsage += HelpMessageOpt("-acceptnonstdtxn", strprintf("Relay and mine \"non-standard\" transactions (%sdefault: %u)", "testnet/regtest only; ", !Params(CBaseChainParams::TESTNET).RequireStandard()));
+ strUsage += HelpMessageOpt("-bytespersigop", strprintf(_("Equivalent bytes per sigop in transactions for relay and mining (default: %u)"), DEFAULT_BYTES_PER_SIGOP));
strUsage += HelpMessageOpt("-datacarrier", strprintf(_("Relay and mine data carrier transactions (default: %u)"), DEFAULT_ACCEPT_DATACARRIER));
strUsage += HelpMessageOpt("-datacarriersize", strprintf(_("Maximum size of data in data carrier transactions we relay and mine (default: %u)"), MAX_OP_RETURN_RELAY));
+ strUsage += HelpMessageOpt("-mempoolreplacement", strprintf(_("Enable transaction replacement in the memory pool (default: %u)"), DEFAULT_ENABLE_REPLACEMENT));
strUsage += HelpMessageGroup(_("Block creation options:"));
- strUsage += HelpMessageOpt("-blockminsize=<n>", strprintf(_("Set minimum block size in bytes (default: %u)"), DEFAULT_BLOCK_MIN_SIZE));
+ strUsage += HelpMessageOpt("-blockmaxweight=<n>", strprintf(_("Set maximum BIP141 block weight (default: %d)"), DEFAULT_BLOCK_MAX_WEIGHT));
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 += HelpMessageOpt("-blockversion=<n>", "Override block version to test forking scenarios");
strUsage += HelpMessageGroup(_("RPC server options:"));
strUsage += HelpMessageOpt("-server", _("Accept command line and JSON-RPC commands"));
strUsage += HelpMessageOpt("-rest", strprintf(_("Accept public REST requests (default: %u)"), DEFAULT_REST_ENABLE));
strUsage += HelpMessageOpt("-rpcbind=<addr>", _("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)"));
+ strUsage += HelpMessageOpt("-rpccookiefile=<loc>", _("Location of the auth cookie (default: data dir)"));
strUsage += HelpMessageOpt("-rpcuser=<user>", _("Username for JSON-RPC connections"));
strUsage += HelpMessageOpt("-rpcpassword=<pw>", _("Password for JSON-RPC connections"));
strUsage += HelpMessageOpt("-rpcauth=<userpw>", _("Username and hashed password for JSON-RPC connections. The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is included in share/rpcuser. This option can be specified multiple times"));
@@ -504,14 +491,23 @@ std::string HelpMessage(HelpMessageMode mode)
std::string LicenseInfo()
{
- // todo: remove urls from translations on next change
- return FormatParagraph(strprintf(_("Copyright (C) 2009-%i The Bitcoin Core Developers"), COPYRIGHT_YEAR)) + "\n" +
+ const std::string URL_SOURCE_CODE = "<https://github.com/bitcoin/bitcoin>";
+ const std::string URL_WEBSITE = "<https://bitcoincore.org>";
+
+ return CopyrightHolders(strprintf(_("Copyright (C) %i-%i"), 2009, COPYRIGHT_YEAR) + " ") + "\n" +
"\n" +
- FormatParagraph(_("This is experimental software.")) + "\n" +
+ strprintf(_("Please contribute if you find %s useful. "
+ "Visit %s for further information about the software."),
+ PACKAGE_NAME, URL_WEBSITE) +
"\n" +
- FormatParagraph(_("Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.")) + "\n" +
+ strprintf(_("The source code is available from %s."),
+ URL_SOURCE_CODE) +
"\n" +
- FormatParagraph(_("This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.")) +
+ "\n" +
+ _("This is experimental software.") + "\n" +
+ strprintf(_("Distributed under the MIT software license, see the accompanying file %s or %s"), "COPYING", "<https://opensource.org/licenses/MIT>") + "\n" +
+ "\n" +
+ strprintf(_("This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit %s and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard."), "<https://www.openssl.org>") +
"\n";
}
@@ -526,6 +522,21 @@ static void BlockNotifyCallback(bool initialSync, const CBlockIndex *pBlockIndex
boost::thread t(runCommand, strCmd); // thread runs free
}
+static bool fHaveGenesis = false;
+static boost::mutex cs_GenesisWait;
+static CConditionVariable condvar_GenesisWait;
+
+static void BlockNotifyGenesisWait(bool, const CBlockIndex *pBlockIndex)
+{
+ if (pBlockIndex != NULL) {
+ {
+ boost::unique_lock<boost::mutex> lock_GenesisWait(cs_GenesisWait);
+ fHaveGenesis = true;
+ }
+ condvar_GenesisWait.notify_all();
+ }
+}
+
struct CImportingNow
{
CImportingNow() {
@@ -586,9 +597,10 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
{
const CChainParams& chainparams = Params();
RenameThread("bitcoin-loadblk");
+ CImportingNow imp;
+
// -reindex
if (fReindex) {
- CImportingNow imp;
int nFile = 0;
while (true) {
CDiskBlockPos pos(nFile, 0);
@@ -613,7 +625,6 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
if (boost::filesystem::exists(pathBootstrap)) {
FILE *file = fopen(pathBootstrap.string().c_str(), "rb");
if (file) {
- CImportingNow imp;
boost::filesystem::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old";
LogPrintf("Importing bootstrap.dat...\n");
LoadExternalBlockFile(chainparams, file);
@@ -627,7 +638,6 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
BOOST_FOREACH(const boost::filesystem::path& path, vImportFiles) {
FILE *file = fopen(path.string().c_str(), "rb");
if (file) {
- CImportingNow imp;
LogPrintf("Importing blocks file %s...\n", path.string());
LoadExternalBlockFile(chainparams, file);
} else {
@@ -635,6 +645,13 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
}
}
+ // scan for better chains in the block chain database, that are not yet connected in the active best chain
+ CValidationState state;
+ if (!ActivateBestChain(state, chainparams)) {
+ LogPrintf("Failed to connect best block");
+ StartShutdown();
+ }
+
if (GetBoolArg("-stopafterblockimport", DEFAULT_STOPAFTERBLOCKIMPORT)) {
LogPrintf("Stopping after block import\n");
StartShutdown();
@@ -659,6 +676,7 @@ bool InitSanityCheck(void)
bool AppInitServers(boost::thread_group& threadGroup)
{
+ RPCServer::OnStarted(&OnRPCStarted);
RPCServer::OnStopped(&OnRPCStopped);
RPCServer::OnPreCommand(&OnRPCPreCommand);
if (!InitHTTPServer())
@@ -737,17 +755,25 @@ void InitParameterInteraction()
LogPrintf("%s: parameter interaction: -zapwallettxes=<mode> -> setting -rescan=1\n", __func__);
}
- // disable walletbroadcast and whitelistalwaysrelay in blocksonly mode
+ // disable walletbroadcast and whitelistrelay in blocksonly mode
if (GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY)) {
- if (SoftSetBoolArg("-whitelistalwaysrelay", false))
- LogPrintf("%s: parameter interaction: -blocksonly=1 -> setting -whitelistalwaysrelay=0\n", __func__);
-#ifdef ENABLE_WALLET
- if (SoftSetBoolArg("-walletbroadcast", false))
- LogPrintf("%s: parameter interaction: -blocksonly=1 -> setting -walletbroadcast=0\n", __func__);
-#endif
+ if (SoftSetBoolArg("-whitelistrelay", false))
+ LogPrintf("%s: parameter interaction: -blocksonly=1 -> setting -whitelistrelay=0\n", __func__);
+ // walletbroadcast is disabled in CWallet::ParameterInteraction()
+ }
+
+ // Forcing relay from whitelisted hosts implies we will accept relays from them in the first place.
+ if (GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY)) {
+ if (SoftSetBoolArg("-whitelistrelay", true))
+ LogPrintf("%s: parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1\n", __func__);
}
}
+static std::string ResolveErrMsg(const char * const optname, const std::string& strBind)
+{
+ return strprintf(_("Cannot resolve -%s address: '%s'"), optname, strBind);
+}
+
void InitLogging()
{
fPrintToConsole = GetBoolArg("-printtoconsole", false);
@@ -756,7 +782,7 @@ void InitLogging()
fLogIPs = GetBoolArg("-logips", DEFAULT_LOGIPS);
LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
- LogPrintf("Bitcoin version %s (%s)\n", FormatFullVersion(), CLIENT_DATE);
+ LogPrintf("Bitcoin version %s\n", FormatFullVersion());
}
/** Initialize bitcoin.
@@ -792,12 +818,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
return InitError("Initializing networking failed");
#ifndef WIN32
- if (GetBoolArg("-sysperms", false)) {
-#ifdef ENABLE_WALLET
- if (!GetBoolArg("-disablewallet", false))
- return InitError("-sysperms is not allowed in combination with enabled wallet functionality");
-#endif
- } else {
+ if (!GetBoolArg("-sysperms", false)) {
umask(077);
}
@@ -825,21 +846,16 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// also see: InitParameterInteraction()
- // if using block pruning, then disable txindex
+ // if using block pruning, then disallow txindex
if (GetArg("-prune", 0)) {
if (GetBoolArg("-txindex", DEFAULT_TXINDEX))
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
}
// Make sure enough file descriptors are available
int nBind = std::max((int)mapArgs.count("-bind") + (int)mapArgs.count("-whitebind"), 1);
int nUserMaxConnections = GetArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS);
- nMaxConnections = std::max(nUserMaxConnections, 0);
+ int nMaxConnections = std::max(nUserMaxConnections, 0);
// Trim requested connection counts, to fit into system limitations
nMaxConnections = std::max(std::min(nMaxConnections, (int)(FD_SETSIZE - nBind - MIN_CORE_FILEDESCRIPTORS)), 0);
@@ -872,6 +888,12 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
if (GetBoolArg("-benchmark", false))
InitWarning(_("Unsupported argument -benchmark ignored, use -debug=bench."));
+ if (GetBoolArg("-whitelistalwaysrelay", false))
+ InitWarning(_("Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay."));
+
+ if (mapArgs.count("-blockminsize"))
+ InitWarning("Unsupported argument -blockminsize ignored.");
+
// Checkmempool and checkblockindex default to true in regtest mode
int ratio = std::min<int>(std::max<int>(GetArg("-checkmempool", chainparams.DefaultConsistencyChecks() ? 1 : 0), 0), 1000000);
if (ratio != 0) {
@@ -911,8 +933,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
fPruneMode = true;
}
+ RegisterAllCoreRPCCommands(tableRPC);
#ifdef ENABLE_WALLET
- bool fDisableWallet = GetBoolArg("-disablewallet", false);
+ RegisterWalletRPCCommands(tableRPC);
#endif
nConnectTimeout = GetArg("-timeout", DEFAULT_CONNECT_TIMEOUT);
@@ -928,71 +951,80 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
if (mapArgs.count("-minrelaytxfee"))
{
CAmount n = 0;
- if (ParseMoney(mapArgs["-minrelaytxfee"], n) && n > 0)
- ::minRelayTxFee = CFeeRate(n);
- else
- return InitError(strprintf(_("Invalid amount for -minrelaytxfee=<amount>: '%s'"), mapArgs["-minrelaytxfee"]));
+ if (!ParseMoney(mapArgs["-minrelaytxfee"], n) || 0 == n)
+ return InitError(AmountErrMsg("minrelaytxfee", mapArgs["-minrelaytxfee"]));
+ // High fee check is done afterward in CWallet::ParameterInteraction()
+ ::minRelayTxFee = CFeeRate(n);
}
fRequireStandard = !GetBoolArg("-acceptnonstdtxn", !Params().RequireStandard());
if (Params().RequireStandard() && !fRequireStandard)
return InitError(strprintf("acceptnonstdtxn is not currently supported for %s chain", chainparams.NetworkIDString()));
+ nBytesPerSigOp = GetArg("-bytespersigop", nBytesPerSigOp);
#ifdef ENABLE_WALLET
- if (mapArgs.count("-mintxfee"))
- {
- CAmount n = 0;
- if (ParseMoney(mapArgs["-mintxfee"], n) && n > 0)
- CWallet::minTxFee = CFeeRate(n);
- else
- return InitError(strprintf(_("Invalid amount for -mintxfee=<amount>: '%s'"), mapArgs["-mintxfee"]));
- }
- if (mapArgs.count("-paytxfee"))
- {
- CAmount nFeePerK = 0;
- if (!ParseMoney(mapArgs["-paytxfee"], nFeePerK))
- return InitError(strprintf(_("Invalid amount for -paytxfee=<amount>: '%s'"), mapArgs["-paytxfee"]));
- if (nFeePerK > nHighTransactionFeeWarning)
- InitWarning(_("-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction."));
- payTxFee = CFeeRate(nFeePerK, 1000);
- if (payTxFee < ::minRelayTxFee)
- {
- return InitError(strprintf(_("Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)"),
- mapArgs["-paytxfee"], ::minRelayTxFee.ToString()));
- }
- }
- if (mapArgs.count("-maxtxfee"))
- {
- CAmount nMaxFee = 0;
- if (!ParseMoney(mapArgs["-maxtxfee"], nMaxFee))
- return InitError(strprintf(_("Invalid amount for -maxtxfee=<amount>: '%s'"), mapArgs["-maptxfee"]));
- if (nMaxFee > nHighTransactionMaxFeeWarning)
- InitWarning(_("-maxtxfee is set very high! Fees this large could be paid on a single transaction."));
- maxTxFee = nMaxFee;
- if (CFeeRate(maxTxFee, 1000) < ::minRelayTxFee)
- {
- return InitError(strprintf(_("Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)"),
- mapArgs["-maxtxfee"], ::minRelayTxFee.ToString()));
- }
- }
- nTxConfirmTarget = GetArg("-txconfirmtarget", DEFAULT_TX_CONFIRM_TARGET);
- bSpendZeroConfChange = GetBoolArg("-spendzeroconfchange", DEFAULT_SPEND_ZEROCONF_CHANGE);
- fSendFreeTransactions = GetBoolArg("-sendfreetransactions", DEFAULT_SEND_FREE_TRANSACTIONS);
-
- std::string strWalletFile = GetArg("-wallet", "wallet.dat");
-#endif // ENABLE_WALLET
+ if (!CWallet::ParameterInteraction())
+ return false;
+#endif
fIsBareMultisigStd = GetBoolArg("-permitbaremultisig", DEFAULT_PERMIT_BAREMULTISIG);
fAcceptDatacarrier = GetBoolArg("-datacarrier", DEFAULT_ACCEPT_DATACARRIER);
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
- if (GetBoolArg("-peerbloomfilters", true))
- nLocalServices |= NODE_BLOOM;
+ ServiceFlags nLocalServices = NODE_NETWORK;
+ ServiceFlags nRelevantServices = NODE_NETWORK;
+
+ if (GetBoolArg("-peerbloomfilters", DEFAULT_PEERBLOOMFILTERS))
+ nLocalServices = ServiceFlags(nLocalServices | NODE_BLOOM);
+
+ nMaxTipAge = GetArg("-maxtipage", DEFAULT_MAX_TIP_AGE);
+
+ fEnableReplacement = GetBoolArg("-mempoolreplacement", DEFAULT_ENABLE_REPLACEMENT);
+ if ((!fEnableReplacement) && mapArgs.count("-mempoolreplacement")) {
+ // Minimal effort at forwards compatibility
+ std::string strReplacementModeList = GetArg("-mempoolreplacement", ""); // default is impossible
+ std::vector<std::string> vstrReplacementModes;
+ boost::split(vstrReplacementModes, strReplacementModeList, boost::is_any_of(","));
+ fEnableReplacement = (std::find(vstrReplacementModes.begin(), vstrReplacementModes.end(), "fee") != vstrReplacementModes.end());
+ }
+
+ if (!mapMultiArgs["-bip9params"].empty()) {
+ // Allow overriding BIP9 parameters for testing
+ if (!Params().MineBlocksOnDemand()) {
+ return InitError("BIP9 parameters may only be overridden on regtest.");
+ }
+ const vector<string>& deployments = mapMultiArgs["-bip9params"];
+ for (auto i : deployments) {
+ std::vector<std::string> vDeploymentParams;
+ boost::split(vDeploymentParams, i, boost::is_any_of(":"));
+ if (vDeploymentParams.size() != 3) {
+ return InitError("BIP9 parameters malformed, expecting deployment:start:end");
+ }
+ int64_t nStartTime, nTimeout;
+ if (!ParseInt64(vDeploymentParams[1], &nStartTime)) {
+ return InitError(strprintf("Invalid nStartTime (%s)", vDeploymentParams[1]));
+ }
+ if (!ParseInt64(vDeploymentParams[2], &nTimeout)) {
+ return InitError(strprintf("Invalid nTimeout (%s)", vDeploymentParams[2]));
+ }
+ bool found = false;
+ for (int j=0; j<(int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++j)
+ {
+ if (vDeploymentParams[0].compare(VersionBitsDeploymentInfo[j].name) == 0) {
+ UpdateRegtestBIP9Parameters(Consensus::DeploymentPos(j), nStartTime, nTimeout);
+ found = true;
+ LogPrintf("Setting BIP9 activation parameters for %s to start=%ld, timeout=%ld\n", vDeploymentParams[0], nStartTime, nTimeout);
+ break;
+ }
+ }
+ if (!found) {
+ return InitError(strprintf("Invalid deployment (%s)", vDeploymentParams[0]));
+ }
+ }
+ }
// ********************************************************* Step 4: application initialization: dir lock, daemonize, pidfile, debug log
@@ -1002,14 +1034,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// Sanity check
if (!InitSanityCheck())
- return InitError(_("Initialization sanity check failed. Bitcoin Core is shutting down."));
+ return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), _(PACKAGE_NAME)));
std::string strDataDir = GetDataDir().string();
-#ifdef ENABLE_WALLET
- // Wallet file must be a plain filename without a directory
- if (strWalletFile != boost::filesystem::basename(strWalletFile) + boost::filesystem::extension(strWalletFile))
- return InitError(strprintf(_("Wallet %s resides outside data directory %s"), strWalletFile, strDataDir));
-#endif
+
// Make sure only a single Bitcoin process is using the data directory.
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist.
@@ -1018,9 +1046,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
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));
+ return InitError(strprintf(_("Cannot obtain a lock on data directory %s. %s is probably already running."), strDataDir, _(PACKAGE_NAME)));
} 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()));
+ return InitError(strprintf(_("Cannot obtain a lock on data directory %s. %s is probably already running.") + " %s.", strDataDir, _(PACKAGE_NAME), e.what()));
}
#ifndef WIN32
@@ -1032,22 +1060,12 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
if (fPrintToDebugLog)
OpenDebugLog();
-#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
- LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION));
-#else
- LogPrintf("Using OpenSSL version %s\n", OpenSSL_version(OPENSSL_VERSION));
-#endif
-
-#ifdef ENABLE_WALLET
- LogPrintf("Using BerkeleyDB version %s\n", DbEnv::version(0, 0, 0));
-#endif
if (!fLogTimestamps)
LogPrintf("Startup time: %s\n", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", GetTime()));
LogPrintf("Default data directory %s\n", GetDefaultDataDir().string());
LogPrintf("Using data directory %s\n", strDataDir);
- LogPrintf("Using config file %s\n", GetConfigFile().string());
+ LogPrintf("Using config file %s\n", GetConfigFile(GetArg("-conf", BITCOIN_CONF_FILENAME)).string());
LogPrintf("Using at most %i connections (%i file descriptors available)\n", nMaxConnections, nFD);
- std::ostringstream strErrors;
LogPrintf("Using %u threads for script verification\n", nScriptCheckThreads);
if (nScriptCheckThreads) {
@@ -1075,25 +1093,15 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// ********************************************************* Step 5: verify wallet database integrity
#ifdef ENABLE_WALLET
- if (!fDisableWallet) {
- LogPrintf("Using wallet %s\n", strWalletFile);
- uiInterface.InitMessage(_("Verifying wallet..."));
-
- std::string warningString;
- std::string errorString;
-
- if (!CWallet::Verify(strWalletFile, warningString, errorString))
- return false;
-
- if (!warningString.empty())
- InitWarning(warningString);
- if (!errorString.empty())
- return InitError(errorString);
-
- } // (!fDisableWallet)
-#endif // ENABLE_WALLET
+ if (!CWallet::Verify())
+ return false;
+#endif
// ********************************************************* Step 6: network initialization
+ assert(!g_connman);
+ g_connman = std::unique_ptr<CConnman>(new CConnman(GetRand(std::numeric_limits<uint64_t>::max()), GetRand(std::numeric_limits<uint64_t>::max())));
+ CConnman& connman = *g_connman;
+
RegisterNodeSignals(GetNodeSignals());
// sanitize comments per BIP-0014, format user agent and check total size
@@ -1127,10 +1135,11 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
if (mapArgs.count("-whitelist")) {
BOOST_FOREACH(const std::string& net, mapMultiArgs["-whitelist"]) {
- CSubNet subnet(net);
+ CSubNet subnet;
+ LookupSubNet(net.c_str(), subnet);
if (!subnet.IsValid())
return InitError(strprintf(_("Invalid netmask specified in -whitelist: '%s'"), net));
- CNode::AddWhitelistedRange(subnet);
+ connman.AddWhitelistedRange(subnet);
}
}
@@ -1138,8 +1147,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// -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", "");
+ SetLimited(NET_TOR);
if (proxyArg != "" && proxyArg != "0") {
- proxyType addrProxy = proxyType(CService(proxyArg, 9050), proxyRandomize);
+ CService resolved(LookupNumeric(proxyArg.c_str(), 9050));
+ proxyType addrProxy = proxyType(resolved, proxyRandomize);
if (!addrProxy.IsValid())
return InitError(strprintf(_("Invalid -proxy address: '%s'"), proxyArg));
@@ -1147,7 +1158,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
SetProxy(NET_IPV6, addrProxy);
SetProxy(NET_TOR, addrProxy);
SetNameProxy(addrProxy);
- SetReachable(NET_TOR); // by default, -proxy sets onion as reachable, unless -noonion later
+ SetLimited(NET_TOR, false); // by default, -proxy sets onion as reachable, unless -noonion later
}
// -onion can be used to set only a proxy for .onion, or override normal proxy for .onion addresses
@@ -1156,13 +1167,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
std::string onionArg = GetArg("-onion", "");
if (onionArg != "") {
if (onionArg == "0") { // Handle -noonion/-onion=0
- SetReachable(NET_TOR, false); // set onions as unreachable
+ SetLimited(NET_TOR); // set onions as unreachable
} else {
- proxyType addrOnion = proxyType(CService(onionArg, 9050), proxyRandomize);
+ CService resolved(LookupNumeric(onionArg.c_str(), 9050));
+ proxyType addrOnion = proxyType(resolved, proxyRandomize);
if (!addrOnion.IsValid())
return InitError(strprintf(_("Invalid -onion address: '%s'"), onionArg));
SetProxy(NET_TOR, addrOnion);
- SetReachable(NET_TOR);
+ SetLimited(NET_TOR, false);
}
}
@@ -1170,30 +1182,31 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
fListen = GetBoolArg("-listen", DEFAULT_LISTEN);
fDiscover = GetBoolArg("-discover", true);
fNameLookup = GetBoolArg("-dns", DEFAULT_NAME_LOOKUP);
+ fRelayTxes = !GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY);
- bool fBound = false;
if (fListen) {
+ bool fBound = false;
if (mapArgs.count("-bind") || mapArgs.count("-whitebind")) {
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));
+ return InitError(ResolveErrMsg("bind", strBind));
+ fBound |= Bind(connman, addrBind, (BF_EXPLICIT | BF_REPORT_ERROR));
}
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));
+ return InitError(ResolveErrMsg("whitebind", strBind));
if (addrBind.GetPort() == 0)
return InitError(strprintf(_("Need to specify a port with -whitebind: '%s'"), strBind));
- fBound |= Bind(addrBind, (BF_EXPLICIT | BF_REPORT_ERROR | BF_WHITELIST));
+ fBound |= Bind(connman, addrBind, (BF_EXPLICIT | BF_REPORT_ERROR | BF_WHITELIST));
}
}
else {
struct in_addr inaddr_any;
inaddr_any.s_addr = INADDR_ANY;
- fBound |= Bind(CService(in6addr_any, GetListenPort()), BF_NONE);
- fBound |= Bind(CService(inaddr_any, GetListenPort()), !fBound ? BF_REPORT_ERROR : BF_NONE);
+ fBound |= Bind(connman, CService(in6addr_any, GetListenPort()), BF_NONE);
+ fBound |= Bind(connman, CService(inaddr_any, GetListenPort()), !fBound ? BF_REPORT_ERROR : BF_NONE);
}
if (!fBound)
return InitError(_("Failed to listen on any port. Use -listen=0 if you want this."));
@@ -1201,15 +1214,16 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
if (mapArgs.count("-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));
- AddLocal(CService(strAddr, GetListenPort(), fNameLookup), LOCAL_MANUAL);
+ CService addrLocal;
+ if (Lookup(strAddr.c_str(), addrLocal, GetListenPort(), fNameLookup) && addrLocal.IsValid())
+ AddLocal(addrLocal, LOCAL_MANUAL);
+ else
+ return InitError(ResolveErrMsg("externalip", strAddr));
}
}
BOOST_FOREACH(const std::string& strDest, mapMultiArgs["-seednode"])
- AddOneShot(strDest);
+ connman.AddOneShot(strDest);
#if ENABLE_ZMQ
pzmqNotificationInterface = CZMQNotificationInterface::CreateWithArguments(mapArgs);
@@ -1218,13 +1232,17 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
RegisterValidationInterface(pzmqNotificationInterface);
}
#endif
+ uint64_t nMaxOutboundLimit = 0; //unlimited unless -maxuploadtarget is set
+ uint64_t nMaxOutboundTimeframe = MAX_UPLOAD_TIMEFRAME;
+
if (mapArgs.count("-maxuploadtarget")) {
- CNode::SetMaxOutboundTarget(GetArg("-maxuploadtarget", DEFAULT_MAX_UPLOAD_TARGET)*1024*1024);
+ nMaxOutboundLimit = GetArg("-maxuploadtarget", DEFAULT_MAX_UPLOAD_TARGET)*1024*1024;
}
// ********************************************************* Step 7: load block chain
fReindex = GetBoolArg("-reindex", false);
+ bool fReindexChainState = GetBoolArg("-reindex-chainstate", false);
// Upgrading to 0.8; hard-link the old blknnnn.dat files into /blocks/
boost::filesystem::path blocksDir = GetDataDir() / "blocks";
@@ -1256,12 +1274,12 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// cache size calculations
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
+ nTotalCache = std::min(nTotalCache, nMaxDbCache << 20); // total cache cannot be greater than nMaxDbcache
int64_t nBlockTreeDBCache = nTotalCache / 8;
- if (nBlockTreeDBCache > (1 << 21) && !GetBoolArg("-txindex", DEFAULT_TXINDEX))
- nBlockTreeDBCache = (1 << 21); // block tree db cache shouldn't be larger than 2 MiB
+ nBlockTreeDBCache = std::min(nBlockTreeDBCache, (GetBoolArg("-txindex", DEFAULT_TXINDEX) ? nMaxBlockDBAndTxIndexCache : nMaxBlockDBCache) << 20);
nTotalCache -= nBlockTreeDBCache;
int64_t nCoinDBCache = std::min(nTotalCache / 2, (nTotalCache / 4) + (1 << 23)); // use 25%-50% of the remainder for disk cache
+ nCoinDBCache = std::min(nCoinDBCache, nMaxCoinsDBCache << 20); // cap total coins db cache
nTotalCache -= nCoinDBCache;
nCoinCacheUsage = nTotalCache; // the rest goes to in-memory cache
LogPrintf("Cache configuration:\n");
@@ -1286,7 +1304,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
delete pblocktree;
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex);
- pcoinsdbview = new CCoinsViewDB(nCoinDBCache, false, fReindex);
+ pcoinsdbview = new CCoinsViewDB(nCoinDBCache, false, fReindex || fReindexChainState);
pcoinscatcher = new CCoinsViewErrorCatcher(pcoinsdbview);
pcoinsTip = new CCoinsViewCache(pcoinscatcher);
@@ -1315,7 +1333,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// Check for changed -txindex state
if (fTxIndex != GetBoolArg("-txindex", DEFAULT_TXINDEX)) {
- strLoadError = _("You need to rebuild the database using -reindex to change -txindex");
+ strLoadError = _("You need to rebuild the database using -reindex-chainstate to change -txindex");
break;
}
@@ -1326,15 +1344,24 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
break;
}
+ if (!fReindex && chainActive.Tip() != NULL) {
+ uiInterface.InitMessage(_("Rewinding blocks..."));
+ if (!RewindBlockIndex(chainparams)) {
+ strLoadError = _("Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain");
+ break;
+ }
+ }
+
uiInterface.InitMessage(_("Verifying blocks..."));
if (fHavePruned && GetArg("-checkblocks", DEFAULT_CHECKBLOCKS) > 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", DEFAULT_CHECKBLOCKS));
+ LogPrintf("Prune: pruned datadir may not have more than %d blocks; only checking available blocks",
+ MIN_BLOCKS_TO_KEEP);
}
{
LOCK(cs_main);
CBlockIndex* tip = chainActive.Tip();
+ RPCNotifyBlockChange(true, tip);
if (tip && tip->nTime > GetAdjustedTime() + 2 * 60 * 60) {
strLoadError = _("The block database contains a block which appears to be from the future. "
"This may be due to your computer's date and time being set incorrectly. "
@@ -1360,8 +1387,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
if (!fLoaded) {
// first suggest a reindex
if (!fReset) {
- bool fRet = uiInterface.ThreadSafeMessageBox(
+ bool fRet = uiInterface.ThreadSafeQuestion(
strLoadError + ".\n\n" + _("Do you want to rebuild the block database now?"),
+ strLoadError + ".\nPlease restart with -reindex or -reindex-chainstate to recover.",
"", CClientUIInterface::MSG_ERROR | CClientUIInterface::BTN_ABORT);
if (fRet) {
fReindex = true;
@@ -1395,156 +1423,11 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// ********************************************************* Step 8: load wallet
#ifdef ENABLE_WALLET
- if (fDisableWallet) {
- pwalletMain = NULL;
- LogPrintf("Wallet disabled!\n");
- } else {
-
- // needed to restore wallet transaction meta data after -zapwallettxes
- std::vector<CWalletTx> vWtx;
-
- if (GetBoolArg("-zapwallettxes", false)) {
- uiInterface.InitMessage(_("Zapping all transactions from wallet..."));
-
- pwalletMain = new CWallet(strWalletFile);
- DBErrors nZapWalletRet = pwalletMain->ZapWalletTx(vWtx);
- if (nZapWalletRet != DB_LOAD_OK) {
- uiInterface.InitMessage(_("Error loading wallet.dat: Wallet corrupted"));
- return false;
- }
-
- delete pwalletMain;
- pwalletMain = NULL;
- }
-
- uiInterface.InitMessage(_("Loading wallet..."));
-
- nStart = GetTimeMillis();
- bool fFirstRun = true;
- pwalletMain = new CWallet(strWalletFile);
- DBErrors nLoadWalletRet = pwalletMain->LoadWallet(fFirstRun);
- if (nLoadWalletRet != DB_LOAD_OK)
- {
- if (nLoadWalletRet == DB_CORRUPT)
- strErrors << _("Error loading wallet.dat: Wallet corrupted") << "\n";
- else if (nLoadWalletRet == DB_NONCRITICAL_ERROR)
- {
- InitWarning(_("Error reading wallet.dat! All keys read correctly, but transaction data"
- " or address book entries might be missing or incorrect."));
- }
- else if (nLoadWalletRet == DB_TOO_NEW)
- strErrors << _("Error loading wallet.dat: Wallet requires newer version of Bitcoin Core") << "\n";
- else if (nLoadWalletRet == DB_NEED_REWRITE)
- {
- strErrors << _("Wallet needed to be rewritten: restart Bitcoin Core to complete") << "\n";
- LogPrintf("%s", strErrors.str());
- return InitError(strErrors.str());
- }
- else
- strErrors << _("Error loading wallet.dat") << "\n";
- }
-
- if (GetBoolArg("-upgradewallet", fFirstRun))
- {
- int nMaxVersion = GetArg("-upgradewallet", 0);
- if (nMaxVersion == 0) // the -upgradewallet without argument case
- {
- LogPrintf("Performing wallet upgrade to %i\n", FEATURE_LATEST);
- nMaxVersion = CLIENT_VERSION;
- pwalletMain->SetMinVersion(FEATURE_LATEST); // permanently upgrade the wallet immediately
- }
- else
- LogPrintf("Allowing wallet upgrade up to %i\n", nMaxVersion);
- if (nMaxVersion < pwalletMain->GetVersion())
- strErrors << _("Cannot downgrade wallet") << "\n";
- pwalletMain->SetMaxVersion(nMaxVersion);
- }
-
- if (fFirstRun)
- {
- // Create new keyUser and set as default key
- RandAddSeedPerfmon();
-
- CPubKey newDefaultKey;
- if (pwalletMain->GetKeyFromPool(newDefaultKey)) {
- pwalletMain->SetDefaultKey(newDefaultKey);
- if (!pwalletMain->SetAddressBook(pwalletMain->vchDefaultKey.GetID(), "", "receive"))
- strErrors << _("Cannot write default address") << "\n";
- }
-
- pwalletMain->SetBestChain(chainActive.GetLocator());
- }
-
- LogPrintf("%s", strErrors.str());
- LogPrintf(" wallet %15dms\n", GetTimeMillis() - nStart);
-
- RegisterValidationInterface(pwalletMain);
-
- CBlockIndex *pindexRescan = chainActive.Tip();
- if (GetBoolArg("-rescan", false))
- pindexRescan = chainActive.Genesis();
- else
- {
- CWalletDB walletdb(strWalletFile);
- CBlockLocator locator;
- if (walletdb.ReadBestBlock(locator))
- pindexRescan = FindForkInGlobalIndex(chainActive, locator);
- else
- pindexRescan = chainActive.Genesis();
- }
- 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();
- pwalletMain->ScanForWalletTransactions(pindexRescan, true);
- LogPrintf(" rescan %15dms\n", GetTimeMillis() - nStart);
- pwalletMain->SetBestChain(chainActive.GetLocator());
- nWalletDBUpdated++;
-
- // Restore wallet transaction metadata after -zapwallettxes=1
- if (GetBoolArg("-zapwallettxes", false) && GetArg("-zapwallettxes", "1") != "2")
- {
- CWalletDB walletdb(strWalletFile);
-
- BOOST_FOREACH(const CWalletTx& wtxOld, vWtx)
- {
- uint256 hash = wtxOld.GetHash();
- std::map<uint256, CWalletTx>::iterator mi = pwalletMain->mapWallet.find(hash);
- if (mi != pwalletMain->mapWallet.end())
- {
- const CWalletTx* copyFrom = &wtxOld;
- CWalletTx* copyTo = &mi->second;
- copyTo->mapValue = copyFrom->mapValue;
- copyTo->vOrderForm = copyFrom->vOrderForm;
- copyTo->nTimeReceived = copyFrom->nTimeReceived;
- copyTo->nTimeSmart = copyFrom->nTimeSmart;
- copyTo->fFromMe = copyFrom->fFromMe;
- copyTo->strFromAccount = copyFrom->strFromAccount;
- copyTo->nOrderPos = copyFrom->nOrderPos;
- copyTo->WriteToDisk(&walletdb);
- }
- }
- }
- }
- pwalletMain->SetBroadcastTransactions(GetBoolArg("-walletbroadcast", DEFAULT_WALLETBROADCAST));
- } // (!fDisableWallet)
-#else // ENABLE_WALLET
+ if (!CWallet::InitLoadWallet())
+ return false;
+#else
LogPrintf("No wallet support compiled in!\n");
-#endif // !ENABLE_WALLET
+#endif
// ********************************************************* Step 9: data directory maintenance
@@ -1552,69 +1435,89 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// after any wallet rescanning has taken place.
if (fPruneMode) {
LogPrintf("Unsetting NODE_NETWORK on prune mode\n");
- nLocalServices &= ~NODE_NETWORK;
+ nLocalServices = ServiceFlags(nLocalServices & ~NODE_NETWORK);
if (!fReindex) {
uiInterface.InitMessage(_("Pruning blockstore..."));
PruneAndFlush();
}
}
+ if (Params().GetConsensus().vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout != 0) {
+ // Only advertize witness capabilities if they have a reasonable start time.
+ // This allows us to have the code merged without a defined softfork, by setting its
+ // end time to 0.
+ // Note that setting NODE_WITNESS is never required: the only downside from not
+ // doing so is that after activation, no upgraded nodes will fetch from you.
+ nLocalServices = ServiceFlags(nLocalServices | NODE_WITNESS);
+ // Only care about others providing witness capabilities if there is a softfork
+ // defined.
+ nRelevantServices = ServiceFlags(nRelevantServices | NODE_WITNESS);
+ }
+
// ********************************************************* Step 10: import blocks
+ if (!CheckDiskSpace())
+ return false;
+
+ // Either install a handler to notify us when genesis activates, or set fHaveGenesis directly.
+ // No locking, as this happens before any background thread is started.
+ if (chainActive.Tip() == NULL) {
+ uiInterface.NotifyBlockTip.connect(BlockNotifyGenesisWait);
+ } else {
+ fHaveGenesis = true;
+ }
+
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, chainparams))
- strErrors << "Failed to connect best block";
-
std::vector<boost::filesystem::path> vImportFiles;
if (mapArgs.count("-loadblock"))
{
BOOST_FOREACH(const std::string& strFile, mapMultiArgs["-loadblock"])
vImportFiles.push_back(strFile);
}
+
threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles));
- if (chainActive.Tip() == NULL) {
- LogPrintf("Waiting for genesis block to be imported...\n");
- while (!fRequestShutdown && chainActive.Tip() == NULL)
- MilliSleep(10);
+
+ // Wait for genesis block to be processed
+ {
+ boost::unique_lock<boost::mutex> lock(cs_GenesisWait);
+ while (!fHaveGenesis) {
+ condvar_GenesisWait.wait(lock);
+ }
+ uiInterface.NotifyBlockTip.disconnect(BlockNotifyGenesisWait);
}
// ********************************************************* Step 11: start node
- if (!CheckDiskSpace())
- return false;
-
- if (!strErrors.str().empty())
- return InitError(strErrors.str());
-
- RandAddSeedPerfmon();
-
//// debug print
LogPrintf("mapBlockIndex.size() = %u\n", mapBlockIndex.size());
LogPrintf("nBestHeight = %d\n", chainActive.Height());
-#ifdef ENABLE_WALLET
- LogPrintf("setKeyPool.size() = %u\n", pwalletMain ? pwalletMain->setKeyPool.size() : 0);
- LogPrintf("mapWallet.size() = %u\n", pwalletMain ? pwalletMain->mapWallet.size() : 0);
- LogPrintf("mapAddressBook.size() = %u\n", pwalletMain ? pwalletMain->mapAddressBook.size() : 0);
-#endif
-
if (GetBoolArg("-listenonion", DEFAULT_LISTEN_ONION))
StartTorControl(threadGroup, scheduler);
- StartNode(threadGroup, scheduler);
+ Discover(threadGroup);
+
+ // Map ports with UPnP
+ MapPort(GetBoolArg("-upnp", DEFAULT_UPNP));
- // 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);
+ std::string strNodeError;
+ CConnman::Options connOptions;
+ connOptions.nLocalServices = nLocalServices;
+ connOptions.nRelevantServices = nRelevantServices;
+ connOptions.nMaxConnections = nMaxConnections;
+ connOptions.nMaxOutbound = std::min(MAX_OUTBOUND_CONNECTIONS, connOptions.nMaxConnections);
+ connOptions.nMaxFeeler = 1;
+ connOptions.nBestHeight = chainActive.Height();
+ connOptions.uiInterface = &uiInterface;
+ connOptions.nSendBufferMaxSize = 1000*GetArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER);
+ connOptions.nReceiveFloodSize = 1000*GetArg("-maxreceivebuffer", DEFAULT_MAXRECEIVEBUFFER);
- // Generate coins in the background
- GenerateBitcoins(GetBoolArg("-gen", DEFAULT_GENERATE), GetArg("-genproclimit", DEFAULT_GENERATE_THREADS), chainparams);
+ connOptions.nMaxOutboundTimeframe = nMaxOutboundTimeframe;
+ connOptions.nMaxOutboundLimit = nMaxOutboundLimit;
+
+ if(!connman.Start(threadGroup, scheduler, strNodeError, connOptions))
+ return InitError(strNodeError);
// ********************************************************* Step 12: finished
@@ -1623,9 +1526,6 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
#ifdef ENABLE_WALLET
if (pwalletMain) {
- // Add wallet transactions that aren't already in a block to mapTransactions
- pwalletMain->ReacceptWalletTransactions();
-
// Run a thread to flush wallet periodically
threadGroup.create_thread(boost::bind(&ThreadFlushWalletDB, boost::ref(pwalletMain->strWalletFile)));
}
diff --git a/src/init.h b/src/init.h
index d4872e7794..63e07ccb3c 100644
--- a/src/init.h
+++ b/src/init.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -16,8 +16,6 @@ namespace boost
class thread_group;
} // namespace boost
-extern CWallet* pwalletMain;
-
void StartShutdown();
bool ShutdownRequested();
/** Interrupt threads */
diff --git a/src/key.cpp b/src/key.cpp
index a24fa8a4ba..aae9b042ac 100644
--- a/src/key.cpp
+++ b/src/key.cpp
@@ -1,4 +1,4 @@
-// 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.
@@ -124,9 +124,8 @@ bool CKey::Check(const unsigned char *vch) {
}
void CKey::MakeNewKey(bool fCompressedIn) {
- RandAddSeedPerfmon();
do {
- GetRandBytes(vch, sizeof(vch));
+ GetStrongRandBytes(vch, sizeof(vch));
} while (!Check(vch));
fValid = true;
fCompressed = fCompressedIn;
@@ -244,12 +243,12 @@ bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const
return ret;
}
-bool CExtKey::Derive(CExtKey &out, unsigned int nChild) const {
+bool CExtKey::Derive(CExtKey &out, unsigned int _nChild) const {
out.nDepth = nDepth + 1;
CKeyID id = key.GetPubKey().GetID();
memcpy(&out.vchFingerprint[0], &id, 4);
- out.nChild = nChild;
- return key.Derive(out.key, out.chaincode, nChild, chaincode);
+ out.nChild = _nChild;
+ return key.Derive(out.key, out.chaincode, _nChild, chaincode);
}
void CExtKey::SetMaster(const unsigned char *seed, unsigned int nSeedLen) {
@@ -275,7 +274,7 @@ CExtPubKey CExtKey::Neuter() const {
return ret;
}
-void CExtKey::Encode(unsigned char code[74]) const {
+void CExtKey::Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const {
code[0] = nDepth;
memcpy(code+1, vchFingerprint, 4);
code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF;
@@ -286,12 +285,12 @@ void CExtKey::Encode(unsigned char code[74]) const {
memcpy(code+42, key.begin(), 32);
}
-void CExtKey::Decode(const unsigned char code[74]) {
+void CExtKey::Decode(const unsigned char code[BIP32_EXTKEY_SIZE]) {
nDepth = code[0];
memcpy(vchFingerprint, code+1, 4);
nChild = (code[5] << 24) | (code[6] << 16) | (code[7] << 8) | code[8];
memcpy(chaincode.begin(), code+9, 32);
- key.Set(code+42, code+74, true);
+ key.Set(code+42, code+BIP32_EXTKEY_SIZE, true);
}
bool ECC_InitSanityCheck() {
diff --git a/src/key.h b/src/key.h
index 021eac2a8d..b589710bad 100644
--- a/src/key.h
+++ b/src/key.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -15,7 +15,7 @@
#include <vector>
-/**
+/**
* secp256k1:
* const unsigned int PRIVATE_KEY_SIZE = 279;
* const unsigned int PUBLIC_KEY_SIZE = 65;
@@ -45,6 +45,8 @@ private:
//! The actual byte data
unsigned char vch[32];
+ static_assert(sizeof(vch) == 32, "vch must be 32 bytes in length to not break serialization");
+
//! Check whether the 32-byte array pointed to be vch is valid keydata.
bool static Check(const unsigned char* vch);
@@ -70,20 +72,19 @@ public:
friend bool operator==(const CKey& a, const CKey& b)
{
- return a.fCompressed == b.fCompressed && a.size() == b.size() &&
- memcmp(&a.vch[0], &b.vch[0], a.size()) == 0;
+ return a.fCompressed == b.fCompressed &&
+ a.size() == b.size() &&
+ memcmp(&a.vch[0], &b.vch[0], a.size()) == 0;
}
//! Initialize using begin and end iterators to byte data.
template <typename T>
void Set(const T pbegin, const T pend, bool fCompressedIn)
{
- if (pend - pbegin != 32) {
+ if (pend - pbegin != sizeof(vch)) {
fValid = false;
- return;
- }
- if (Check(&pbegin[0])) {
- memcpy(vch, (unsigned char*)&pbegin[0], 32);
+ } else if (Check(&pbegin[0])) {
+ memcpy(vch, (unsigned char*)&pbegin[0], sizeof(vch));
fValid = true;
fCompressed = fCompressedIn;
} else {
@@ -92,7 +93,7 @@ public:
}
//! Simple read-only vector-like interface.
- unsigned int size() const { return (fValid ? 32 : 0); }
+ unsigned int size() const { return (fValid ? sizeof(vch) : 0); }
const unsigned char* begin() const { return vch; }
const unsigned char* end() const { return vch + size(); }
@@ -110,7 +111,7 @@ public:
/**
* Convert the private key to a CPrivKey (serialized OpenSSL private key data).
- * This is expensive.
+ * This is expensive.
*/
CPrivKey GetPrivKey() const;
@@ -146,9 +147,6 @@ public:
//! Load private key and check that public key matches.
bool Load(CPrivKey& privkey, CPubKey& vchPubKey, bool fSkipCheck);
-
- //! Check whether an element of a signature (r or s) is valid.
- static bool CheckSignatureElement(const unsigned char* vch, int len, bool half);
};
struct CExtKey {
@@ -160,15 +158,35 @@ struct CExtKey {
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 &&
- a.chaincode == b.chaincode && a.key == b.key;
+ return a.nDepth == b.nDepth &&
+ memcmp(&a.vchFingerprint[0], &b.vchFingerprint[0], sizeof(vchFingerprint)) == 0 &&
+ a.nChild == b.nChild &&
+ a.chaincode == b.chaincode &&
+ a.key == b.key;
}
- void Encode(unsigned char code[74]) const;
- void Decode(const unsigned char code[74]);
+ void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const;
+ void Decode(const unsigned char code[BIP32_EXTKEY_SIZE]);
bool Derive(CExtKey& out, unsigned int nChild) const;
CExtPubKey Neuter() const;
void SetMaster(const unsigned char* seed, unsigned int nSeedLen);
+ template <typename Stream>
+ void Serialize(Stream& s, int nType, int nVersion) const
+ {
+ unsigned int len = BIP32_EXTKEY_SIZE;
+ ::WriteCompactSize(s, len);
+ unsigned char code[BIP32_EXTKEY_SIZE];
+ Encode(code);
+ s.write((const char *)&code[0], len);
+ }
+ template <typename Stream>
+ void Unserialize(Stream& s, int nType, int nVersion)
+ {
+ unsigned int len = ::ReadCompactSize(s);
+ unsigned char code[BIP32_EXTKEY_SIZE];
+ s.read((char *)&code[0], len);
+ Decode(code);
+ }
};
/** Initialize the elliptic curve support. May not be called twice without calling ECC_Stop first. */
diff --git a/src/keystore.cpp b/src/keystore.cpp
index cf49ba83ad..d568a74350 100644
--- a/src/keystore.cpp
+++ b/src/keystore.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -19,6 +19,7 @@ bool CBasicKeyStore::GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) con
{
CKey key;
if (!GetKey(address, key)) {
+ LOCK(cs_KeyStore);
WatchKeyMap::const_iterator it = mapWatchKeys.find(address);
if (it != mapWatchKeys.end()) {
vchPubKeyOut = it->second;
diff --git a/src/keystore.h b/src/keystore.h
index b917bf20b4..d9290722e1 100644
--- a/src/keystore.h
+++ b/src/keystore.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
diff --git a/src/limitedmap.h b/src/limitedmap.h
index 5456dfc7c4..7841d7f4a4 100644
--- a/src/limitedmap.h
+++ b/src/limitedmap.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
@@ -66,8 +66,11 @@ public:
}
void update(const_iterator itIn, const mapped_type& v)
{
- // TODO: When we switch to C++11, use map.erase(itIn, itIn) to get the non-const iterator.
- iterator itTarget = map.find(itIn->first);
+ // Using map::erase() with empty range instead of map::find() to get a non-const iterator,
+ // since it is a constant time operation in C++11. For more details, see
+ // https://stackoverflow.com/questions/765148/how-to-remove-constness-of-const-iterator
+ iterator itTarget = map.erase(itIn, itIn);
+
if (itTarget == map.end())
return;
std::pair<rmap_iterator, rmap_iterator> itPair = rmap.equal_range(itTarget->second);
diff --git a/src/main.cpp b/src/main.cpp
index cb3f8f39f8..ad4c3fce68 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,13 +1,13 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Copyright (c) 2009-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "main.h"
#include "addrman.h"
-#include "alert.h"
#include "arith_uint256.h"
+#include "blockencodings.h"
#include "chainparams.h"
#include "checkpoints.h"
#include "checkqueue.h"
@@ -18,10 +18,12 @@
#include "init.h"
#include "merkleblock.h"
#include "net.h"
+#include "policy/fees.h"
#include "policy/policy.h"
#include "pow.h"
#include "primitives/block.h"
#include "primitives/transaction.h"
+#include "random.h"
#include "script/script.h"
#include "script/sigcache.h"
#include "script/standard.h"
@@ -34,10 +36,13 @@
#include "utilmoneystr.h"
#include "utilstrencodings.h"
#include "validationinterface.h"
+#include "versionbits.h"
+#include <atomic>
#include <sstream>
#include <boost/algorithm/string/replace.hpp>
+#include <boost/algorithm/string/join.hpp>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/math/distributions/poisson.hpp>
@@ -73,26 +78,34 @@ bool fCheckBlockIndex = false;
bool fCheckpointsEnabled = DEFAULT_CHECKPOINTS_ENABLED;
size_t nCoinCacheUsage = 5000 * 300;
uint64_t nPruneTarget = 0;
-bool fAlerts = DEFAULT_ALERTS;
+int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE;
+bool fEnableReplacement = DEFAULT_ENABLE_REPLACEMENT;
+
-/** Fees smaller than this (in satoshi) are considered zero fee (for relaying, mining and transaction creation) */
CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
+CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
CTxMemPool mempool(::minRelayTxFee);
+FeeFilterRounder filterRounder(::minRelayTxFee);
+
+struct IteratorComparator
+{
+ template<typename I>
+ bool operator()(const I& a, const I& b)
+ {
+ return &(*a) < &(*b);
+ }
+};
struct COrphanTx {
CTransaction tx;
NodeId fromPeer;
+ int64_t nTimeExpire;
};
-map<uint256, COrphanTx> mapOrphanTransactions GUARDED_BY(cs_main);;
-map<uint256, set<uint256> > mapOrphanTransactionsByPrev GUARDED_BY(cs_main);;
+map<uint256, COrphanTx> mapOrphanTransactions GUARDED_BY(cs_main);
+map<COutPoint, set<map<uint256, COrphanTx>::iterator, IteratorComparator>> mapOrphanTransactionsByPrev GUARDED_BY(cs_main);
void EraseOrphansFor(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
-/**
- * Returns true if there are nRequired or more blocks of minVersion or above
- * in the last Consensus::Params::nMajorityWindow blocks, starting at pstart and going backwards.
- */
-static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned nRequired, const Consensus::Params& consensusParams);
static void CheckBlockIndex(const Consensus::Params& consensusParams);
/** Constant stuff for coinbase transactions we create: */
@@ -100,6 +113,8 @@ CScript COINBASE_FLAGS;
const string strMessageMagic = "Bitcoin Signed Message:\n";
+static const uint64_t RANDOMIZER_ID_ADDRESS_RELAY = 0x3cac0035b5866b90ULL; // SHA256("main address relay")[0:8]
+
// Internal stuff
namespace {
@@ -181,23 +196,22 @@ namespace {
* million to make it highly unlikely for users to have issues with this
* filter.
*
- * Memory used: 1.7MB
+ * Memory used: 1.3 MB
*/
- boost::scoped_ptr<CRollingBloomFilter> recentRejects;
+ std::unique_ptr<CRollingBloomFilter> recentRejects;
uint256 hashRecentRejectsChainTip;
/** Blocks that are in flight, and that are in the queue to be downloaded. Protected by cs_main. */
struct QueuedBlock {
uint256 hash;
- CBlockIndex *pindex; //! Optional.
- int64_t nTime; //! Time of "getdata" request in microseconds.
- 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)
+ CBlockIndex* pindex; //!< Optional.
+ bool fValidatedHeaders; //!< Whether this block has validated headers at the time of request.
+ std::unique_ptr<PartiallyDownloadedBlock> partialBlock; //!< Optional, used for CMPCTBLOCK downloads
};
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> > mapBlocksInFlight;
- /** Number of blocks in flight with validated headers. */
- int nQueuedValidatedHeaders = 0;
+ /** Stack of nodes which we have set to announce using compact blocks */
+ list<NodeId> lNodesAnnouncingHeaderAndIDs;
/** Number of preferable block download peers. */
int nPreferredDownload = 0;
@@ -207,6 +221,15 @@ namespace {
/** Dirty block file entries. */
set<int> setDirtyFileInfo;
+
+ /** Number of peers from which we're downloading blocks. */
+ int nPeersWithValidatedDownloads = 0;
+
+ /** Relay map, protected by cs_main. */
+ typedef std::map<uint256, std::shared_ptr<const CTransaction>> MapRelay;
+ MapRelay mapRelay;
+ /** Expiration-time ordered list of (expire time, relay map entry) pairs, protected by cs_main). */
+ std::deque<std::pair<int64_t, MapRelay::iterator>> vRelayExpiration;
} // anon namespace
//////////////////////////////////////////////////////////////////////////////
@@ -249,17 +272,38 @@ struct CNodeState {
CBlockIndex *pindexLastCommonBlock;
//! The best header we have sent our peer.
CBlockIndex *pindexBestHeaderSent;
+ //! Length of current-streak of unconnecting headers announcements
+ int nUnconnectingHeaders;
//! Whether we've started headers synchronization with this peer.
bool fSyncStarted;
//! Since when we're stalling block download progress (in microseconds), or 0.
int64_t nStallingSince;
list<QueuedBlock> vBlocksInFlight;
+ //! When the first entry in vBlocksInFlight started downloading. Don't care when vBlocksInFlight is empty.
+ int64_t nDownloadingSince;
int nBlocksInFlight;
int nBlocksInFlightValidHeaders;
//! Whether we consider this a preferred download peer.
bool fPreferredDownload;
//! Whether this peer wants invs or headers (when possible) for block announcements.
bool fPreferHeaders;
+ //! Whether this peer wants invs or cmpctblocks (when possible) for block announcements.
+ bool fPreferHeaderAndIDs;
+ /**
+ * Whether this peer will send us cmpctblocks if we request them.
+ * This is not used to gate request logic, as we really only care about fSupportsDesiredCmpctVersion,
+ * but is used as a flag to "lock in" the version of compact blocks (fWantsCmpctWitness) we send.
+ */
+ bool fProvidesHeaderAndIDs;
+ //! Whether this peer can give us witnesses
+ bool fHaveWitness;
+ //! Whether this peer wants witnesses in cmpctblocks/blocktxns
+ bool fWantsCmpctWitness;
+ /**
+ * If we've announced NODE_WITNESS to this peer: whether the peer sends witnesses in cmpctblocks/blocktxns,
+ * otherwise: whether this peer sends non-witnesses in cmpctblocks/blocktxns.
+ */
+ bool fSupportsDesiredCmpctVersion;
CNodeState() {
fCurrentlyConnected = false;
@@ -269,12 +313,19 @@ struct CNodeState {
hashLastUnknownBlock.SetNull();
pindexLastCommonBlock = NULL;
pindexBestHeaderSent = NULL;
+ nUnconnectingHeaders = 0;
fSyncStarted = false;
nStallingSince = 0;
+ nDownloadingSince = 0;
nBlocksInFlight = 0;
nBlocksInFlightValidHeaders = 0;
fPreferredDownload = false;
fPreferHeaders = false;
+ fPreferHeaderAndIDs = false;
+ fProvidesHeaderAndIDs = false;
+ fHaveWitness = false;
+ fWantsCmpctWitness = false;
+ fSupportsDesiredCmpctVersion = false;
}
};
@@ -289,12 +340,6 @@ CNodeState *State(NodeId pnode) {
return &it->second;
}
-int GetHeight()
-{
- LOCK(cs_main);
- return chainActive.Height();
-}
-
void UpdatePreferredDownload(CNode* node, CNodeState* state)
{
nPreferredDownload -= state->fPreferredDownload;
@@ -305,12 +350,6 @@ 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;
@@ -318,7 +357,8 @@ void InitializeNode(NodeId nodeid, const CNode *pnode) {
state.address = pnode->addr;
}
-void FinalizeNode(NodeId nodeid) {
+void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {
+ fUpdateConnectionTime = false;
LOCK(cs_main);
CNodeState *state = State(nodeid);
@@ -326,25 +366,43 @@ void FinalizeNode(NodeId nodeid) {
nSyncStarted--;
if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {
- AddressCurrentlyConnected(state->address);
+ fUpdateConnectionTime = true;
}
- BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight)
+ BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight) {
mapBlocksInFlight.erase(entry.hash);
+ }
EraseOrphansFor(nodeid);
nPreferredDownload -= state->fPreferredDownload;
+ nPeersWithValidatedDownloads -= (state->nBlocksInFlightValidHeaders != 0);
+ assert(nPeersWithValidatedDownloads >= 0);
mapNodeState.erase(nodeid);
+
+ if (mapNodeState.empty()) {
+ // Do a consistency check after the last peer is removed.
+ assert(mapBlocksInFlight.empty());
+ assert(nPreferredDownload == 0);
+ assert(nPeersWithValidatedDownloads == 0);
+ }
}
// Requires cs_main.
// Returns a bool indicating whether we requested this block.
+// Also used if a block was /not/ received and timed out or started with another peer
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;
+ if (state->nBlocksInFlightValidHeaders == 0 && itInFlight->second.second->fValidatedHeaders) {
+ // Last validated block on the queue was received.
+ nPeersWithValidatedDownloads--;
+ }
+ if (state->vBlocksInFlight.begin() == itInFlight->second.second) {
+ // First block on the queue was received, update the start download time for the next one
+ state->nDownloadingSince = std::max(state->nDownloadingSince, GetTimeMicros());
+ }
state->vBlocksInFlight.erase(itInFlight->second.second);
state->nBlocksInFlight--;
state->nStallingSince = 0;
@@ -355,23 +413,40 @@ bool MarkBlockAsReceived(const uint256& hash) {
}
// Requires cs_main.
-void MarkBlockAsInFlight(NodeId nodeid, const uint256& hash, const Consensus::Params& consensusParams, CBlockIndex *pindex = NULL) {
+// returns false, still setting pit, if the block was already in flight from the same peer
+// pit will only be valid as long as the same cs_main lock is being held
+bool MarkBlockAsInFlight(NodeId nodeid, const uint256& hash, const Consensus::Params& consensusParams, CBlockIndex *pindex = NULL, list<QueuedBlock>::iterator **pit = NULL) {
CNodeState *state = State(nodeid);
assert(state != NULL);
+ // Short-circuit most stuff in case its from the same node
+ map<uint256, pair<NodeId, list<QueuedBlock>::iterator> >::iterator itInFlight = mapBlocksInFlight.find(hash);
+ if (itInFlight != mapBlocksInFlight.end() && itInFlight->second.first == nodeid) {
+ *pit = &itInFlight->second.second;
+ return false;
+ }
+
// Make sure it's not listed somewhere already.
MarkBlockAsReceived(hash);
- 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);
+ list<QueuedBlock>::iterator it = state->vBlocksInFlight.insert(state->vBlocksInFlight.end(),
+ {hash, pindex, pindex != NULL, std::unique_ptr<PartiallyDownloadedBlock>(pit ? new PartiallyDownloadedBlock(&mempool) : NULL)});
state->nBlocksInFlight++;
- state->nBlocksInFlightValidHeaders += newentry.fValidatedHeaders;
- mapBlocksInFlight[hash] = std::make_pair(nodeid, it);
+ state->nBlocksInFlightValidHeaders += it->fValidatedHeaders;
+ if (state->nBlocksInFlight == 1) {
+ // We're starting a block download (batch) from this peer.
+ state->nDownloadingSince = GetTimeMicros();
+ }
+ if (state->nBlocksInFlightValidHeaders == 1 && pindex != NULL) {
+ nPeersWithValidatedDownloads++;
+ }
+ itInFlight = mapBlocksInFlight.insert(std::make_pair(hash, std::make_pair(nodeid, it))).first;
+ if (pit)
+ *pit = &itInFlight->second.second;
+ return true;
}
-/** Check whether the last unknown block a peer advertized is not yet known. */
+/** Check whether the last unknown block a peer advertised is not yet known. */
void ProcessBlockAvailability(NodeId nodeid) {
CNodeState *state = State(nodeid);
assert(state != NULL);
@@ -404,6 +479,33 @@ void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) {
}
}
+void MaybeSetPeerAsAnnouncingHeaderAndIDs(const CNodeState* nodestate, CNode* pfrom, CConnman& connman) {
+ if (!nodestate->fSupportsDesiredCmpctVersion) {
+ // Never ask from peers who can't provide witnesses.
+ return;
+ }
+ if (nodestate->fProvidesHeaderAndIDs) {
+ BOOST_FOREACH(const NodeId nodeid, lNodesAnnouncingHeaderAndIDs)
+ if (nodeid == pfrom->GetId())
+ return;
+ bool fAnnounceUsingCMPCTBLOCK = false;
+ uint64_t nCMPCTBLOCKVersion = (pfrom->GetLocalServices() & NODE_WITNESS) ? 2 : 1;
+ if (lNodesAnnouncingHeaderAndIDs.size() >= 3) {
+ // As per BIP152, we only get 3 of our peers to announce
+ // blocks using compact encodings.
+ bool found = connman.ForNode(lNodesAnnouncingHeaderAndIDs.front(), [fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion](CNode* pnodeStop){
+ pnodeStop->PushMessage(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion);
+ return true;
+ });
+ if(found)
+ lNodesAnnouncingHeaderAndIDs.pop_front();
+ }
+ fAnnounceUsingCMPCTBLOCK = true;
+ pfrom->PushMessage(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion);
+ lNodesAnnouncingHeaderAndIDs.push_back(pfrom->GetId());
+ }
+}
+
// Requires cs_main
bool CanDirectFetch(const Consensus::Params &consensusParams)
{
@@ -441,7 +543,7 @@ CBlockIndex* LastCommonAncestor(CBlockIndex* pa, CBlockIndex* pb) {
/** Update pindexLastCommonBlock and add not-in-flight missing successors to vBlocks, until it has
* at most count entries. */
-void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<CBlockIndex*>& vBlocks, NodeId& nodeStaller) {
+void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<CBlockIndex*>& vBlocks, NodeId& nodeStaller, const Consensus::Params& consensusParams) {
if (count == 0)
return;
@@ -498,6 +600,10 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<CBl
// We consider the chain that this peer is on invalid.
return;
}
+ if (!State(nodeid)->fHaveWitness && IsWitnessEnabled(pindex->pprev, consensusParams)) {
+ // We wouldn't download this block or its descendants from this peer.
+ return;
+ }
if (pindex->nStatus & BLOCK_HAVE_DATA || chainActive.Contains(pindex)) {
if (pindex->nChainTx)
state->pindexLastCommonBlock = pindex;
@@ -542,7 +648,6 @@ bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) {
void RegisterNodeSignals(CNodeSignals& nodeSignals)
{
- nodeSignals.GetHeight.connect(&GetHeight);
nodeSignals.ProcessMessages.connect(&ProcessMessages);
nodeSignals.SendMessages.connect(&SendMessages);
nodeSignals.InitializeNode.connect(&InitializeNode);
@@ -551,7 +656,6 @@ void RegisterNodeSignals(CNodeSignals& nodeSignals)
void UnregisterNodeSignals(CNodeSignals& nodeSignals)
{
- nodeSignals.GetHeight.disconnect(&GetHeight);
nodeSignals.ProcessMessages.disconnect(&ProcessMessages);
nodeSignals.SendMessages.disconnect(&SendMessages);
nodeSignals.InitializeNode.disconnect(&InitializeNode);
@@ -568,6 +672,9 @@ CBlockIndex* FindForkInGlobalIndex(const CChain& chain, const CBlockLocator& loc
CBlockIndex* pindex = (*mi).second;
if (chain.Contains(pindex))
return pindex;
+ if (pindex->GetAncestor(chain.Height()) == chain.Tip()) {
+ return chain.Tip();
+ }
}
}
return chain.Genesis();
@@ -592,40 +699,42 @@ bool AddOrphanTx(const CTransaction& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(c
// large transaction with a missing parent then we assume
// it will rebroadcast it later, after the parent transaction(s)
// have been mined or received.
- // 10,000 orphans, each of which is at most 5,000 bytes big is
- // at most 500 megabytes of orphans:
- unsigned int sz = tx.GetSerializeSize(SER_NETWORK, CTransaction::CURRENT_VERSION);
- if (sz > 5000)
+ // 100 orphans, each of which is at most 99,999 bytes big is
+ // at most 10 megabytes of orphans and somewhat more byprev index (in the worst case):
+ unsigned int sz = GetTransactionWeight(tx);
+ if (sz >= MAX_STANDARD_TX_WEIGHT)
{
LogPrint("mempool", "ignoring large orphan tx (size: %u, hash: %s)\n", sz, hash.ToString());
return false;
}
- mapOrphanTransactions[hash].tx = tx;
- mapOrphanTransactions[hash].fromPeer = peer;
- BOOST_FOREACH(const CTxIn& txin, tx.vin)
- mapOrphanTransactionsByPrev[txin.prevout.hash].insert(hash);
+ auto ret = mapOrphanTransactions.emplace(hash, COrphanTx{tx, peer, GetTime() + ORPHAN_TX_EXPIRE_TIME});
+ assert(ret.second);
+ BOOST_FOREACH(const CTxIn& txin, tx.vin) {
+ mapOrphanTransactionsByPrev[txin.prevout].insert(ret.first);
+ }
- LogPrint("mempool", "stored orphan tx %s (mapsz %u prevsz %u)\n", hash.ToString(),
+ LogPrint("mempool", "stored orphan tx %s (mapsz %u outsz %u)\n", hash.ToString(),
mapOrphanTransactions.size(), mapOrphanTransactionsByPrev.size());
return true;
}
-void static EraseOrphanTx(uint256 hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
+int static EraseOrphanTx(uint256 hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
{
map<uint256, COrphanTx>::iterator it = mapOrphanTransactions.find(hash);
if (it == mapOrphanTransactions.end())
- return;
+ return 0;
BOOST_FOREACH(const CTxIn& txin, it->second.tx.vin)
{
- map<uint256, set<uint256> >::iterator itPrev = mapOrphanTransactionsByPrev.find(txin.prevout.hash);
+ auto itPrev = mapOrphanTransactionsByPrev.find(txin.prevout);
if (itPrev == mapOrphanTransactionsByPrev.end())
continue;
- itPrev->second.erase(hash);
+ itPrev->second.erase(it);
if (itPrev->second.empty())
mapOrphanTransactionsByPrev.erase(itPrev);
}
mapOrphanTransactions.erase(it);
+ return 1;
}
void EraseOrphansFor(NodeId peer)
@@ -637,8 +746,7 @@ void EraseOrphansFor(NodeId peer)
map<uint256, COrphanTx>::iterator maybeErase = iter++; // increment to avoid iterator becoming invalid
if (maybeErase->second.fromPeer == peer)
{
- EraseOrphanTx(maybeErase->second.tx.GetHash());
- ++nErased;
+ nErased += EraseOrphanTx(maybeErase->second.tx.GetHash());
}
}
if (nErased > 0) LogPrint("mempool", "Erased %d orphan tx from peer %d\n", nErased, peer);
@@ -648,6 +756,26 @@ void EraseOrphansFor(NodeId peer)
unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
{
unsigned int nEvicted = 0;
+ static int64_t nNextSweep;
+ int64_t nNow = GetTime();
+ if (nNextSweep <= nNow) {
+ // Sweep out expired orphan pool entries:
+ int nErased = 0;
+ int64_t nMinExpTime = nNow + ORPHAN_TX_EXPIRE_TIME - ORPHAN_TX_EXPIRE_INTERVAL;
+ map<uint256, COrphanTx>::iterator iter = mapOrphanTransactions.begin();
+ while (iter != mapOrphanTransactions.end())
+ {
+ map<uint256, COrphanTx>::iterator maybeErase = iter++;
+ if (maybeErase->second.nTimeExpire <= nNow) {
+ nErased += EraseOrphanTx(maybeErase->second.tx.GetHash());
+ } else {
+ nMinExpTime = std::min(maybeErase->second.nTimeExpire, nMinExpTime);
+ }
+ }
+ // Sweep again 5 minutes after the next entry that expires in order to batch the linear scan.
+ nNextSweep = nMinExpTime + ORPHAN_TX_EXPIRE_INTERVAL;
+ if (nErased > 0) LogPrint("mempool", "Erased %d orphan tx due to expiration\n", nErased);
+ }
while (mapOrphanTransactions.size() > nMaxOrphans)
{
// Evict a random orphan:
@@ -667,9 +795,10 @@ bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
return true;
if ((int64_t)tx.nLockTime < ((int64_t)tx.nLockTime < LOCKTIME_THRESHOLD ? (int64_t)nBlockHeight : nBlockTime))
return true;
- BOOST_FOREACH(const CTxIn& txin, tx.vin)
- if (!txin.IsFinal())
+ for (const auto& txin : tx.vin) {
+ if (!(txin.nSequence == CTxIn::SEQUENCE_FINAL))
return false;
+ }
return true;
}
@@ -705,14 +834,186 @@ bool CheckFinalTx(const CTransaction &tx, int flags)
return IsFinalTx(tx, nBlockHeight, nBlockTime);
}
+/**
+ * Calculates the block height and previous block's median time past at
+ * which the transaction will be considered final in the context of BIP 68.
+ * Also removes from the vector of input heights any entries which did not
+ * correspond to sequence locked inputs as they do not affect the calculation.
+ */
+static std::pair<int, int64_t> CalculateSequenceLocks(const CTransaction &tx, int flags, std::vector<int>* prevHeights, const CBlockIndex& block)
+{
+ assert(prevHeights->size() == tx.vin.size());
+
+ // Will be set to the equivalent height- and time-based nLockTime
+ // values that would be necessary to satisfy all relative lock-
+ // time constraints given our view of block chain history.
+ // The semantics of nLockTime are the last invalid height/time, so
+ // use -1 to have the effect of any height or time being valid.
+ int nMinHeight = -1;
+ int64_t nMinTime = -1;
+
+ // tx.nVersion is signed integer so requires cast to unsigned otherwise
+ // we would be doing a signed comparison and half the range of nVersion
+ // wouldn't support BIP 68.
+ bool fEnforceBIP68 = static_cast<uint32_t>(tx.nVersion) >= 2
+ && flags & LOCKTIME_VERIFY_SEQUENCE;
+
+ // Do not enforce sequence numbers as a relative lock time
+ // unless we have been instructed to
+ if (!fEnforceBIP68) {
+ return std::make_pair(nMinHeight, nMinTime);
+ }
+
+ for (size_t txinIndex = 0; txinIndex < tx.vin.size(); txinIndex++) {
+ const CTxIn& txin = tx.vin[txinIndex];
+
+ // Sequence numbers with the most significant bit set are not
+ // treated as relative lock-times, nor are they given any
+ // consensus-enforced meaning at this point.
+ if (txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG) {
+ // The height of this input is not relevant for sequence locks
+ (*prevHeights)[txinIndex] = 0;
+ continue;
+ }
+
+ int nCoinHeight = (*prevHeights)[txinIndex];
+
+ if (txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG) {
+ int64_t nCoinTime = block.GetAncestor(std::max(nCoinHeight-1, 0))->GetMedianTimePast();
+ // NOTE: Subtract 1 to maintain nLockTime semantics
+ // BIP 68 relative lock times have the semantics of calculating
+ // the first block or time at which the transaction would be
+ // valid. When calculating the effective block time or height
+ // for the entire transaction, we switch to using the
+ // semantics of nLockTime which is the last invalid block
+ // time or height. Thus we subtract 1 from the calculated
+ // time or height.
+
+ // Time-based relative lock-times are measured from the
+ // smallest allowed timestamp of the block containing the
+ // txout being spent, which is the median time past of the
+ // block prior.
+ nMinTime = std::max(nMinTime, nCoinTime + (int64_t)((txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_MASK) << CTxIn::SEQUENCE_LOCKTIME_GRANULARITY) - 1);
+ } else {
+ nMinHeight = std::max(nMinHeight, nCoinHeight + (int)(txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_MASK) - 1);
+ }
+ }
+
+ return std::make_pair(nMinHeight, nMinTime);
+}
+
+static bool EvaluateSequenceLocks(const CBlockIndex& block, std::pair<int, int64_t> lockPair)
+{
+ assert(block.pprev);
+ int64_t nBlockTime = block.pprev->GetMedianTimePast();
+ if (lockPair.first >= block.nHeight || lockPair.second >= nBlockTime)
+ return false;
+
+ return true;
+}
+
+bool SequenceLocks(const CTransaction &tx, int flags, std::vector<int>* prevHeights, const CBlockIndex& block)
+{
+ return EvaluateSequenceLocks(block, CalculateSequenceLocks(tx, flags, prevHeights, block));
+}
+
+bool TestLockPointValidity(const LockPoints* lp)
+{
+ AssertLockHeld(cs_main);
+ assert(lp);
+ // If there are relative lock times then the maxInputBlock will be set
+ // If there are no relative lock times, the LockPoints don't depend on the chain
+ if (lp->maxInputBlock) {
+ // Check whether chainActive is an extension of the block at which the LockPoints
+ // calculation was valid. If not LockPoints are no longer valid
+ if (!chainActive.Contains(lp->maxInputBlock)) {
+ return false;
+ }
+ }
+
+ // LockPoints still valid
+ return true;
+}
+
+bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool useExistingLockPoints)
+{
+ AssertLockHeld(cs_main);
+ AssertLockHeld(mempool.cs);
+
+ CBlockIndex* tip = chainActive.Tip();
+ CBlockIndex index;
+ index.pprev = tip;
+ // CheckSequenceLocks() uses chainActive.Height()+1 to evaluate
+ // height based locks because when SequenceLocks() is called within
+ // ConnectBlock(), 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 use one more than chainActive.Height()
+ index.nHeight = tip->nHeight + 1;
+
+ std::pair<int, int64_t> lockPair;
+ if (useExistingLockPoints) {
+ assert(lp);
+ lockPair.first = lp->height;
+ lockPair.second = lp->time;
+ }
+ else {
+ // pcoinsTip contains the UTXO set for chainActive.Tip()
+ CCoinsViewMemPool viewMemPool(pcoinsTip, mempool);
+ std::vector<int> prevheights;
+ prevheights.resize(tx.vin.size());
+ for (size_t txinIndex = 0; txinIndex < tx.vin.size(); txinIndex++) {
+ const CTxIn& txin = tx.vin[txinIndex];
+ CCoins coins;
+ if (!viewMemPool.GetCoins(txin.prevout.hash, coins)) {
+ return error("%s: Missing input", __func__);
+ }
+ if (coins.nHeight == MEMPOOL_HEIGHT) {
+ // Assume all mempool transaction confirm in the next block
+ prevheights[txinIndex] = tip->nHeight + 1;
+ } else {
+ prevheights[txinIndex] = coins.nHeight;
+ }
+ }
+ lockPair = CalculateSequenceLocks(tx, flags, &prevheights, index);
+ if (lp) {
+ lp->height = lockPair.first;
+ lp->time = lockPair.second;
+ // Also store the hash of the block with the highest height of
+ // all the blocks which have sequence locked prevouts.
+ // This hash needs to still be on the chain
+ // for these LockPoint calculations to be valid
+ // Note: It is impossible to correctly calculate a maxInputBlock
+ // if any of the sequence locked inputs depend on unconfirmed txs,
+ // except in the special case where the relative lock time/height
+ // is 0, which is equivalent to no sequence lock. Since we assume
+ // input height of tip+1 for mempool txs and test the resulting
+ // lockPair from CalculateSequenceLocks against tip+1. We know
+ // EvaluateSequenceLocks will fail if there was a non-zero sequence
+ // lock on a mempool input, so we can use the return value of
+ // CheckSequenceLocks to indicate the LockPoints validity
+ int maxInputHeight = 0;
+ BOOST_FOREACH(int height, prevheights) {
+ // Can ignore mempool inputs since we'll fail if they had non-zero locks
+ if (height != tip->nHeight+1) {
+ maxInputHeight = std::max(maxInputHeight, height);
+ }
+ }
+ lp->maxInputBlock = tip->GetAncestor(maxInputHeight);
+ }
+ }
+ return EvaluateSequenceLocks(index, lockPair);
+}
+
+
unsigned int GetLegacySigOpCount(const CTransaction& tx)
{
unsigned int nSigOps = 0;
- BOOST_FOREACH(const CTxIn& txin, tx.vin)
+ for (const auto& txin : tx.vin)
{
nSigOps += txin.scriptSig.GetSigOpCount(false);
}
- BOOST_FOREACH(const CTxOut& txout, tx.vout)
+ for (const auto& txout : tx.vout)
{
nSigOps += txout.scriptPubKey.GetSigOpCount(false);
}
@@ -734,8 +1035,24 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in
return nSigOps;
}
+int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, int flags)
+{
+ int64_t nSigOps = GetLegacySigOpCount(tx) * WITNESS_SCALE_FACTOR;
+ if (tx.IsCoinBase())
+ return nSigOps;
+ if (flags & SCRIPT_VERIFY_P2SH) {
+ nSigOps += GetP2SHSigOpCount(tx, inputs) * WITNESS_SCALE_FACTOR;
+ }
+
+ for (unsigned int i = 0; i < tx.vin.size(); i++)
+ {
+ const CTxOut &prevout = inputs.GetOutputFor(tx.vin[i]);
+ nSigOps += CountWitnessSigOps(tx.vin[i].scriptSig, prevout.scriptPubKey, i < tx.wit.vtxinwit.size() ? &tx.wit.vtxinwit[i].scriptWitness : NULL, flags);
+ }
+ return nSigOps;
+}
@@ -748,13 +1065,13 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state)
return state.DoS(10, false, REJECT_INVALID, "bad-txns-vin-empty");
if (tx.vout.empty())
return state.DoS(10, false, REJECT_INVALID, "bad-txns-vout-empty");
- // Size limits
- if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) > MAX_BLOCK_SIZE)
+ // Size limits (this doesn't take the witness into account, as that hasn't been checked for malleability)
+ if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) > MAX_BLOCK_BASE_SIZE)
return state.DoS(100, false, REJECT_INVALID, "bad-txns-oversize");
// Check for negative or overflow output values
CAmount nValueOut = 0;
- BOOST_FOREACH(const CTxOut& txout, tx.vout)
+ for (const auto& txout : tx.vout)
{
if (txout.nValue < 0)
return state.DoS(100, false, REJECT_INVALID, "bad-txns-vout-negative");
@@ -767,7 +1084,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state)
// Check for duplicate inputs
set<COutPoint> vInOutPoints;
- BOOST_FOREACH(const CTxIn& txin, tx.vin)
+ for (const auto& txin : tx.vin)
{
if (vInOutPoints.count(txin.prevout))
return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputs-duplicate");
@@ -781,7 +1098,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state)
}
else
{
- BOOST_FOREACH(const CTxIn& txin, tx.vin)
+ for (const auto& txin : tx.vin)
if (txin.prevout.IsNull())
return state.DoS(10, false, REJECT_INVALID, "bad-txns-prevout-null");
}
@@ -800,32 +1117,6 @@ void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) {
pcoinsTip->Uncache(removed);
}
-CAmount GetMinRelayFee(const CTransaction& tx, const CTxMemPool& pool, unsigned int nBytes, bool fAllowFree)
-{
- uint256 hash = tx.GetHash();
- double dPriorityDelta = 0;
- CAmount nFeeDelta = 0;
- pool.ApplyDeltas(hash, dPriorityDelta, nFeeDelta);
- if (dPriorityDelta > 0 || nFeeDelta > 0)
- return 0;
-
- CAmount nMinFee = ::minRelayTxFee.GetFee(nBytes);
-
- if (fAllowFree)
- {
- // There is a free transaction area in blocks created by most miners,
- // * If we are relaying we allow transactions up to DEFAULT_BLOCK_PRIORITY_SIZE - 1000
- // to be considered to fall into this category. We don't want to encourage sending
- // multiple transactions instead of one big transaction to avoid fees.
- if (nBytes < (DEFAULT_BLOCK_PRIORITY_SIZE - 1000))
- nMinFee = 0;
- }
-
- if (!MoneyRange(nMinFee))
- nMinFee = MAX_MONEY;
- return nMinFee;
-}
-
/** Convert CValidationState to a human-readable message for logging */
std::string FormatStateMessage(const CValidationState &state)
{
@@ -835,24 +1126,39 @@ std::string FormatStateMessage(const CValidationState &state)
state.GetRejectCode());
}
-bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,
- bool* pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee,
+bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const CTransaction& tx, bool fLimitFree,
+ bool* pfMissingInputs, bool fOverrideMempoolLimit, const CAmount& nAbsurdFee,
std::vector<uint256>& vHashTxnToUncache)
{
+ const uint256 hash = tx.GetHash();
AssertLockHeld(cs_main);
if (pfMissingInputs)
*pfMissingInputs = false;
if (!CheckTransaction(tx, state))
- return false;
+ return false; // state filled in by CheckTransaction
// Coinbase is only valid in a block, not as a loose transaction
if (tx.IsCoinBase())
return state.DoS(100, false, REJECT_INVALID, "coinbase");
+ // Don't relay version 2 transactions until CSV is active, and we can be
+ // sure that such transactions will be mined (unless we're on
+ // -testnet/-regtest).
+ const CChainParams& chainparams = Params();
+ if (fRequireStandard && tx.nVersion >= 2 && VersionBitsTipState(chainparams.GetConsensus(), Consensus::DEPLOYMENT_CSV) != THRESHOLD_ACTIVE) {
+ return state.DoS(0, false, REJECT_NONSTANDARD, "premature-version2-tx");
+ }
+
+ // Reject transactions with witness before segregated witness activates (override with -prematurewitness)
+ bool witnessEnabled = IsWitnessEnabled(chainActive.Tip(), Params().GetConsensus());
+ if (!GetBoolArg("-prematurewitness",false) && !tx.wit.IsNull() && !witnessEnabled) {
+ return state.DoS(0, false, REJECT_NONSTANDARD, "no-witness-yet", true);
+ }
+
// Rather not work on nonstandard transactions (unless -testnet/-regtest)
string reason;
- if (fRequireStandard && !IsStandardTx(tx, reason))
+ if (fRequireStandard && !IsStandardTx(tx, reason, witnessEnabled))
return state.DoS(0, false, REJECT_NONSTANDARD, reason);
// Only accept nLockTime-using transactions that can be mined in the next
@@ -862,7 +1168,6 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
return state.DoS(0, false, REJECT_NONSTANDARD, "non-final");
// is it already in the memory pool?
- uint256 hash = tx.GetHash();
if (pool.exists(hash))
return state.Invalid(false, REJECT_ALREADY_KNOWN, "txn-already-in-mempool");
@@ -872,16 +1177,17 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
LOCK(pool.cs); // protect pool.mapNextTx
BOOST_FOREACH(const CTxIn &txin, tx.vin)
{
- if (pool.mapNextTx.count(txin.prevout))
+ auto itConflicting = pool.mapNextTx.find(txin.prevout);
+ if (itConflicting != pool.mapNextTx.end())
{
- const CTransaction *ptxConflicting = pool.mapNextTx[txin.prevout].ptx;
+ const CTransaction *ptxConflicting = itConflicting->second;
if (!setConflicts.count(ptxConflicting->GetHash()))
{
// Allow opt-out of transaction replacement by setting
// nSequence >= maxint-1 on all inputs.
//
// maxint-1 is picked to still allow use of nLockTime by
- // non-replacable transactions. All inputs rather than just one
+ // non-replaceable transactions. All inputs rather than just one
// is for the sake of multi-party protocols, where we don't
// want a single party to be able to disable replacement.
//
@@ -890,12 +1196,15 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
// unconfirmed ancestors anyway; doing otherwise is hopelessly
// insecure.
bool fReplacementOptOut = true;
- BOOST_FOREACH(const CTxIn &txin, ptxConflicting->vin)
+ if (fEnableReplacement)
{
- if (txin.nSequence < std::numeric_limits<unsigned int>::max()-1)
+ BOOST_FOREACH(const CTxIn &_txin, ptxConflicting->vin)
{
- fReplacementOptOut = false;
- break;
+ if (_txin.nSequence < std::numeric_limits<unsigned int>::max()-1)
+ {
+ fReplacementOptOut = false;
+ break;
+ }
}
}
if (fReplacementOptOut)
@@ -912,6 +1221,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
CCoinsViewCache view(&dummy);
CAmount nValueIn = 0;
+ LockPoints lp;
{
LOCK(pool.cs);
CCoinsViewMemPool viewMemPool(pcoinsTip, pool);
@@ -949,25 +1259,33 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
// we have all inputs cached now, so switch back to dummy, so we don't need to keep lock on mempool
view.SetBackend(dummy);
+
+ // Only accept BIP68 sequence locked 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.
+ // Must keep pool.cs for this unless we change CheckSequenceLocks to take a
+ // CoinsViewCache instead of create its own
+ if (!CheckSequenceLocks(tx, STANDARD_LOCKTIME_VERIFY_FLAGS, &lp))
+ return state.DoS(0, false, REJECT_NONSTANDARD, "non-BIP68-final");
}
// Check for non-standard pay-to-script-hash in inputs
if (fRequireStandard && !AreInputsStandard(tx, view))
return state.Invalid(false, REJECT_NONSTANDARD, "bad-txns-nonstandard-inputs");
- // Check that the transaction doesn't have an excessive number of
- // sigops, making it impossible to mine. Since the coinbase transaction
- // itself can contain sigops MAX_STANDARD_TX_SIGOPS is less than
- // MAX_BLOCK_SIGOPS; we still consider this an invalid rather than
- // merely non-standard transaction.
- unsigned int nSigOps = GetLegacySigOpCount(tx);
- nSigOps += GetP2SHSigOpCount(tx, view);
- if (nSigOps > MAX_STANDARD_TX_SIGOPS)
- return state.DoS(0, false, REJECT_NONSTANDARD, "bad-txns-too-many-sigops", false,
- strprintf("%d > %d", nSigOps, MAX_STANDARD_TX_SIGOPS));
+ // Check for non-standard witness in P2WSH
+ if (!tx.wit.IsNull() && fRequireStandard && !IsWitnessStandard(tx, view))
+ return state.DoS(0, false, REJECT_NONSTANDARD, "bad-witness-nonstandard", true);
+
+ int64_t nSigOpsCost = GetTransactionSigOpCost(tx, view, STANDARD_SCRIPT_VERIFY_FLAGS);
CAmount nValueOut = tx.GetValueOut();
CAmount nFees = nValueIn-nValueOut;
+ // nModifiedFees includes any fee deltas from PrioritiseTransaction
+ CAmount nModifiedFees = nFees;
+ double nPriorityDummy = 0;
+ pool.ApplyDeltas(hash, nPriorityDummy, nModifiedFees);
+
CAmount inChainInputValue;
double dPriority = view.GetPriority(tx, chainActive.Height(), inChainInputValue);
@@ -982,19 +1300,22 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
}
}
- CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), pool.HasNoInputsOf(tx), inChainInputValue, fSpendsCoinbase, nSigOps);
+ CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), pool.HasNoInputsOf(tx), inChainInputValue, fSpendsCoinbase, nSigOpsCost, lp);
unsigned int nSize = entry.GetTxSize();
- // Don't accept it if it can't get into a block
- CAmount txMinFee = GetMinRelayFee(tx, pool, nSize, true);
- if (fLimitFree && nFees < txMinFee)
- return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "insufficient fee", false,
- strprintf("%d < %d", nFees, txMinFee));
+ // Check that the transaction doesn't have an excessive number of
+ // sigops, making it impossible to mine. Since the coinbase transaction
+ // itself can contain sigops MAX_STANDARD_TX_SIGOPS is less than
+ // MAX_BLOCK_SIGOPS; we still consider this an invalid rather than
+ // merely non-standard transaction.
+ if (nSigOpsCost > MAX_STANDARD_TX_SIGOPS_COST)
+ return state.DoS(0, false, REJECT_NONSTANDARD, "bad-txns-too-many-sigops", false,
+ strprintf("%d", nSigOpsCost));
CAmount mempoolRejectFee = pool.GetMinFee(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000).GetFee(nSize);
- if (mempoolRejectFee > 0 && nFees < mempoolRejectFee) {
+ if (mempoolRejectFee > 0 && nModifiedFees < mempoolRejectFee) {
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "mempool min fee not met", false, strprintf("%d < %d", nFees, mempoolRejectFee));
- } else if (GetBoolArg("-relaypriority", DEFAULT_RELAYPRIORITY) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(entry.GetPriority(chainActive.Height() + 1))) {
+ } else if (GetBoolArg("-relaypriority", DEFAULT_RELAYPRIORITY) && nModifiedFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(entry.GetPriority(chainActive.Height() + 1))) {
// Require that free transactions have sufficient priority to be mined in the next block.
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "insufficient priority");
}
@@ -1002,7 +1323,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
// Continuously rate-limit free (really, very-low-fee) transactions
// This mitigates 'penny-flooding' -- sending thousands of free transactions just to
// be annoying or make others' transactions take longer to confirm.
- if (fLimitFree && nFees < ::minRelayTxFee.GetFee(nSize))
+ if (fLimitFree && nModifiedFees < ::minRelayTxFee.GetFee(nSize))
{
static CCriticalSection csFreeLimiter;
static double dFreeCount;
@@ -1016,16 +1337,16 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
nLastTime = nNow;
// -limitfreerelay unit is thousand-bytes-per-minute
// At default rate it would take over a month to fill 1GB
- if (dFreeCount >= GetArg("-limitfreerelay", DEFAULT_LIMITFREERELAY) * 10 * 1000)
+ if (dFreeCount + nSize >= GetArg("-limitfreerelay", DEFAULT_LIMITFREERELAY) * 10 * 1000)
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "rate limited free transaction");
LogPrint("mempool", "Rate limit dFreeCount: %g => %g\n", dFreeCount, dFreeCount+nSize);
dFreeCount += nSize;
}
- if (fRejectAbsurdFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000)
+ if (nAbsurdFee && nFees > nAbsurdFee)
return state.Invalid(false,
REJECT_HIGHFEE, "absurdly-high-fee",
- strprintf("%d > %d", nFees, ::minRelayTxFee.GetFee(nSize) * 10000));
+ strprintf("%d > %d", nFees, nAbsurdFee));
// Calculate in-mempool ancestors, up to a limit.
CTxMemPool::setEntries setAncestors;
@@ -1047,10 +1368,11 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
const uint256 &hashAncestor = ancestorIt->GetTx().GetHash();
if (setConflicts.count(hashAncestor))
{
- return state.DoS(10, error("AcceptToMemoryPool: %s spends conflicting transaction %s",
+ return state.DoS(10, false,
+ REJECT_INVALID, "bad-txns-spends-conflicting-tx", false,
+ strprintf("%s spends conflicting transaction %s",
hash.ToString(),
- hashAncestor.ToString()),
- REJECT_INVALID, "bad-txns-spends-conflicting-tx");
+ hashAncestor.ToString()));
}
}
@@ -1067,7 +1389,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
LOCK(pool.cs);
if (setConflicts.size())
{
- CFeeRate newFeeRate(nFees, nSize);
+ CFeeRate newFeeRate(nModifiedFees, nSize);
set<uint256> setConflictsParents;
const int maxDescendantsToVisit = 100;
CTxMemPool::setEntries setIterConflicting;
@@ -1080,20 +1402,6 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
// Save these to avoid repeated lookups
setIterConflicting.insert(mi);
- // If this entry is "dirty", then we don't have descendant
- // state for this transaction, which means we probably have
- // lots of in-mempool descendants.
- // Don't allow replacements of dirty transactions, to ensure
- // that we don't spend too much time walking descendants.
- // This should be rare.
- if (mi->IsDirty()) {
- return state.DoS(0,
- error("AcceptToMemoryPool: rejecting replacement %s; cannot replace tx %s with untracked descendants",
- hash.ToString(),
- mi->GetTx().GetHash().ToString()),
- REJECT_NONSTANDARD, "too many potential replacements");
- }
-
// Don't allow the replacement to reduce the feerate of the
// mempool.
//
@@ -1110,15 +1418,15 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
// ignored when deciding whether or not to replace, we do
// require the replacement to pay more overall fees too,
// mitigating most cases.
- CFeeRate oldFeeRate(mi->GetFee(), mi->GetTxSize());
+ CFeeRate oldFeeRate(mi->GetModifiedFee(), mi->GetTxSize());
if (newFeeRate <= oldFeeRate)
{
- return state.DoS(0,
- error("AcceptToMemoryPool: rejecting replacement %s; new feerate %s <= old feerate %s",
+ return state.DoS(0, false,
+ REJECT_INSUFFICIENTFEE, "insufficient fee", false,
+ strprintf("rejecting replacement %s; new feerate %s <= old feerate %s",
hash.ToString(),
newFeeRate.ToString(),
- oldFeeRate.ToString()),
- REJECT_INSUFFICIENTFEE, "insufficient fee");
+ oldFeeRate.ToString()));
}
BOOST_FOREACH(const CTxIn &txin, mi->GetTx().vin)
@@ -1138,16 +1446,16 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
pool.CalculateDescendants(it, allConflicting);
}
BOOST_FOREACH(CTxMemPool::txiter it, allConflicting) {
- nConflictingFees += it->GetFee();
+ nConflictingFees += it->GetModifiedFee();
nConflictingSize += it->GetTxSize();
}
} else {
- return state.DoS(0,
- error("AcceptToMemoryPool: rejecting replacement %s; too many potential replacements (%d > %d)\n",
+ return state.DoS(0, false,
+ REJECT_NONSTANDARD, "too many potential replacements", false,
+ strprintf("rejecting replacement %s; too many potential replacements (%d > %d)\n",
hash.ToString(),
nConflictingCount,
- maxDescendantsToVisit),
- REJECT_NONSTANDARD, "too many potential replacements");
+ maxDescendantsToVisit));
}
for (unsigned int j = 0; j < tx.vin.size(); j++)
@@ -1162,40 +1470,57 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
// it's cheaper to just check if the new input refers to a
// tx that's in the mempool.
if (pool.mapTx.find(tx.vin[j].prevout.hash) != pool.mapTx.end())
- return state.DoS(0, error("AcceptToMemoryPool: replacement %s adds unconfirmed input, idx %d",
- hash.ToString(), j),
- REJECT_NONSTANDARD, "replacement-adds-unconfirmed");
+ return state.DoS(0, false,
+ REJECT_NONSTANDARD, "replacement-adds-unconfirmed", false,
+ strprintf("replacement %s adds unconfirmed input, idx %d",
+ hash.ToString(), j));
}
}
// The replacement must pay greater fees than the transactions it
// replaces - if we did the bandwidth used by those conflicting
// transactions would not be paid for.
- if (nFees < nConflictingFees)
+ if (nModifiedFees < nConflictingFees)
{
- return state.DoS(0, error("AcceptToMemoryPool: rejecting replacement %s, less fees than conflicting txs; %s < %s",
- hash.ToString(), FormatMoney(nFees), FormatMoney(nConflictingFees)),
- REJECT_INSUFFICIENTFEE, "insufficient fee");
+ return state.DoS(0, false,
+ REJECT_INSUFFICIENTFEE, "insufficient fee", false,
+ strprintf("rejecting replacement %s, less fees than conflicting txs; %s < %s",
+ hash.ToString(), FormatMoney(nModifiedFees), FormatMoney(nConflictingFees)));
}
// Finally in addition to paying more fees than the conflicts the
// new transaction must pay for its own bandwidth.
- CAmount nDeltaFees = nFees - nConflictingFees;
+ CAmount nDeltaFees = nModifiedFees - nConflictingFees;
if (nDeltaFees < ::minRelayTxFee.GetFee(nSize))
{
- return state.DoS(0,
- error("AcceptToMemoryPool: rejecting replacement %s, not enough additional fees to relay; %s < %s",
+ return state.DoS(0, false,
+ REJECT_INSUFFICIENTFEE, "insufficient fee", false,
+ strprintf("rejecting replacement %s, not enough additional fees to relay; %s < %s",
hash.ToString(),
FormatMoney(nDeltaFees),
- FormatMoney(::minRelayTxFee.GetFee(nSize))),
- REJECT_INSUFFICIENTFEE, "insufficient fee");
+ FormatMoney(::minRelayTxFee.GetFee(nSize))));
}
}
+ unsigned int scriptVerifyFlags = STANDARD_SCRIPT_VERIFY_FLAGS;
+ if (!Params().RequireStandard()) {
+ scriptVerifyFlags = GetArg("-promiscuousmempoolflags", scriptVerifyFlags);
+ }
+
// Check against previous transactions
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
- if (!CheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true))
+ PrecomputedTransactionData txdata(tx);
+ if (!CheckInputs(tx, state, view, true, scriptVerifyFlags, true, txdata)) {
+ // SCRIPT_VERIFY_CLEANSTACK requires SCRIPT_VERIFY_WITNESS, so we
+ // need to turn both off, and compare against just turning off CLEANSTACK
+ // to see if the failure is specifically due to witness validation.
+ if (tx.wit.IsNull() && CheckInputs(tx, state, view, true, scriptVerifyFlags & ~(SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_CLEANSTACK), true, txdata) &&
+ !CheckInputs(tx, state, view, true, scriptVerifyFlags & ~SCRIPT_VERIFY_CLEANSTACK, true, txdata)) {
+ // Only the witness is missing, so the transaction itself may be fine.
+ state.SetCorruptionPossible();
+ }
return false;
+ }
// Check again against just the consensus-critical mandatory script
// verification flags, in case of bugs in the standard flags that cause
@@ -1206,7 +1531,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
// There is a similar check in CreateNewBlock() to prevent creating
// invalid blocks, however allowing such transactions into the mempool
// can be exploited as a DoS attack.
- if (!CheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true))
+ if (!CheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, txdata))
{
return error("%s: BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s, %s",
__func__, hash.ToString(), FormatStateMessage(state));
@@ -1218,10 +1543,10 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
LogPrint("mempool", "replacing tx %s with %s for %s BTC additional fees, %d delta bytes\n",
it->GetTx().GetHash().ToString(),
hash.ToString(),
- FormatMoney(nFees - nConflictingFees),
+ FormatMoney(nModifiedFees - nConflictingFees),
(int)nSize - (int)nConflictingSize);
}
- pool.RemoveStaged(allConflicting);
+ pool.RemoveStaged(allConflicting, false);
// Store transaction in memory
pool.addUnchecked(hash, entry, setAncestors, !IsInitialBlockDownload());
@@ -1240,10 +1565,10 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C
}
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,
- bool* pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee)
+ bool* pfMissingInputs, bool fOverrideMempoolLimit, const CAmount nAbsurdFee)
{
std::vector<uint256> vHashTxToUncache;
- bool res = AcceptToMemoryPoolWorker(pool, state, tx, fLimitFree, pfMissingInputs, fOverrideMempoolLimit, fRejectAbsurdFee, vHashTxToUncache);
+ bool res = AcceptToMemoryPoolWorker(pool, state, tx, fLimitFree, pfMissingInputs, fOverrideMempoolLimit, nAbsurdFee, vHashTxToUncache);
if (!res) {
BOOST_FOREACH(const uint256& hashTx, vHashTxToUncache)
pcoinsTip->Uncache(hashTx);
@@ -1258,8 +1583,10 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, const Consensus::P
LOCK(cs_main);
- if (mempool.lookup(hash, txOut))
+ std::shared_ptr<const CTransaction> ptx = mempool.get(hash);
+ if (ptx)
{
+ txOut = *ptx;
return true;
}
@@ -1287,7 +1614,7 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, const Consensus::P
if (fAllowSlow) { // use coin database to locate block that contains transaction, and scan it
int nHeight = -1;
{
- CCoinsViewCache &view = *pcoinsTip;
+ const CCoinsViewCache& view = *pcoinsTip;
const CCoins* coins = view.AccessCoins(hash);
if (coins)
nHeight = coins->nHeight;
@@ -1393,18 +1720,24 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
bool IsInitialBlockDownload()
{
const CChainParams& chainParams = Params();
+
+ // Once this function has returned false, it must remain false.
+ static std::atomic<bool> latchToFalse{false};
+ // Optimization: pre-test latch before taking the lock.
+ if (latchToFalse.load(std::memory_order_relaxed))
+ return false;
+
LOCK(cs_main);
+ if (latchToFalse.load(std::memory_order_relaxed))
+ return false;
if (fImporting || fReindex)
return true;
if (fCheckpointsEnabled && chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints()))
return true;
- static bool lockIBDState = false;
- if (lockIBDState)
- return false;
bool state = (chainActive.Height() < pindexBestHeader->nHeight - 24 * 6 ||
- pindexBestHeader->GetBlockTime() < GetTime() - chainParams.MaxTipAge());
+ std::max(chainActive.Tip()->GetBlockTime(), pindexBestHeader->GetBlockTime()) < GetTime() - nMaxTipAge);
if (!state)
- lockIBDState = true;
+ latchToFalse.store(true, std::memory_order_relaxed);
return state;
}
@@ -1412,6 +1745,23 @@ bool fLargeWorkForkFound = false;
bool fLargeWorkInvalidChainFound = false;
CBlockIndex *pindexBestForkTip = NULL, *pindexBestForkBase = NULL;
+static void AlertNotify(const std::string& strMessage)
+{
+ uiInterface.NotifyAlertChanged();
+ std::string strCmd = GetArg("-alertnotify", "");
+ if (strCmd.empty()) return;
+
+ // Alert text should be plain ascii coming from a trusted source, but to
+ // be safe we first strip anything not in safeChars, then add single quotes around
+ // the whole string before passing it to the shell:
+ std::string singleQuote("'");
+ std::string safeStatus = SanitizeString(strMessage);
+ safeStatus = singleQuote+safeStatus+singleQuote;
+ boost::replace_all(strCmd, "%s", safeStatus);
+
+ boost::thread t(runCommand, strCmd); // thread runs free
+}
+
void CheckForkWarningConditions()
{
AssertLockHeld(cs_main);
@@ -1431,7 +1781,7 @@ void CheckForkWarningConditions()
{
std::string warning = std::string("'Warning: Large-work fork detected, forking after block ") +
pindexBestForkBase->phashBlock->ToString() + std::string("'");
- CAlert::Notify(warning, true);
+ AlertNotify(warning);
}
if (pindexBestForkTip && pindexBestForkBase)
{
@@ -1543,7 +1893,7 @@ void static InvalidBlockFound(CBlockIndex *pindex, const CValidationState &state
}
}
-void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, CTxUndo &txundo, int nHeight)
+void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, CTxUndo &txundo, int nHeight)
{
// mark inputs spent
if (!tx.IsCoinBase()) {
@@ -1564,28 +1914,21 @@ void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCach
undo.nVersion = coins->nVersion;
}
}
- // add outputs
- inputs.ModifyNewCoins(tx.GetHash())->FromTx(tx, nHeight);
- }
- else {
- // add outputs for coinbase tx
- // In this case call the full ModifyCoins which will do a database
- // lookup to be sure the coins do not already exist otherwise we do not
- // know whether to mark them fresh or not. We want the duplicate coinbases
- // before BIP30 to still be properly overwritten.
- inputs.ModifyCoins(tx.GetHash())->FromTx(tx, nHeight);
}
+ // add outputs
+ inputs.ModifyNewCoins(tx.GetHash(), tx.IsCoinBase())->FromTx(tx, nHeight);
}
-void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, int nHeight)
+void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight)
{
CTxUndo txundo;
- UpdateCoins(tx, state, inputs, txundo, nHeight);
+ UpdateCoins(tx, inputs, txundo, nHeight);
}
bool CScriptCheck::operator()() {
const CScript &scriptSig = ptxTo->vin[nIn].scriptSig;
- if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, cacheStore), &error)) {
+ const CScriptWitness *witness = (nIn < ptxTo->wit.vtxinwit.size()) ? &ptxTo->wit.vtxinwit[nIn].scriptWitness : NULL;
+ if (!VerifyScript(scriptSig, scriptPubKey, witness, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *txdata), &error)) {
return false;
}
return true;
@@ -1644,7 +1987,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins
}
}// namespace Consensus
-bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, std::vector<CScriptCheck> *pvChecks)
+bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, std::vector<CScriptCheck> *pvChecks)
{
if (!tx.IsCoinBase())
{
@@ -1658,9 +2001,12 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
// Only if ALL inputs pass do we perform expensive ECDSA signature checks.
// Helps prevent CPU exhaustion attacks.
- // Skip ECDSA signature verification when connecting blocks
- // before the last block chain checkpoint. This is safe because block merkle hashes are
- // still computed and checked, and any change will be caught at the next checkpoint.
+ // Skip ECDSA signature verification when connecting blocks before the
+ // last block chain checkpoint. Assuming the checkpoints are valid this
+ // is safe because block merkle hashes are still computed and checked,
+ // and any change will be caught at the next checkpoint. Of course, if
+ // the checkpoint is for a chain that's invalid due to false scriptSigs
+ // this optimization would allow an invalid chain to be accepted.
if (fScriptChecks) {
for (unsigned int i = 0; i < tx.vin.size(); i++) {
const COutPoint &prevout = tx.vin[i].prevout;
@@ -1668,7 +2014,7 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
assert(coins);
// Verify signature
- CScriptCheck check(*coins, tx, i, flags, cacheStore);
+ CScriptCheck check(*coins, tx, i, flags, cacheStore, &txdata);
if (pvChecks) {
pvChecks->push_back(CScriptCheck());
check.swap(pvChecks->back());
@@ -1680,9 +2026,9 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
// arguments; if so, don't trigger DoS protection to
// avoid splitting the network between upgraded and
// non-upgraded nodes.
- CScriptCheck check(*coins, tx, i,
- flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore);
- if (check())
+ CScriptCheck check2(*coins, tx, i,
+ flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, &txdata);
+ if (check2())
return state.Invalid(false, REJECT_NONSTANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(check.GetScriptError())));
}
// Failures of other flags indicate a transaction that is
@@ -1690,8 +2036,8 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
// such nodes as they are not following the protocol. That
// said during an upgrade careful thought should be taken
// as to the correct behavior - we may want to continue
- // peering with non-upgraded nodes even after a soft-fork
- // super-majority vote has passed.
+ // peering with non-upgraded nodes even after soft-fork
+ // super-majority signaling has occurred.
return state.DoS(100,false, REJECT_INVALID, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(check.GetScriptError())));
}
}
@@ -1735,7 +2081,7 @@ bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uin
// Open history file to read
CAutoFile filein(OpenUndoFile(pos, true), SER_DISK, CLIENT_VERSION);
if (filein.IsNull())
- return error("%s: OpenBlockFile failed", __func__);
+ return error("%s: OpenUndoFile failed", __func__);
// Read block
uint256 hashChecksum;
@@ -1910,67 +2256,50 @@ 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
+// Protected by cs_main
+VersionBitsCache versionbitscache;
- 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;
+int32_t ComputeBlockVersion(const CBlockIndex* pindexPrev, const Consensus::Params& params)
+{
+ LOCK(cs_main);
+ int32_t nVersion = VERSIONBITS_TOP_BITS;
- 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
+ for (int i = 0; i < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; i++) {
+ ThresholdState state = VersionBitsState(pindexPrev, params, (Consensus::DeploymentPos)i, versionbitscache);
+ if (state == THRESHOLD_LOCKED_IN || state == THRESHOLD_STARTED) {
+ nVersion |= VersionBitsMask(params, (Consensus::DeploymentPos)i);
+ }
}
- // How likely is it to find that many by chance?
- double p = boost::math::pdf(poisson, nBlocks);
+ return nVersion;
+}
- LogPrint("partitioncheck", "%s: Found %d blocks in the last %d hours\n", __func__, nBlocks, SPAN_HOURS);
- LogPrint("partitioncheck", "%s: likelihood: %g\n", __func__, p);
+/**
+ * Threshold condition checker that triggers when unknown versionbits are seen on the network.
+ */
+class WarningBitsConditionChecker : public AbstractThresholdConditionChecker
+{
+private:
+ int bit;
- // 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);
+public:
+ WarningBitsConditionChecker(int bitIn) : bit(bitIn) {}
- 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())
+ int64_t BeginTime(const Consensus::Params& params) const { return 0; }
+ int64_t EndTime(const Consensus::Params& params) const { return std::numeric_limits<int64_t>::max(); }
+ int Period(const Consensus::Params& params) const { return params.nMinerConfirmationWindow; }
+ int Threshold(const Consensus::Params& params) const { return params.nRuleChangeActivationThreshold; }
+
+ bool Condition(const CBlockIndex* pindex, const Consensus::Params& params) const
{
- strMiscWarning = strWarning;
- CAlert::Notify(strWarning, true);
- lastAlertTime = now;
+ return ((pindex->nVersion & VERSIONBITS_TOP_MASK) == VERSIONBITS_TOP_BITS) &&
+ ((pindex->nVersion >> bit) & 1) != 0 &&
+ ((ComputeBlockVersion(pindex->pprev, params) >> bit) & 1) == 0;
}
-}
+};
+
+// Protected by cs_main
+static ThresholdConditionCache warningcache[VERSIONBITS_NUM_BITS];
static int64_t nTimeCheck = 0;
static int64_t nTimeForks = 0;
@@ -1980,16 +2309,16 @@ static int64_t nTimeIndex = 0;
static int64_t nTimeCallbacks = 0;
static int64_t nTimeTotal = 0;
-bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck)
+bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex,
+ CCoinsViewCache& view, const CChainParams& chainparams, bool fJustCheck)
{
- const CChainParams& chainparams = Params();
AssertLockHeld(cs_main);
int64_t nTimeStart = GetTimeMicros();
// Check it again in case a previous version let a bad block in
- if (!CheckBlock(block, state, !fJustCheck, !fJustCheck))
- return false;
+ if (!CheckBlock(block, state, chainparams.GetConsensus(), !fJustCheck, !fJustCheck))
+ return error("%s: Consensus::CheckBlock: %s", __func__, FormatStateMessage(state));
// verify that the view's current state corresponds to the previous block
uint256 hashPrevBlock = pindex->pprev == NULL ? uint256() : pindex->pprev->GetBlockHash();
@@ -2056,18 +2385,29 @@ 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, chainparams.GetConsensus().nMajorityEnforceBlockUpgrade, chainparams.GetConsensus())) {
+ // Start enforcing the DERSIG (BIP66) rule
+ if (pindex->nHeight >= chainparams.GetConsensus().BIP66Height) {
flags |= SCRIPT_VERIFY_DERSIG;
}
- // Start enforcing CHECKLOCKTIMEVERIFY, (BIP65) for block.nVersion=4
- // blocks, when 75% of the network has upgraded:
- if (block.nVersion >= 4 && IsSuperMajority(4, pindex->pprev, chainparams.GetConsensus().nMajorityEnforceBlockUpgrade, chainparams.GetConsensus())) {
+ // Start enforcing CHECKLOCKTIMEVERIFY (BIP65) rule
+ if (pindex->nHeight >= chainparams.GetConsensus().BIP65Height) {
flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY;
}
+ // Start enforcing BIP68 (sequence locks) and BIP112 (CHECKSEQUENCEVERIFY) using versionbits logic.
+ int nLockTimeFlags = 0;
+ if (VersionBitsState(pindex->pprev, chainparams.GetConsensus(), Consensus::DEPLOYMENT_CSV, versionbitscache) == THRESHOLD_ACTIVE) {
+ flags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY;
+ nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE;
+ }
+
+ // Start enforcing WITNESS rules using versionbits logic.
+ if (IsWitnessEnabled(pindex->pprev, chainparams.GetConsensus())) {
+ flags |= SCRIPT_VERIFY_WITNESS;
+ flags |= SCRIPT_VERIFY_NULLDUMMY;
+ }
+
int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1;
LogPrint("bench", " - Fork checks: %.2fms [%.2fs]\n", 0.001 * (nTime2 - nTime1), nTimeForks * 0.000001);
@@ -2075,22 +2415,22 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
CCheckQueueControl<CScriptCheck> control(fScriptChecks && nScriptCheckThreads ? &scriptcheckqueue : NULL);
+ std::vector<uint256> vOrphanErase;
+ std::vector<int> prevheights;
CAmount nFees = 0;
int nInputs = 0;
- unsigned int nSigOps = 0;
+ int64_t nSigOpsCost = 0;
CDiskTxPos pos(pindex->GetBlockPos(), GetSizeOfCompactSize(block.vtx.size()));
std::vector<std::pair<uint256, CDiskTxPos> > vPos;
vPos.reserve(block.vtx.size());
blockundo.vtxundo.reserve(block.vtx.size() - 1);
+ std::vector<PrecomputedTransactionData> txdata;
+ txdata.reserve(block.vtx.size()); // Required so that pointers to individual PrecomputedTransactionData don't get invalidated
for (unsigned int i = 0; i < block.vtx.size(); i++)
{
const CTransaction &tx = block.vtx[i];
nInputs += tx.vin.size();
- nSigOps += GetLegacySigOpCount(tx);
- if (nSigOps > MAX_BLOCK_SIGOPS)
- return state.DoS(100, error("ConnectBlock(): too many sigops"),
- REJECT_INVALID, "bad-blk-sigops");
if (!tx.IsCoinBase())
{
@@ -2098,22 +2438,48 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
return state.DoS(100, error("ConnectBlock(): inputs missing/spent"),
REJECT_INVALID, "bad-txns-inputs-missingorspent");
- if (fStrictPayToScriptHash)
- {
- // Add in sigops done by pay-to-script-hash inputs;
- // this is to prevent a "rogue miner" from creating
- // an incredibly-expensive-to-validate block.
- nSigOps += GetP2SHSigOpCount(tx, view);
- if (nSigOps > MAX_BLOCK_SIGOPS)
- return state.DoS(100, error("ConnectBlock(): too many sigops"),
- REJECT_INVALID, "bad-blk-sigops");
+ // Check that transaction is BIP68 final
+ // BIP68 lock checks (as opposed to nLockTime checks) must
+ // be in ConnectBlock because they require the UTXO set
+ prevheights.resize(tx.vin.size());
+ for (size_t j = 0; j < tx.vin.size(); j++) {
+ prevheights[j] = view.AccessCoins(tx.vin[j].prevout.hash)->nHeight;
+ }
+
+ // Which orphan pool entries must we evict?
+ for (size_t j = 0; j < tx.vin.size(); j++) {
+ auto itByPrev = mapOrphanTransactionsByPrev.find(tx.vin[j].prevout);
+ if (itByPrev == mapOrphanTransactionsByPrev.end()) continue;
+ for (auto mi = itByPrev->second.begin(); mi != itByPrev->second.end(); ++mi) {
+ const CTransaction& orphanTx = (*mi)->second.tx;
+ const uint256& orphanHash = orphanTx.GetHash();
+ vOrphanErase.push_back(orphanHash);
+ }
}
+ if (!SequenceLocks(tx, nLockTimeFlags, &prevheights, *pindex)) {
+ return state.DoS(100, error("%s: contains a non-BIP68-final transaction", __func__),
+ REJECT_INVALID, "bad-txns-nonfinal");
+ }
+ }
+
+ // GetTransactionSigOpCost counts 3 types of sigops:
+ // * legacy (always)
+ // * p2sh (when P2SH enabled in flags and excludes coinbase)
+ // * witness (when witness enabled in flags and excludes coinbase)
+ nSigOpsCost += GetTransactionSigOpCost(tx, view, flags);
+ if (nSigOpsCost > MAX_BLOCK_SIGOPS_COST)
+ return state.DoS(100, error("ConnectBlock(): too many sigops"),
+ REJECT_INVALID, "bad-blk-sigops");
+
+ txdata.emplace_back(tx);
+ if (!tx.IsCoinBase())
+ {
nFees += view.GetValueIn(tx)-tx.GetValueOut();
std::vector<CScriptCheck> vChecks;
bool fCacheResults = fJustCheck; /* Don't cache results if we're actually connecting blocks (still consult the cache, though) */
- if (!CheckInputs(tx, state, view, fScriptChecks, flags, fCacheResults, nScriptCheckThreads ? &vChecks : NULL))
+ if (!CheckInputs(tx, state, view, fScriptChecks, flags, fCacheResults, txdata[i], nScriptCheckThreads ? &vChecks : NULL))
return error("ConnectBlock(): CheckInputs on %s failed with %s",
tx.GetHash().ToString(), FormatStateMessage(state));
control.Add(vChecks);
@@ -2123,7 +2489,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
if (i > 0) {
blockundo.vtxundo.push_back(CTxUndo());
}
- UpdateCoins(tx, state, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight);
+ UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight);
vPos.push_back(std::make_pair(tx.GetHash(), pos));
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION);
@@ -2150,14 +2516,14 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
if (pindex->GetUndoPos().IsNull() || !pindex->IsValid(BLOCK_VALID_SCRIPTS))
{
if (pindex->GetUndoPos().IsNull()) {
- CDiskBlockPos pos;
- if (!FindUndoPos(state, pindex->nFile, pos, ::GetSerializeSize(blockundo, SER_DISK, CLIENT_VERSION) + 40))
+ 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(), chainparams.MessageStart()))
+ 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;
+ pindex->nUndoPos = _pos.nPos;
pindex->nStatus |= BLOCK_HAVE_UNDO;
}
@@ -2180,6 +2546,15 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
GetMainSignals().UpdatedTransaction(hashPrevBestCoinBase);
hashPrevBestCoinBase = block.vtx[0].GetHash();
+ // Erase orphan transactions include or precluded by this block
+ if (vOrphanErase.size()) {
+ int nErased = 0;
+ BOOST_FOREACH(uint256 &orphanHash, vOrphanErase) {
+ nErased += EraseOrphanTx(orphanHash);
+ }
+ LogPrint("mempool", "Erased %d orphan tx included or conflicted by block\n", nErased);
+ }
+
int64_t nTime6 = GetTimeMicros(); nTimeCallbacks += nTime6 - nTime5;
LogPrint("bench", " - Callbacks: %.2fms [%.2fs]\n", 0.001 * (nTime6 - nTime5), nTimeCallbacks * 0.000001);
@@ -2285,7 +2660,7 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
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) {
+ if (fDoFullFlush || ((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).
GetMainSignals().SetBestChain(chainActive.GetLocator());
nLastSetChain = nNow;
@@ -2308,53 +2683,75 @@ void PruneAndFlush() {
}
/** Update chainActive and related internal data structures. */
-void static UpdateTip(CBlockIndex *pindexNew) {
- const CChainParams& chainParams = Params();
+void static UpdateTip(CBlockIndex *pindexNew, const CChainParams& chainParams) {
chainActive.SetTip(pindexNew);
// New best block
nTimeBestReceived = GetTime();
mempool.AddTransactionsUpdated(1);
- 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(chainParams.Checkpoints(), chainActive.Tip()), pcoinsTip->DynamicMemoryUsage() * (1.0 / (1<<20)), pcoinsTip->GetCacheSize());
-
cvBlockChange.notify_all();
- // Check the version of the last 100 blocks to see if we need to upgrade:
static bool fWarned = false;
- if (!IsInitialBlockDownload() && !fWarned)
+ std::vector<std::string> warningMessages;
+ if (!IsInitialBlockDownload())
{
int nUpgraded = 0;
const CBlockIndex* pindex = chainActive.Tip();
+ for (int bit = 0; bit < VERSIONBITS_NUM_BITS; bit++) {
+ WarningBitsConditionChecker checker(bit);
+ ThresholdState state = checker.GetStateFor(pindex, chainParams.GetConsensus(), warningcache[bit]);
+ if (state == THRESHOLD_ACTIVE || state == THRESHOLD_LOCKED_IN) {
+ if (state == THRESHOLD_ACTIVE) {
+ strMiscWarning = strprintf(_("Warning: unknown new rules activated (versionbit %i)"), bit);
+ if (!fWarned) {
+ AlertNotify(strMiscWarning);
+ fWarned = true;
+ }
+ } else {
+ warningMessages.push_back(strprintf("unknown new rules are about to activate (versionbit %i)", bit));
+ }
+ }
+ }
+ // Check the version of the last 100 blocks to see if we need to upgrade:
for (int i = 0; i < 100 && pindex != NULL; i++)
{
- if (pindex->nVersion > CBlock::CURRENT_VERSION)
+ int32_t nExpectedVersion = ComputeBlockVersion(pindex->pprev, chainParams.GetConsensus());
+ if (pindex->nVersion > VERSIONBITS_LAST_OLD_BLOCK_VERSION && (pindex->nVersion & ~nExpectedVersion) != 0)
++nUpgraded;
pindex = pindex->pprev;
}
if (nUpgraded > 0)
- LogPrintf("%s: %d of last 100 blocks above version %d\n", __func__, nUpgraded, (int)CBlock::CURRENT_VERSION);
+ warningMessages.push_back(strprintf("%d of last 100 blocks have unexpected version", nUpgraded));
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!");
- CAlert::Notify(strMiscWarning, true);
- fWarned = true;
+ strMiscWarning = _("Warning: Unknown block versions being mined! It's possible unknown rules are in effect");
+ if (!fWarned) {
+ AlertNotify(strMiscWarning);
+ fWarned = true;
+ }
}
}
+ LogPrintf("%s: new best=%s height=%d version=0x%08x log2_work=%.8g tx=%lu date='%s' progress=%f cache=%.1fMiB(%utx)", __func__,
+ chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), chainActive.Tip()->nVersion,
+ 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(chainParams.Checkpoints(), chainActive.Tip()), pcoinsTip->DynamicMemoryUsage() * (1.0 / (1<<20)), pcoinsTip->GetCacheSize());
+ if (!warningMessages.empty())
+ LogPrintf(" warning='%s'", boost::algorithm::join(warningMessages, ", "));
+ LogPrintf("\n");
+
}
/** Disconnect chainActive's tip. You probably want to call mempool.removeForReorg and manually re-limit mempool size after this, with cs_main held. */
-bool static DisconnectTip(CValidationState& state, const Consensus::Params& consensusParams)
+bool static DisconnectTip(CValidationState& state, const CChainParams& chainparams, bool fBare = false)
{
CBlockIndex *pindexDelete = chainActive.Tip();
assert(pindexDelete);
// Read block from disk.
CBlock block;
- if (!ReadBlockFromDisk(block, pindexDelete, consensusParams))
+ if (!ReadBlockFromDisk(block, pindexDelete, chainparams.GetConsensus()))
return AbortNode(state, "Failed to read block");
// Apply the block atomically to the chain state.
int64_t nStart = GetTimeMicros();
@@ -2368,30 +2765,34 @@ bool static DisconnectTip(CValidationState& state, const Consensus::Params& cons
// Write the chain state to disk, if necessary.
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED))
return false;
- // Resurrect mempool transactions from the disconnected block.
- std::vector<uint256> vHashUpdate;
- BOOST_FOREACH(const CTransaction &tx, block.vtx) {
- // ignore validation errors in resurrected transactions
- list<CTransaction> removed;
- CValidationState stateDummy;
- if (tx.IsCoinBase() || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, true)) {
- mempool.remove(tx, removed, true);
- } else if (mempool.exists(tx.GetHash())) {
- vHashUpdate.push_back(tx.GetHash());
- }
- }
- // AcceptToMemoryPool/addUnchecked all assume that new mempool entries have
- // no in-mempool children, which is generally not true when adding
- // previously-confirmed transactions back to the mempool.
- // UpdateTransactionsFromBlock finds descendants of any transactions in this
- // block that were added back and cleans up the mempool state.
- mempool.UpdateTransactionsFromBlock(vHashUpdate);
+
+ if (!fBare) {
+ // Resurrect mempool transactions from the disconnected block.
+ std::vector<uint256> vHashUpdate;
+ BOOST_FOREACH(const CTransaction &tx, block.vtx) {
+ // ignore validation errors in resurrected transactions
+ list<CTransaction> removed;
+ CValidationState stateDummy;
+ if (tx.IsCoinBase() || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, true)) {
+ mempool.removeRecursive(tx, removed);
+ } else if (mempool.exists(tx.GetHash())) {
+ vHashUpdate.push_back(tx.GetHash());
+ }
+ }
+ // AcceptToMemoryPool/addUnchecked all assume that new mempool entries have
+ // no in-mempool children, which is generally not true when adding
+ // previously-confirmed transactions back to the mempool.
+ // UpdateTransactionsFromBlock finds descendants of any transactions in this
+ // block that were added back and cleans up the mempool state.
+ mempool.UpdateTransactionsFromBlock(vHashUpdate);
+ }
+
// Update chainActive and related variables.
- UpdateTip(pindexDelete->pprev);
+ UpdateTip(pindexDelete->pprev, chainparams);
// Let wallets know transactions went from 1-confirmed to
// 0-confirmed or conflicted:
BOOST_FOREACH(const CTransaction &tx, block.vtx) {
- SyncWithWallets(tx, NULL);
+ SyncWithWallets(tx, pindexDelete->pprev);
}
return true;
}
@@ -2406,7 +2807,7 @@ 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.
*/
-bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, CBlockIndex* pindexNew, const CBlock* pblock)
+bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, CBlockIndex* pindexNew, const CBlock* pblock, std::list<CTransaction> &txConflicted, std::vector<std::tuple<CTransaction,CBlockIndex*,int>> &txChanged)
{
assert(pindexNew->pprev == chainActive.Tip());
// Read block from disk.
@@ -2423,7 +2824,7 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams,
LogPrint("bench", " - Load block from disk: %.2fms [%.2fs]\n", (nTime2 - nTime1) * 0.001, nTimeReadFromDisk * 0.000001);
{
CCoinsViewCache view(pcoinsTip);
- bool rv = ConnectBlock(*pblock, state, pindexNew, view);
+ bool rv = ConnectBlock(*pblock, state, pindexNew, view, chainparams);
GetMainSignals().BlockChecked(*pblock, state);
if (!rv) {
if (state.IsInvalid())
@@ -2442,20 +2843,13 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams,
return false;
int64_t nTime5 = GetTimeMicros(); nTimeChainState += nTime5 - nTime4;
LogPrint("bench", " - Writing chainstate: %.2fms [%.2fs]\n", (nTime5 - nTime4) * 0.001, nTimeChainState * 0.000001);
- // Remove conflicting transactions from the mempool.
- list<CTransaction> txConflicted;
+ // Remove conflicting transactions from the mempool.;
mempool.removeForBlock(pblock->vtx, pindexNew->nHeight, txConflicted, !IsInitialBlockDownload());
// Update chainActive & related variables.
- UpdateTip(pindexNew);
- // Tell wallet about transactions that went from mempool
- // to conflicted:
- BOOST_FOREACH(const CTransaction &tx, txConflicted) {
- SyncWithWallets(tx, NULL);
- }
- // ... and about transactions that got confirmed:
- BOOST_FOREACH(const CTransaction &tx, pblock->vtx) {
- SyncWithWallets(tx, pblock);
- }
+ UpdateTip(pindexNew, chainparams);
+
+ for(unsigned int i=0; i < pblock->vtx.size(); i++)
+ txChanged.emplace_back(pblock->vtx[i], pindexNew, i);
int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1;
LogPrint("bench", " - Connect postprocess: %.2fms [%.2fs]\n", (nTime6 - nTime5) * 0.001, nTimePostConnect * 0.000001);
@@ -2537,17 +2931,16 @@ static void PruneBlockIndexCandidates() {
* Try to make some progress towards making pindexMostWork the active block.
* pblock is either NULL or a pointer to a CBlock corresponding to pindexMostWork.
*/
-static bool ActivateBestChainStep(CValidationState& state, const CChainParams& chainparams, CBlockIndex* pindexMostWork, const CBlock* pblock)
+static bool ActivateBestChainStep(CValidationState& state, const CChainParams& chainparams, CBlockIndex* pindexMostWork, const CBlock* pblock, bool& fInvalidFound, std::list<CTransaction>& txConflicted, std::vector<std::tuple<CTransaction,CBlockIndex*,int>>& txChanged)
{
AssertLockHeld(cs_main);
- bool fInvalidFound = false;
const CBlockIndex *pindexOldTip = chainActive.Tip();
const CBlockIndex *pindexFork = chainActive.FindFork(pindexMostWork);
// Disconnect active blocks which are no longer in the best chain.
bool fBlocksDisconnected = false;
while (chainActive.Tip() && chainActive.Tip() != pindexFork) {
- if (!DisconnectTip(state, chainparams.GetConsensus()))
+ if (!DisconnectTip(state, chainparams))
return false;
fBlocksDisconnected = true;
}
@@ -2571,7 +2964,7 @@ static bool ActivateBestChainStep(CValidationState& state, const CChainParams& c
// Connect new blocks.
BOOST_REVERSE_FOREACH(CBlockIndex *pindexConnect, vpindexToConnect) {
- if (!ConnectTip(state, chainparams, pindexConnect, pindexConnect == pindexMostWork ? pblock : NULL)) {
+ if (!ConnectTip(state, chainparams, pindexConnect, pindexConnect == pindexMostWork ? pblock : NULL, txConflicted, txChanged)) {
if (state.IsInvalid()) {
// The block violates a consensus rule.
if (!state.CorruptionPossible())
@@ -2610,38 +3003,89 @@ static bool ActivateBestChainStep(CValidationState& state, const CChainParams& c
return true;
}
+static void NotifyHeaderTip() {
+ bool fNotify = false;
+ bool fInitialBlockDownload = false;
+ static CBlockIndex* pindexHeaderOld = NULL;
+ CBlockIndex* pindexHeader = NULL;
+ {
+ LOCK(cs_main);
+ if (!setBlockIndexCandidates.empty()) {
+ pindexHeader = *setBlockIndexCandidates.rbegin();
+ }
+ if (pindexHeader != pindexHeaderOld) {
+ fNotify = true;
+ fInitialBlockDownload = IsInitialBlockDownload();
+ pindexHeaderOld = pindexHeader;
+ }
+ }
+ // Send block tip changed notifications without cs_main
+ if (fNotify) {
+ uiInterface.NotifyHeaderTip(fInitialBlockDownload, pindexHeader);
+ }
+}
+
/**
* Make the best chain active, in multiple steps. The result is either failure
* or an activated best chain. pblock is either NULL or a pointer to a block
* that is already loaded (to avoid loading it again from disk).
*/
-bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, const CBlock *pblock) {
+bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, const CBlock *pblock, CConnman* connman) {
CBlockIndex *pindexMostWork = NULL;
+ CBlockIndex *pindexNewTip = NULL;
+ std::vector<std::tuple<CTransaction,CBlockIndex*,int>> txChanged;
+ if (pblock)
+ txChanged.reserve(pblock->vtx.size());
do {
+ txChanged.clear();
boost::this_thread::interruption_point();
+ if (ShutdownRequested())
+ break;
- CBlockIndex *pindexNewTip = NULL;
const CBlockIndex *pindexFork;
+ std::list<CTransaction> txConflicted;
bool fInitialDownload;
+ int nNewHeight;
{
LOCK(cs_main);
CBlockIndex *pindexOldTip = chainActive.Tip();
- pindexMostWork = FindMostWorkChain();
+ if (pindexMostWork == NULL) {
+ pindexMostWork = FindMostWorkChain();
+ }
// Whether we have anything to do at all.
if (pindexMostWork == NULL || pindexMostWork == chainActive.Tip())
return true;
- if (!ActivateBestChainStep(state, chainparams, pindexMostWork, pblock && pblock->GetHash() == pindexMostWork->GetBlockHash() ? pblock : NULL))
+ bool fInvalidFound = false;
+ if (!ActivateBestChainStep(state, chainparams, pindexMostWork, pblock && pblock->GetHash() == pindexMostWork->GetBlockHash() ? pblock : NULL, fInvalidFound, txConflicted, txChanged))
return false;
+ if (fInvalidFound) {
+ // Wipe cache, we may need another branch now.
+ pindexMostWork = NULL;
+ }
pindexNewTip = chainActive.Tip();
pindexFork = chainActive.FindFork(pindexOldTip);
fInitialDownload = IsInitialBlockDownload();
+ nNewHeight = chainActive.Height();
}
// When we reach this point, we switched to a new tip (stored in pindexNewTip).
// Notifications/callbacks that can run without cs_main
+ if(connman)
+ connman->SetBestHeight(nNewHeight);
+
+ // throw all transactions though the signal-interface
+ // while _not_ holding the cs_main lock
+ BOOST_FOREACH(const CTransaction &tx, txConflicted)
+ {
+ SyncWithWallets(tx, pindexNewTip);
+ }
+ // ... and about transactions that got confirmed:
+ for(unsigned int i = 0; i < txChanged.size(); i++)
+ SyncWithWallets(std::get<0>(txChanged[i]), std::get<1>(txChanged[i]), std::get<2>(txChanged[i]));
+
// Always notify the UI if a new block tip was connected
if (pindexFork != pindexNewTip) {
uiInterface.NotifyBlockTip(fInitialDownload, pindexNewTip);
@@ -2663,15 +3107,14 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
int nBlockEstimate = 0;
if (fCheckpointsEnabled)
nBlockEstimate = Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints());
- {
- LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodes) {
- if (chainActive.Height() > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) {
+ if(connman) {
+ connman->ForEachNode([nNewHeight, nBlockEstimate, &vHashes](CNode* pnode) {
+ if (nNewHeight > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) {
BOOST_REVERSE_FOREACH(const uint256& hash, vHashes) {
pnode->PushBlockHash(hash);
}
}
- }
+ });
}
// Notify external listeners about the new tip.
if (!vHashes.empty()) {
@@ -2679,7 +3122,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
}
}
}
- } while(pindexMostWork != chainActive.Tip());
+ } while (pindexNewTip != pindexMostWork);
CheckBlockIndex(chainparams.GetConsensus());
// Write changes periodically to disk, after relay.
@@ -2690,7 +3133,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
return true;
}
-bool InvalidateBlock(CValidationState& state, const Consensus::Params& consensusParams, CBlockIndex *pindex)
+bool InvalidateBlock(CValidationState& state, const CChainParams& chainparams, CBlockIndex *pindex)
{
AssertLockHeld(cs_main);
@@ -2706,7 +3149,7 @@ bool InvalidateBlock(CValidationState& state, const Consensus::Params& consensus
setBlockIndexCandidates.erase(pindexWalk);
// ActivateBestChain considers blocks already in chainActive
// unconditionally valid already, so force disconnect away from it.
- if (!DisconnectTip(state, consensusParams)) {
+ if (!DisconnectTip(state, chainparams)) {
mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS);
return false;
}
@@ -2729,7 +3172,7 @@ bool InvalidateBlock(CValidationState& state, const Consensus::Params& consensus
return true;
}
-bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) {
+bool ResetBlockFailureFlags(CBlockIndex *pindex) {
AssertLockHeld(cs_main);
int nHeight = pindex->nHeight;
@@ -2805,6 +3248,9 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
pindexNew->nDataPos = pos.nPos;
pindexNew->nUndoPos = 0;
pindexNew->nStatus |= BLOCK_HAVE_DATA;
+ if (IsWitnessEnabled(pindexNew->pprev, Params().GetConsensus())) {
+ pindexNew->nStatus |= BLOCK_OPT_WITNESS;
+ }
pindexNew->RaiseValidity(BLOCK_VALID_TRANSACTIONS);
setDirtyBlockIndex.insert(pindexNew);
@@ -2930,22 +3376,16 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
return true;
}
-bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW)
+bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW)
{
// Check proof of work matches claimed amount
- if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, Params().GetConsensus()))
- return state.DoS(50, error("CheckBlockHeader(): proof of work failed"),
- REJECT_INVALID, "high-hash");
-
- // Check timestamp
- if (block.GetBlockTime() > GetAdjustedTime() + 2 * 60 * 60)
- return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),
- REJECT_INVALID, "time-too-new");
+ if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, consensusParams))
+ return state.DoS(50, false, REJECT_INVALID, "high-hash", false, "proof of work failed");
return true;
}
-bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bool fCheckMerkleRoot)
+bool CheckBlock(const CBlock& block, CValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW, bool fCheckMerkleRoot)
{
// These are checks that are independent of context.
@@ -2954,7 +3394,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo
// Check that the header is valid (particularly PoW). This is mostly
// redundant with the call in AcceptBlockHeader.
- if (!CheckBlockHeader(block, state, fCheckPOW))
+ if (!CheckBlockHeader(block, state, consensusParams, fCheckPOW))
return false;
// Check the merkle root.
@@ -2962,50 +3402,45 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo
bool mutated;
uint256 hashMerkleRoot2 = BlockMerkleRoot(block, &mutated);
if (block.hashMerkleRoot != hashMerkleRoot2)
- return state.DoS(100, error("CheckBlock(): hashMerkleRoot mismatch"),
- REJECT_INVALID, "bad-txnmrklroot", true);
+ return state.DoS(100, false, REJECT_INVALID, "bad-txnmrklroot", true, "hashMerkleRoot mismatch");
// Check for merkle tree malleability (CVE-2012-2459): repeating sequences
// of transactions in a block without affecting the merkle root of a block,
// while still invalidating it.
if (mutated)
- return state.DoS(100, error("CheckBlock(): duplicate transaction"),
- REJECT_INVALID, "bad-txns-duplicate", true);
+ return state.DoS(100, false, REJECT_INVALID, "bad-txns-duplicate", true, "duplicate transaction");
}
// All potential-corruption validation must be done before we do any
// transaction validation, as otherwise we may mark the header as invalid
// because we receive the wrong transactions for it.
+ // Note that witness malleability is checked in ContextualCheckBlock, so no
+ // checks that use witness data may be performed here.
// Size limits
- if (block.vtx.empty() || block.vtx.size() > MAX_BLOCK_SIZE || ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION) > MAX_BLOCK_SIZE)
- return state.DoS(100, error("CheckBlock(): size limits failed"),
- REJECT_INVALID, "bad-blk-length");
+ if (block.vtx.empty() || block.vtx.size() > MAX_BLOCK_BASE_SIZE || ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) > MAX_BLOCK_BASE_SIZE)
+ return state.DoS(100, false, REJECT_INVALID, "bad-blk-length", false, "size limits failed");
// First transaction must be coinbase, the rest must not be
if (block.vtx.empty() || !block.vtx[0].IsCoinBase())
- return state.DoS(100, error("CheckBlock(): first tx is not coinbase"),
- REJECT_INVALID, "bad-cb-missing");
+ return state.DoS(100, false, REJECT_INVALID, "bad-cb-missing", false, "first tx is not coinbase");
for (unsigned int i = 1; i < block.vtx.size(); i++)
if (block.vtx[i].IsCoinBase())
- return state.DoS(100, error("CheckBlock(): more than one coinbase"),
- REJECT_INVALID, "bad-cb-multiple");
+ return state.DoS(100, false, REJECT_INVALID, "bad-cb-multiple", false, "more than one coinbase");
// Check transactions
- BOOST_FOREACH(const CTransaction& tx, block.vtx)
+ for (const auto& tx : block.vtx)
if (!CheckTransaction(tx, state))
- return error("CheckBlock(): CheckTransaction of %s failed with %s",
- tx.GetHash().ToString(),
- FormatStateMessage(state));
+ return state.Invalid(false, state.GetRejectCode(), state.GetRejectReason(),
+ strprintf("Transaction check failed (tx hash %s) %s", tx.GetHash().ToString(), state.GetDebugMessage()));
unsigned int nSigOps = 0;
- BOOST_FOREACH(const CTransaction& tx, block.vtx)
+ for (const auto& tx : block.vtx)
{
nSigOps += GetLegacySigOpCount(tx);
}
- if (nSigOps > MAX_BLOCK_SIGOPS)
- return state.DoS(100, error("CheckBlock(): out-of-bounds SigOpCount"),
- REJECT_INVALID, "bad-blk-sigops", true);
+ if (nSigOps * WITNESS_SCALE_FACTOR > MAX_BLOCK_SIGOPS_COST)
+ return state.DoS(100, false, REJECT_INVALID, "bad-blk-sigops", false, "out-of-bounds SigOpCount");
if (fCheckPOW && fCheckMerkleRoot)
block.fChecked = true;
@@ -3027,64 +3462,175 @@ static bool CheckIndexAgainstCheckpoint(const CBlockIndex* pindexPrev, CValidati
return true;
}
-bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex * const pindexPrev)
+bool IsWitnessEnabled(const CBlockIndex* pindexPrev, const Consensus::Params& params)
{
- const Consensus::Params& consensusParams = Params().GetConsensus();
+ LOCK(cs_main);
+ return (VersionBitsState(pindexPrev, params, Consensus::DEPLOYMENT_SEGWIT, versionbitscache) == THRESHOLD_ACTIVE);
+}
+
+// Compute at which vout of the block's coinbase transaction the witness
+// commitment occurs, or -1 if not found.
+static int GetWitnessCommitmentIndex(const CBlock& block)
+{
+ int commitpos = -1;
+ for (size_t o = 0; o < block.vtx[0].vout.size(); o++) {
+ if (block.vtx[0].vout[o].scriptPubKey.size() >= 38 && block.vtx[0].vout[o].scriptPubKey[0] == OP_RETURN && block.vtx[0].vout[o].scriptPubKey[1] == 0x24 && block.vtx[0].vout[o].scriptPubKey[2] == 0xaa && block.vtx[0].vout[o].scriptPubKey[3] == 0x21 && block.vtx[0].vout[o].scriptPubKey[4] == 0xa9 && block.vtx[0].vout[o].scriptPubKey[5] == 0xed) {
+ commitpos = o;
+ }
+ }
+ return commitpos;
+}
+
+void UpdateUncommittedBlockStructures(CBlock& block, const CBlockIndex* pindexPrev, const Consensus::Params& consensusParams)
+{
+ int commitpos = GetWitnessCommitmentIndex(block);
+ static const std::vector<unsigned char> nonce(32, 0x00);
+ if (commitpos != -1 && IsWitnessEnabled(pindexPrev, consensusParams) && block.vtx[0].wit.IsEmpty()) {
+ block.vtx[0].wit.vtxinwit.resize(1);
+ block.vtx[0].wit.vtxinwit[0].scriptWitness.stack.resize(1);
+ block.vtx[0].wit.vtxinwit[0].scriptWitness.stack[0] = nonce;
+ }
+}
+
+std::vector<unsigned char> GenerateCoinbaseCommitment(CBlock& block, const CBlockIndex* pindexPrev, const Consensus::Params& consensusParams)
+{
+ std::vector<unsigned char> commitment;
+ int commitpos = GetWitnessCommitmentIndex(block);
+ bool fHaveWitness = false;
+ for (size_t t = 1; t < block.vtx.size(); t++) {
+ if (!block.vtx[t].wit.IsNull()) {
+ fHaveWitness = true;
+ break;
+ }
+ }
+ std::vector<unsigned char> ret(32, 0x00);
+ if (fHaveWitness && IsWitnessEnabled(pindexPrev, consensusParams)) {
+ if (commitpos == -1) {
+ uint256 witnessroot = BlockWitnessMerkleRoot(block, NULL);
+ CHash256().Write(witnessroot.begin(), 32).Write(&ret[0], 32).Finalize(witnessroot.begin());
+ CTxOut out;
+ out.nValue = 0;
+ out.scriptPubKey.resize(38);
+ out.scriptPubKey[0] = OP_RETURN;
+ out.scriptPubKey[1] = 0x24;
+ out.scriptPubKey[2] = 0xaa;
+ out.scriptPubKey[3] = 0x21;
+ out.scriptPubKey[4] = 0xa9;
+ out.scriptPubKey[5] = 0xed;
+ memcpy(&out.scriptPubKey[6], witnessroot.begin(), 32);
+ commitment = std::vector<unsigned char>(out.scriptPubKey.begin(), out.scriptPubKey.end());
+ const_cast<std::vector<CTxOut>*>(&block.vtx[0].vout)->push_back(out);
+ block.vtx[0].UpdateHash();
+ }
+ }
+ UpdateUncommittedBlockStructures(block, pindexPrev, consensusParams);
+ return commitment;
+}
+
+bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev, int64_t nAdjustedTime)
+{
+ const int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1;
// Check proof of work
if (block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams))
- return state.DoS(100, error("%s: incorrect proof of work", __func__),
- REJECT_INVALID, "bad-diffbits");
+ return state.DoS(100, false, REJECT_INVALID, "bad-diffbits", false, "incorrect proof of work");
// Check timestamp against prev
if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast())
- return state.Invalid(error("%s: block's timestamp is too early", __func__),
- REJECT_INVALID, "time-too-old");
-
- // Reject block.nVersion=1 blocks when 95% (75% on testnet) of the network has upgraded:
- if (block.nVersion < 2 && IsSuperMajority(2, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams))
- return state.Invalid(error("%s: rejected nVersion=1 block", __func__),
- REJECT_OBSOLETE, "bad-version");
+ return state.Invalid(false, REJECT_INVALID, "time-too-old", "block's timestamp is too early");
- // Reject block.nVersion=2 blocks when 95% (75% on testnet) of the network has upgraded:
- if (block.nVersion < 3 && IsSuperMajority(3, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams))
- return state.Invalid(error("%s: rejected nVersion=2 block", __func__),
- REJECT_OBSOLETE, "bad-version");
+ // Check timestamp
+ if (block.GetBlockTime() > nAdjustedTime + 2 * 60 * 60)
+ return state.Invalid(false, REJECT_INVALID, "time-too-new", "block timestamp too far in the future");
- // Reject block.nVersion=3 blocks when 95% (75% on testnet) of the network has upgraded:
- if (block.nVersion < 4 && IsSuperMajority(4, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams))
- return state.Invalid(error("%s : rejected nVersion=3 block", __func__),
- REJECT_OBSOLETE, "bad-version");
+ // Reject outdated version blocks when 95% (75% on testnet) of the network has upgraded:
+ // check for version 2, 3 and 4 upgrades
+ if((block.nVersion < 2 && nHeight >= consensusParams.BIP34Height) ||
+ (block.nVersion < 3 && nHeight >= consensusParams.BIP66Height) ||
+ (block.nVersion < 4 && nHeight >= consensusParams.BIP65Height))
+ return state.Invalid(false, REJECT_OBSOLETE, strprintf("bad-version(0x%08x)", block.nVersion),
+ strprintf("rejected nVersion=0x%08x block", block.nVersion));
return true;
}
-bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIndex * const pindexPrev)
+bool ContextualCheckBlock(const CBlock& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
{
const int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1;
- const Consensus::Params& consensusParams = Params().GetConsensus();
+
+ // Start enforcing BIP113 (Median Time Past) using versionbits logic.
+ int nLockTimeFlags = 0;
+ if (VersionBitsState(pindexPrev, consensusParams, Consensus::DEPLOYMENT_CSV, versionbitscache) == THRESHOLD_ACTIVE) {
+ nLockTimeFlags |= LOCKTIME_MEDIAN_TIME_PAST;
+ }
+
+ int64_t nLockTimeCutoff = (nLockTimeFlags & LOCKTIME_MEDIAN_TIME_PAST)
+ ? pindexPrev->GetMedianTimePast()
+ : block.GetBlockTime();
// Check that all transactions are finalized
- BOOST_FOREACH(const CTransaction& tx, block.vtx) {
- int nLockTimeFlags = 0;
- int64_t nLockTimeCutoff = (nLockTimeFlags & LOCKTIME_MEDIAN_TIME_PAST)
- ? pindexPrev->GetMedianTimePast()
- : block.GetBlockTime();
+ for (const auto& tx : block.vtx) {
if (!IsFinalTx(tx, nHeight, nLockTimeCutoff)) {
- return state.DoS(10, error("%s: contains a non-final transaction", __func__), REJECT_INVALID, "bad-txns-nonfinal");
+ return state.DoS(10, false, REJECT_INVALID, "bad-txns-nonfinal", false, "non-final transaction");
}
}
- // 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, consensusParams.nMajorityEnforceBlockUpgrade, consensusParams))
+ // Enforce rule that the coinbase starts with serialized block height
+ if (nHeight >= consensusParams.BIP34Height)
{
CScript expect = CScript() << nHeight;
if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
!std::equal(expect.begin(), expect.end(), block.vtx[0].vin[0].scriptSig.begin())) {
- return state.DoS(100, error("%s: block height mismatch in coinbase", __func__), REJECT_INVALID, "bad-cb-height");
+ return state.DoS(100, false, REJECT_INVALID, "bad-cb-height", false, "block height mismatch in coinbase");
+ }
+ }
+
+ // Validation for witness commitments.
+ // * We compute the witness hash (which is the hash including witnesses) of all the block's transactions, except the
+ // coinbase (where 0x0000....0000 is used instead).
+ // * The coinbase scriptWitness is a stack of a single 32-byte vector, containing a witness nonce (unconstrained).
+ // * We build a merkle tree with all those witness hashes as leaves (similar to the hashMerkleRoot in the block header).
+ // * There must be at least one output whose scriptPubKey is a single 36-byte push, the first 4 bytes of which are
+ // {0xaa, 0x21, 0xa9, 0xed}, and the following 32 bytes are SHA256^2(witness root, witness nonce). In case there are
+ // multiple, the last one is used.
+ bool fHaveWitness = false;
+ if (VersionBitsState(pindexPrev, consensusParams, Consensus::DEPLOYMENT_SEGWIT, versionbitscache) == THRESHOLD_ACTIVE) {
+ int commitpos = GetWitnessCommitmentIndex(block);
+ if (commitpos != -1) {
+ bool malleated = false;
+ uint256 hashWitness = BlockWitnessMerkleRoot(block, &malleated);
+ // The malleation check is ignored; as the transaction tree itself
+ // already does not permit it, it is impossible to trigger in the
+ // witness tree.
+ if (block.vtx[0].wit.vtxinwit.size() != 1 || block.vtx[0].wit.vtxinwit[0].scriptWitness.stack.size() != 1 || block.vtx[0].wit.vtxinwit[0].scriptWitness.stack[0].size() != 32) {
+ return state.DoS(100, false, REJECT_INVALID, "bad-witness-nonce-size", true, strprintf("%s : invalid witness nonce size", __func__));
+ }
+ CHash256().Write(hashWitness.begin(), 32).Write(&block.vtx[0].wit.vtxinwit[0].scriptWitness.stack[0][0], 32).Finalize(hashWitness.begin());
+ if (memcmp(hashWitness.begin(), &block.vtx[0].vout[commitpos].scriptPubKey[6], 32)) {
+ return state.DoS(100, false, REJECT_INVALID, "bad-witness-merkle-match", true, strprintf("%s : witness merkle commitment mismatch", __func__));
+ }
+ fHaveWitness = true;
}
}
+ // No witness data is allowed in blocks that don't commit to witness data, as this would otherwise leave room for spam
+ if (!fHaveWitness) {
+ for (size_t i = 0; i < block.vtx.size(); i++) {
+ if (!block.vtx[i].wit.IsNull()) {
+ return state.DoS(100, false, REJECT_INVALID, "unexpected-witness", true, strprintf("%s : unexpected witness data found", __func__));
+ }
+ }
+ }
+
+ // After the coinbase witness nonce and commitment are verified,
+ // we can check if the block weight passes (before we've checked the
+ // coinbase witness, it would be possible for the weight to be too
+ // large by filling up the coinbase witness, which doesn't change
+ // the block hash, so we couldn't mark the block as permanently
+ // failed).
+ if (GetBlockWeight(block) > MAX_BLOCK_WEIGHT) {
+ return state.DoS(100, false, REJECT_INVALID, "bad-blk-weight", false, strprintf("%s : weight limit failed", __func__));
+ }
+
return true;
}
@@ -3103,12 +3649,12 @@ static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state
if (ppindex)
*ppindex = pindex;
if (pindex->nStatus & BLOCK_FAILED_MASK)
- return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate");
+ return state.Invalid(error("%s: block %s is marked invalid", __func__, hash.ToString()), 0, "duplicate");
return true;
}
- if (!CheckBlockHeader(block, state))
- return false;
+ if (!CheckBlockHeader(block, state, chainparams.GetConsensus()))
+ return error("%s: Consensus::CheckBlockHeader: %s, %s", __func__, hash.ToString(), FormatStateMessage(state));
// Get prev block index
CBlockIndex* pindexPrev = NULL;
@@ -3123,8 +3669,8 @@ static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state
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 (!ContextualCheckBlockHeader(block, state, chainparams.GetConsensus(), pindexPrev, GetAdjustedTime()))
+ return error("%s: Consensus::ContextualCheckBlockHeader: %s, %s", __func__, hash.ToString(), FormatStateMessage(state));
}
if (pindex == NULL)
pindex = AddToBlockIndex(block);
@@ -3136,11 +3682,13 @@ static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state
}
/** Store block on disk. If dbp is non-NULL, the file is known to already reside on disk */
-static bool AcceptBlock(const CBlock& block, CValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex, bool fRequested, CDiskBlockPos* dbp)
+static bool AcceptBlock(const CBlock& block, CValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex, bool fRequested, const CDiskBlockPos* dbp, bool* fNewBlock)
{
+ if (fNewBlock) *fNewBlock = false;
AssertLockHeld(cs_main);
- CBlockIndex *&pindex = *ppindex;
+ CBlockIndex *pindexDummy = NULL;
+ CBlockIndex *&pindex = ppindex ? *ppindex : pindexDummy;
if (!AcceptBlockHeader(block, state, chainparams, &pindex))
return false;
@@ -3165,13 +3713,15 @@ static bool AcceptBlock(const CBlock& block, CValidationState& state, const CCha
if (!fHasMoreWork) return true; // Don't process less-work chains
if (fTooFarAhead) return true; // Block height is too high
}
+ if (fNewBlock) *fNewBlock = true;
- if ((!CheckBlock(block, state)) || !ContextualCheckBlock(block, state, pindex->pprev)) {
+ if (!CheckBlock(block, state, chainparams.GetConsensus(), GetAdjustedTime()) ||
+ !ContextualCheckBlock(block, state, chainparams.GetConsensus(), pindex->pprev)) {
if (state.IsInvalid() && !state.CorruptionPossible()) {
pindex->nStatus |= BLOCK_FAILED_VALID;
setDirtyBlockIndex.insert(pindex);
}
- return false;
+ return error("%s: %s", __func__, FormatStateMessage(state));
}
int nHeight = pindex->nHeight;
@@ -3199,44 +3749,29 @@ static bool AcceptBlock(const CBlock& block, CValidationState& state, const CCha
return true;
}
-static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned nRequired, const Consensus::Params& consensusParams)
-{
- unsigned int nFound = 0;
- for (int i = 0; i < consensusParams.nMajorityWindow && nFound < nRequired && pstart != NULL; i++)
- {
- if (pstart->nVersion >= minVersion)
- ++nFound;
- pstart = pstart->pprev;
- }
- return (nFound >= nRequired);
-}
-
-
-bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, const CNode* pfrom, const CBlock* pblock, bool fForceProcessing, CDiskBlockPos* dbp)
+bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, CNode* pfrom, const CBlock* pblock, bool fForceProcessing, const CDiskBlockPos* dbp, CConnman* connman)
{
- // Preliminary checks
- bool checked = CheckBlock(*pblock, state);
-
{
LOCK(cs_main);
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, chainparams, &pindex, fRequested, dbp);
+ bool fNewBlock = false;
+ bool ret = AcceptBlock(*pblock, state, chainparams, &pindex, fRequested, dbp, &fNewBlock);
if (pindex && pfrom) {
mapBlockSource[pindex->GetBlockHash()] = pfrom->GetId();
+ if (fNewBlock) pfrom->nLastBlockTime = GetTime();
}
CheckBlockIndex(chainparams.GetConsensus());
if (!ret)
return error("%s: AcceptBlock FAILED", __func__);
}
- if (!ActivateBestChain(state, chainparams, pblock))
+ NotifyHeaderTip();
+
+ if (!ActivateBestChain(state, chainparams, pblock, connman))
return error("%s: ActivateBestChain failed", __func__);
return true;
@@ -3255,13 +3790,13 @@ bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams,
indexDummy.nHeight = pindexPrev->nHeight + 1;
// NOTE: CheckBlockHeader is called by CheckBlock
- if (!ContextualCheckBlockHeader(block, state, pindexPrev))
- return false;
- if (!CheckBlock(block, state, fCheckPOW, fCheckMerkleRoot))
- return false;
- if (!ContextualCheckBlock(block, state, pindexPrev))
- return false;
- if (!ConnectBlock(block, state, &indexDummy, viewNew, true))
+ if (!ContextualCheckBlockHeader(block, state, chainparams.GetConsensus(), pindexPrev, GetAdjustedTime()))
+ return error("%s: Consensus::ContextualCheckBlockHeader: %s", __func__, FormatStateMessage(state));
+ if (!CheckBlock(block, state, chainparams.GetConsensus(), fCheckPOW, fCheckMerkleRoot))
+ return error("%s: Consensus::CheckBlock: %s", __func__, FormatStateMessage(state));
+ if (!ContextualCheckBlock(block, state, chainparams.GetConsensus(), pindexPrev))
+ return error("%s: Consensus::ContextualCheckBlock: %s", __func__, FormatStateMessage(state));
+ if (!ConnectBlock(block, state, &indexDummy, viewNew, chainparams, true))
return false;
assert(state.IsValid());
@@ -3301,10 +3836,10 @@ void PruneOneBlockFile(const int fileNumber)
// 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;
+ std::multimap<CBlockIndex *, CBlockIndex *>::iterator _it = range.first;
range.first++;
- if (it->second == pindex) {
- mapBlocksUnlinked.erase(it);
+ if (_it->second == pindex) {
+ mapBlocksUnlinked.erase(_it);
}
}
}
@@ -3433,7 +3968,7 @@ CBlockIndex * InsertBlockIndex(uint256 hash)
// Create new
CBlockIndex* pindexNew = new CBlockIndex();
if (!pindexNew)
- throw runtime_error("LoadBlockIndex(): new CBlockIndex failed");
+ throw runtime_error(std::string(__func__) + ": new CBlockIndex failed");
mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first;
pindexNew->phashBlock = &((*mi).first);
@@ -3443,7 +3978,7 @@ CBlockIndex * InsertBlockIndex(uint256 hash)
bool static LoadBlockIndexDB()
{
const CChainParams& chainparams = Params();
- if (!pblocktree->LoadBlockIndexGuts())
+ if (!pblocktree->LoadBlockIndexGuts(InsertBlockIndex))
return false;
boost::this_thread::interruption_point();
@@ -3578,19 +4113,33 @@ bool CVerifyDB::VerifyDB(const CChainParams& chainparams, CCoinsView *coinsview,
CBlockIndex* pindexFailure = NULL;
int nGoodTransactions = 0;
CValidationState state;
+ int reportDone = 0;
+ LogPrintf("[0%%]...");
for (CBlockIndex* pindex = chainActive.Tip(); pindex && pindex->pprev; pindex = pindex->pprev)
{
boost::this_thread::interruption_point();
- uiInterface.ShowProgress(_("Verifying blocks..."), std::max(1, std::min(99, (int)(((double)(chainActive.Height() - pindex->nHeight)) / (double)nCheckDepth * (nCheckLevel >= 4 ? 50 : 100)))));
+ int percentageDone = std::max(1, std::min(99, (int)(((double)(chainActive.Height() - pindex->nHeight)) / (double)nCheckDepth * (nCheckLevel >= 4 ? 50 : 100))));
+ if (reportDone < percentageDone/10) {
+ // report every 10% step
+ LogPrintf("[%d%%]...", percentageDone);
+ reportDone = percentageDone/10;
+ }
+ uiInterface.ShowProgress(_("Verifying blocks..."), percentageDone);
if (pindex->nHeight < chainActive.Height()-nCheckDepth)
break;
+ if (fPruneMode && !(pindex->nStatus & BLOCK_HAVE_DATA)) {
+ // If pruning, only go back as far as we have data.
+ LogPrintf("VerifyDB(): block verification stopping at height %d (pruning, no data)\n", pindex->nHeight);
+ break;
+ }
CBlock block;
// check level 0: read from disk
if (!ReadBlockFromDisk(block, pindex, chainparams.GetConsensus()))
return error("VerifyDB(): *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
// check level 1: verify block validity
- if (nCheckLevel >= 1 && !CheckBlock(block, state))
- return error("VerifyDB(): *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
+ if (nCheckLevel >= 1 && !CheckBlock(block, state, chainparams.GetConsensus()))
+ return error("%s: *** found bad block at %d, hash=%s (%s)\n", __func__,
+ pindex->nHeight, pindex->GetBlockHash().ToString(), FormatStateMessage(state));
// check level 2: verify undo validity
if (nCheckLevel >= 2 && pindex) {
CBlockUndo undo;
@@ -3628,16 +4177,101 @@ bool CVerifyDB::VerifyDB(const CChainParams& chainparams, CCoinsView *coinsview,
CBlock block;
if (!ReadBlockFromDisk(block, pindex, chainparams.GetConsensus()))
return error("VerifyDB(): *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
- if (!ConnectBlock(block, state, pindex, coins))
+ if (!ConnectBlock(block, state, pindex, coins, chainparams))
return error("VerifyDB(): *** found unconnectable block at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
}
}
+ LogPrintf("[DONE].\n");
LogPrintf("No coin database inconsistencies in last %i blocks (%i transactions)\n", chainActive.Height() - pindexState->nHeight, nGoodTransactions);
return true;
}
+bool RewindBlockIndex(const CChainParams& params)
+{
+ LOCK(cs_main);
+
+ int nHeight = 1;
+ while (nHeight <= chainActive.Height()) {
+ if (IsWitnessEnabled(chainActive[nHeight - 1], params.GetConsensus()) && !(chainActive[nHeight]->nStatus & BLOCK_OPT_WITNESS)) {
+ break;
+ }
+ nHeight++;
+ }
+
+ // nHeight is now the height of the first insufficiently-validated block, or tipheight + 1
+ CValidationState state;
+ CBlockIndex* pindex = chainActive.Tip();
+ while (chainActive.Height() >= nHeight) {
+ if (fPruneMode && !(chainActive.Tip()->nStatus & BLOCK_HAVE_DATA)) {
+ // If pruning, don't try rewinding past the HAVE_DATA point;
+ // since older blocks can't be served anyway, there's
+ // no need to walk further, and trying to DisconnectTip()
+ // will fail (and require a needless reindex/redownload
+ // of the blockchain).
+ break;
+ }
+ if (!DisconnectTip(state, params, true)) {
+ return error("RewindBlockIndex: unable to disconnect block at height %i", pindex->nHeight);
+ }
+ // Occasionally flush state to disk.
+ if (!FlushStateToDisk(state, FLUSH_STATE_PERIODIC))
+ return false;
+ }
+
+ // Reduce validity flag and have-data flags.
+ // We do this after actual disconnecting, otherwise we'll end up writing the lack of data
+ // to disk before writing the chainstate, resulting in a failure to continue if interrupted.
+ for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) {
+ CBlockIndex* pindexIter = it->second;
+
+ // Note: If we encounter an insufficiently validated block that
+ // is on chainActive, it must be because we are a pruning node, and
+ // this block or some successor doesn't HAVE_DATA, so we were unable to
+ // rewind all the way. Blocks remaining on chainActive at this point
+ // must not have their validity reduced.
+ if (IsWitnessEnabled(pindexIter->pprev, params.GetConsensus()) && !(pindexIter->nStatus & BLOCK_OPT_WITNESS) && !chainActive.Contains(pindexIter)) {
+ // Reduce validity
+ pindexIter->nStatus = std::min<unsigned int>(pindexIter->nStatus & BLOCK_VALID_MASK, BLOCK_VALID_TREE) | (pindexIter->nStatus & ~BLOCK_VALID_MASK);
+ // Remove have-data flags.
+ pindexIter->nStatus &= ~(BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO);
+ // Remove storage location.
+ pindexIter->nFile = 0;
+ pindexIter->nDataPos = 0;
+ pindexIter->nUndoPos = 0;
+ // Remove various other things
+ pindexIter->nTx = 0;
+ pindexIter->nChainTx = 0;
+ pindexIter->nSequenceId = 0;
+ // Make sure it gets written.
+ setDirtyBlockIndex.insert(pindexIter);
+ // Update indexes
+ setBlockIndexCandidates.erase(pindexIter);
+ std::pair<std::multimap<CBlockIndex*, CBlockIndex*>::iterator, std::multimap<CBlockIndex*, CBlockIndex*>::iterator> ret = mapBlocksUnlinked.equal_range(pindexIter->pprev);
+ while (ret.first != ret.second) {
+ if (ret.first->second == pindexIter) {
+ mapBlocksUnlinked.erase(ret.first++);
+ } else {
+ ++ret.first;
+ }
+ }
+ } else if (pindexIter->IsValid(BLOCK_VALID_TRANSACTIONS) && pindexIter->nChainTx) {
+ setBlockIndexCandidates.insert(pindexIter);
+ }
+ }
+
+ PruneBlockIndexCandidates();
+
+ CheckBlockIndex(params.GetConsensus());
+
+ if (!FlushStateToDisk(state, FLUSH_STATE_ALWAYS)) {
+ return false;
+ }
+
+ return true;
+}
+
void UnloadBlockIndex()
{
LOCK(cs_main);
@@ -3655,12 +4289,15 @@ void UnloadBlockIndex()
nBlockSequenceId = 1;
mapBlockSource.clear();
mapBlocksInFlight.clear();
- nQueuedValidatedHeaders = 0;
nPreferredDownload = 0;
setDirtyBlockIndex.clear();
setDirtyFileInfo.clear();
mapNodeState.clear();
recentRejects.reset(NULL);
+ versionbitscache.Clear();
+ for (int b = 0; b < VERSIONBITS_NUM_BITS; b++) {
+ warningcache[b].clear();
+ }
BOOST_FOREACH(BlockMap::value_type& entry, mapBlockIndex) {
delete entry.second;
@@ -3708,8 +4345,6 @@ bool InitBlockIndex(const CChainParams& chainparams)
CBlockIndex *pindex = AddToBlockIndex(block);
if (!ReceivedBlockTransactions(block, state, pindex, blockPos))
return error("LoadBlockIndex(): genesis block not accepted");
- if (!ActivateBestChain(state, chainparams, &block))
- return error("LoadBlockIndex(): genesis block cannot be activated");
// Force a chainstate write so that when we VerifyDB in a moment, it doesn't check stale data
return FlushStateToDisk(state, FLUSH_STATE_ALWAYS);
} catch (const std::runtime_error& e) {
@@ -3729,7 +4364,7 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
int nLoaded = 0;
try {
// This takes over fileIn and calls fclose() on it in the CBufferedFile destructor
- CBufferedFile blkdat(fileIn, 2*MAX_BLOCK_SIZE, MAX_BLOCK_SIZE+8, SER_DISK, CLIENT_VERSION);
+ CBufferedFile blkdat(fileIn, 2*MAX_BLOCK_SERIALIZED_SIZE, MAX_BLOCK_SERIALIZED_SIZE+8, SER_DISK, CLIENT_VERSION);
uint64_t nRewind = blkdat.GetPos();
while (!blkdat.eof()) {
boost::this_thread::interruption_point();
@@ -3740,15 +4375,15 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
unsigned int nSize = 0;
try {
// locate a header
- unsigned char buf[MESSAGE_START_SIZE];
+ unsigned char buf[CMessageHeader::MESSAGE_START_SIZE];
blkdat.FindByte(chainparams.MessageStart()[0]);
nRewind = blkdat.GetPos()+1;
blkdat >> FLATDATA(buf);
- if (memcmp(buf, chainparams.MessageStart(), MESSAGE_START_SIZE))
+ if (memcmp(buf, chainparams.MessageStart(), CMessageHeader::MESSAGE_START_SIZE))
continue;
// read size
blkdat >> nSize;
- if (nSize < 80 || nSize > MAX_BLOCK_SIZE)
+ if (nSize < 80 || nSize > MAX_BLOCK_SERIALIZED_SIZE)
continue;
} catch (const std::exception&) {
// no valid block header found; don't complain
@@ -3777,15 +4412,26 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
// process in case the block isn't known yet
if (mapBlockIndex.count(hash) == 0 || (mapBlockIndex[hash]->nStatus & BLOCK_HAVE_DATA) == 0) {
+ LOCK(cs_main);
CValidationState state;
- if (ProcessNewBlock(state, chainparams, NULL, &block, true, dbp))
+ if (AcceptBlock(block, state, chainparams, NULL, true, dbp, NULL))
nLoaded++;
if (state.IsError())
break;
} 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);
+ LogPrint("reindex", "Block Import: already had block %s at height %d\n", hash.ToString(), mapBlockIndex[hash]->nHeight);
+ }
+
+ // Activate the genesis block so normal node progress can continue
+ if (hash == chainparams.GetConsensus().hashGenesisBlock) {
+ CValidationState state;
+ if (!ActivateBestChain(state, chainparams)) {
+ break;
+ }
}
+ NotifyHeaderTip();
+
// Recursively process earlier encountered successors of this block
deque<uint256> queue;
queue.push_back(hash);
@@ -3797,10 +4443,11 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
std::multimap<uint256, CDiskBlockPos>::iterator it = range.first;
if (ReadBlockFromDisk(block, it->second, chainparams.GetConsensus()))
{
- LogPrintf("%s: Processing out of order child %s of %s\n", __func__, block.GetHash().ToString(),
+ LogPrint("reindex", "%s: Processing out of order child %s of %s\n", __func__, block.GetHash().ToString(),
head.ToString());
+ LOCK(cs_main);
CValidationState dummy;
- if (ProcessNewBlock(dummy, chainparams, NULL, &block, true, &it->second))
+ if (AcceptBlock(block, dummy, chainparams, NULL, true, &it->second, NULL))
{
nLoaded++;
queue.push_back(block.GetHash());
@@ -3808,6 +4455,7 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
}
range.first++;
mapBlocksUnknownParent.erase(it);
+ NotifyHeaderTip();
}
}
} catch (const std::exception& e) {
@@ -4006,17 +4654,12 @@ void static CheckBlockIndex(const Consensus::Params& consensusParams)
assert(nNodes == forward.size());
}
-//////////////////////////////////////////////////////////////////////////////
-//
-// CAlert
-//
-
std::string GetWarnings(const std::string& strFor)
{
- int nPriority = 0;
string strStatusBar;
string strRPC;
string strGUI;
+ const string uiAlertSeperator = "<hr />";
if (!CLIENT_VERSION_IS_RELEASE) {
strStatusBar = "This is a pre-release test build - use at your own risk - do not use for mining or merchant applications";
@@ -4029,35 +4672,19 @@ std::string GetWarnings(const std::string& strFor)
// Misc warnings like out of disk space and clock is wrong
if (strMiscWarning != "")
{
- nPriority = 1000;
- strStatusBar = strGUI = strMiscWarning;
+ strStatusBar = strMiscWarning;
+ strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + strMiscWarning;
}
if (fLargeWorkForkFound)
{
- nPriority = 2000;
strStatusBar = strRPC = "Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.";
- strGUI = _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.");
+ strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.");
}
else if (fLargeWorkInvalidChainFound)
{
- nPriority = 2000;
strStatusBar = strRPC = "Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.";
- strGUI = _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.");
- }
-
- // Alerts
- {
- LOCK(cs_mapAlerts);
- BOOST_FOREACH(PAIRTYPE(const uint256, CAlert)& item, mapAlerts)
- {
- const CAlert& alert = item.second;
- if (alert.AppliesToMe() && alert.nPriority > nPriority)
- {
- nPriority = alert.nPriority;
- strStatusBar = strGUI = alert.strStatusBar;
- }
- }
+ strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.");
}
if (strFor == "gui")
@@ -4088,6 +4715,7 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
switch (inv.type)
{
case MSG_TX:
+ case MSG_WITNESS_TX:
{
assert(recentRejects);
if (chainActive.Tip()->GetBlockHash() != hashRecentRejectsChainTip)
@@ -4100,21 +4728,60 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
recentRejects->reset();
}
+ // Use pcoinsTip->HaveCoinsInCache as a quick approximation to exclude
+ // requesting or processing some txs which have already been included in a block
return recentRejects->contains(inv.hash) ||
mempool.exists(inv.hash) ||
mapOrphanTransactions.count(inv.hash) ||
- pcoinsTip->HaveCoins(inv.hash);
+ pcoinsTip->HaveCoinsInCache(inv.hash);
}
case MSG_BLOCK:
+ case MSG_WITNESS_BLOCK:
return mapBlockIndex.count(inv.hash);
}
// Don't know what it is, just say we already got one
return true;
}
-void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParams)
+static void RelayTransaction(const CTransaction& tx, CConnman& connman)
+{
+ CInv inv(MSG_TX, tx.GetHash());
+ connman.ForEachNode([&inv](CNode* pnode)
+ {
+ pnode->PushInventory(inv);
+ });
+}
+
+static void RelayAddress(const CAddress& addr, bool fReachable, CConnman& connman)
+{
+ int nRelayNodes = fReachable ? 2 : 1; // limited relaying of addresses outside our network(s)
+
+ // Relay to a limited number of other nodes
+ // Use deterministic randomness to send to the same nodes for 24 hours
+ // at a time so the addrKnowns of the chosen nodes prevent repeats
+ uint64_t hashAddr = addr.GetHash();
+ std::multimap<uint64_t, CNode*> mapMix;
+ const CSipHasher hasher = connman.GetDeterministicRandomizer(RANDOMIZER_ID_ADDRESS_RELAY).Write(hashAddr << 32).Write((GetTime() + hashAddr) / (24*60*60));
+
+ auto sortfunc = [&mapMix, &hasher](CNode* pnode) {
+ if (pnode->nVersion >= CADDR_TIME_VERSION) {
+ uint64_t hashKey = CSipHasher(hasher).Write(pnode->id).Finalize();
+ mapMix.emplace(hashKey, pnode);
+ }
+ };
+
+ auto pushfunc = [&addr, &mapMix, &nRelayNodes] {
+ for (auto mi = mapMix.begin(); mi != mapMix.end() && nRelayNodes-- > 0; ++mi)
+ mi->second->PushAddress(addr);
+ };
+
+ connman.ForEachNodeThen(std::move(sortfunc), std::move(pushfunc));
+}
+
+void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParams, CConnman& connman)
{
std::deque<CInv>::iterator it = pfrom->vRecvGetData.begin();
+ unsigned int nMaxSendBufferSize = connman.GetSendBufferSize();
vector<CInv> vNotFound;
@@ -4122,7 +4789,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
while (it != pfrom->vRecvGetData.end()) {
// Don't bother if send buffer is too full to respond anyway
- if (pfrom->nSendSize >= SendBufferSize())
+ if (pfrom->nSendSize >= nMaxSendBufferSize)
break;
const CInv &inv = *it;
@@ -4130,7 +4797,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
boost::this_thread::interruption_point();
it++;
- if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK)
+ if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK || inv.type == MSG_CMPCT_BLOCK || inv.type == MSG_WITNESS_BLOCK)
{
bool send = false;
BlockMap::iterator mi = mapBlockIndex.find(inv.hash);
@@ -4154,7 +4821,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// disconnect node in case we have reached the outbound limit for serving historical blocks
// never disconnect whitelisted nodes
static const int nOneWeek = 7 * 24 * 60 * 60; // assume > 1 week = historical
- if (send && CNode::OutboundTargetReached(true) && ( ((pindexBestHeader != NULL) && (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() > nOneWeek)) || inv.type == MSG_FILTERED_BLOCK) && !pfrom->fWhitelisted)
+ if (send && connman.OutboundTargetReached(true) && ( ((pindexBestHeader != NULL) && (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() > nOneWeek)) || inv.type == MSG_FILTERED_BLOCK) && !pfrom->fWhitelisted)
{
LogPrint("net", "historical block serving limit reached, disconnect peer=%d\n", pfrom->GetId());
@@ -4171,14 +4838,22 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
if (!ReadBlockFromDisk(block, (*mi).second, consensusParams))
assert(!"cannot load block from disk");
if (inv.type == MSG_BLOCK)
- pfrom->PushMessage("block", block);
- else // MSG_FILTERED_BLOCK)
+ pfrom->PushMessageWithFlag(SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::BLOCK, block);
+ else if (inv.type == MSG_WITNESS_BLOCK)
+ pfrom->PushMessage(NetMsgType::BLOCK, block);
+ else if (inv.type == MSG_FILTERED_BLOCK)
{
- LOCK(pfrom->cs_filter);
- if (pfrom->pfilter)
+ bool sendMerkleBlock = false;
+ CMerkleBlock merkleBlock;
{
- CMerkleBlock merkleBlock(block, *pfrom->pfilter);
- pfrom->PushMessage("merkleblock", merkleBlock);
+ LOCK(pfrom->cs_filter);
+ if (pfrom->pfilter) {
+ sendMerkleBlock = true;
+ merkleBlock = CMerkleBlock(block, *pfrom->pfilter);
+ }
+ }
+ if (sendMerkleBlock) {
+ pfrom->PushMessage(NetMsgType::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 didn't send here -
@@ -4187,12 +4862,24 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// however we MUST always provide at least what the remote peer needs
typedef std::pair<unsigned int, uint256> PairType;
BOOST_FOREACH(PairType& pair, merkleBlock.vMatchedTxn)
- if (!pfrom->setInventoryKnown.count(CInv(MSG_TX, pair.second)))
- pfrom->PushMessage("tx", block.vtx[pair.first]);
+ pfrom->PushMessageWithFlag(SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::TX, block.vtx[pair.first]);
}
// else
// no response
}
+ else if (inv.type == MSG_CMPCT_BLOCK)
+ {
+ // If a peer is asking for old blocks, we're almost guaranteed
+ // they wont have a useful mempool to match against a compact block,
+ // and we don't feel like constructing the object for them, so
+ // instead we respond with the full, non-compact block.
+ bool fPeerWantsWitness = State(pfrom->GetId())->fWantsCmpctWitness;
+ if (mi->second->nHeight >= chainActive.Height() - 10) {
+ CBlockHeaderAndShortTxIDs cmpctblock(block, fPeerWantsWitness);
+ pfrom->PushMessageWithFlag(fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::CMPCTBLOCK, cmpctblock);
+ } else
+ pfrom->PushMessageWithFlag(fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::BLOCK, block);
+ }
// Trigger the peer node to send a getblocks request for the next batch of inventory
if (inv.hash == pfrom->hashContinue)
@@ -4202,34 +4889,29 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// wait for other stuff first.
vector<CInv> vInv;
vInv.push_back(CInv(MSG_BLOCK, chainActive.Tip()->GetBlockHash()));
- pfrom->PushMessage("inv", vInv);
+ pfrom->PushMessage(NetMsgType::INV, vInv);
pfrom->hashContinue.SetNull();
}
}
}
- else if (inv.IsKnownType())
+ else if (inv.type == MSG_TX || inv.type == MSG_WITNESS_TX)
{
// Send stream from relay memory
- bool pushed = false;
- {
- LOCK(cs_mapRelay);
- map<CInv, CDataStream>::iterator mi = mapRelay.find(inv);
- if (mi != mapRelay.end()) {
- pfrom->PushMessage(inv.GetCommand(), (*mi).second);
- pushed = true;
+ bool push = false;
+ auto mi = mapRelay.find(inv.hash);
+ if (mi != mapRelay.end()) {
+ pfrom->PushMessageWithFlag(inv.type == MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0, NetMsgType::TX, *mi->second);
+ push = true;
+ } else if (pfrom->timeLastMempoolReq) {
+ auto txinfo = mempool.info(inv.hash);
+ // To protect privacy, do not answer getdata using the mempool when
+ // that TX couldn't have been INVed in reply to a MEMPOOL request.
+ if (txinfo.tx && txinfo.nTime <= pfrom->timeLastMempoolReq) {
+ pfrom->PushMessageWithFlag(inv.type == MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0, NetMsgType::TX, *txinfo.tx);
+ push = true;
}
}
- if (!pushed && inv.type == MSG_TX) {
- CTransaction tx;
- if (mempool.lookup(inv.hash, tx)) {
- CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
- ss.reserve(1000);
- ss << tx;
- pfrom->PushMessage("tx", ss);
- pushed = true;
- }
- }
- if (!pushed) {
+ if (!push) {
vNotFound.push_back(inv);
}
}
@@ -4237,7 +4919,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// Track requests for our stuff.
GetMainSignals().Inventory(inv.hash);
- if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK)
+ if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK || inv.type == MSG_CMPCT_BLOCK || inv.type == MSG_WITNESS_BLOCK)
break;
}
}
@@ -4252,14 +4934,22 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// do that because they want to know about (and store and rebroadcast and
// risk analyze) the dependencies of transactions relevant to them, without
// having to download the entire memory pool.
- pfrom->PushMessage("notfound", vNotFound);
+ pfrom->PushMessage(NetMsgType::NOTFOUND, vNotFound);
}
}
-bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeReceived)
+uint32_t GetFetchFlags(CNode* pfrom, CBlockIndex* pprev, const Consensus::Params& chainparams) {
+ uint32_t nFetchFlags = 0;
+ if ((pfrom->GetLocalServices() & NODE_WITNESS) && State(pfrom->GetId())->fHaveWitness) {
+ nFetchFlags |= MSG_WITNESS_FLAG;
+ }
+ return nFetchFlags;
+}
+
+bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeReceived, const CChainParams& chainparams, CConnman& connman)
{
- const CChainParams& chainparams = Params();
- RandAddSeedPerfmon();
+ unsigned int nMaxSendBufferSize = connman.GetSendBufferSize();
+
LogPrint("net", "received: %s (%u bytes) peer=%d\n", SanitizeString(strCommand), vRecv.size(), pfrom->id);
if (mapArgs.count("-dropmessagestest") && GetRand(atoi(mapArgs["-dropmessagestest"])) == 0)
{
@@ -4268,27 +4958,35 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
- if (!(nLocalServices & NODE_BLOOM) &&
- (strCommand == "filterload" ||
- strCommand == "filteradd" ||
- strCommand == "filterclear"))
+ if (!(pfrom->GetLocalServices() & NODE_BLOOM) &&
+ (strCommand == NetMsgType::FILTERLOAD ||
+ strCommand == NetMsgType::FILTERADD ||
+ strCommand == NetMsgType::FILTERCLEAR))
{
if (pfrom->nVersion >= NO_BLOOM_VERSION) {
+ LOCK(cs_main);
Misbehaving(pfrom->GetId(), 100);
return false;
- } else if (GetBoolArg("-enforcenodebloom", false)) {
+ } else {
pfrom->fDisconnect = true;
return false;
}
}
- if (strCommand == "version")
+ if (strCommand == NetMsgType::VERSION)
{
+ // Feeler connections exist only to verify if address is online.
+ if (pfrom->fFeeler) {
+ assert(pfrom->fInbound == false);
+ pfrom->fDisconnect = true;
+ }
+
// Each connection can only send one version message
if (pfrom->nVersion != 0)
{
- pfrom->PushMessage("reject", strCommand, REJECT_DUPLICATE, string("Duplicate version message"));
+ pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_DUPLICATE, string("Duplicate version message"));
+ LOCK(cs_main);
Misbehaving(pfrom->GetId(), 1);
return false;
}
@@ -4297,12 +4995,27 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
CAddress addrMe;
CAddress addrFrom;
uint64_t nNonce = 1;
- vRecv >> pfrom->nVersion >> pfrom->nServices >> nTime >> addrMe;
+ uint64_t nServiceInt;
+ vRecv >> pfrom->nVersion >> nServiceInt >> nTime >> addrMe;
+ pfrom->nServices = ServiceFlags(nServiceInt);
+ if (!pfrom->fInbound)
+ {
+ connman.SetServices(pfrom->addr, pfrom->nServices);
+ }
+ if (pfrom->nServicesExpected & ~pfrom->nServices)
+ {
+ LogPrint("net", "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom->id, pfrom->nServices, pfrom->nServicesExpected);
+ pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_NONSTANDARD,
+ strprintf("Expected to offer services %08x", pfrom->nServicesExpected));
+ pfrom->fDisconnect = true;
+ return false;
+ }
+
if (pfrom->nVersion < MIN_PEER_PROTO_VERSION)
{
// disconnect from peers older than this proto version
LogPrintf("peer=%d using obsolete version %i; disconnecting\n", pfrom->id, pfrom->nVersion);
- pfrom->PushMessage("reject", strCommand, REJECT_OBSOLETE,
+ pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_OBSOLETE,
strprintf("Version must be %d or greater", MIN_PEER_PROTO_VERSION));
pfrom->fDisconnect = true;
return false;
@@ -4316,15 +5029,19 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
vRecv >> LIMITED_STRING(pfrom->strSubVer, MAX_SUBVERSION_LENGTH);
pfrom->cleanSubVer = SanitizeString(pfrom->strSubVer);
}
- if (!vRecv.empty())
+ if (!vRecv.empty()) {
vRecv >> pfrom->nStartingHeight;
- if (!vRecv.empty())
- vRecv >> pfrom->fRelayTxes; // set to true after we get the first filter* message
- else
- pfrom->fRelayTxes = true;
+ }
+ {
+ LOCK(pfrom->cs_filter);
+ if (!vRecv.empty())
+ vRecv >> pfrom->fRelayTxes; // set to true after we get the first filter* message
+ else
+ pfrom->fRelayTxes = true;
+ }
// Disconnect if we connected to ourself
- if (nNonce == nLocalHostNonce && nNonce > 1)
+ if (pfrom->fInbound && !connman.CheckIncomingNonce(nNonce))
{
LogPrintf("connected to self at %s, disconnecting\n", pfrom->addr.ToString());
pfrom->fDisconnect = true;
@@ -4343,11 +5060,20 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
pfrom->fClient = !(pfrom->nServices & NODE_NETWORK);
+ if((pfrom->nServices & NODE_WITNESS))
+ {
+ LOCK(cs_main);
+ State(pfrom->GetId())->fHaveWitness = true;
+ }
+
// Potentially mark this peer as a preferred download peer.
+ {
+ LOCK(cs_main);
UpdatePreferredDownload(pfrom, State(pfrom->GetId()));
+ }
// Change version
- pfrom->PushMessage("verack");
+ pfrom->PushMessage(NetMsgType::VERACK);
pfrom->ssSend.SetVersion(min(pfrom->nVersion, PROTOCOL_VERSION));
if (!pfrom->fInbound)
@@ -4355,38 +5081,25 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Advertise our address
if (fListen && !IsInitialBlockDownload())
{
- CAddress addr = GetLocalAddress(&pfrom->addr);
+ CAddress addr = GetLocalAddress(&pfrom->addr, pfrom->GetLocalServices());
if (addr.IsRoutable())
{
- LogPrintf("ProcessMessages: advertizing address %s\n", addr.ToString());
+ LogPrint("net", "ProcessMessages: advertising address %s\n", addr.ToString());
pfrom->PushAddress(addr);
} else if (IsPeerAddrLocalGood(pfrom)) {
addr.SetIP(pfrom->addrLocal);
- LogPrintf("ProcessMessages: advertizing address %s\n", addr.ToString());
+ LogPrint("net", "ProcessMessages: advertising address %s\n", addr.ToString());
pfrom->PushAddress(addr);
}
}
// Get recent addresses
- if (pfrom->fOneShot || pfrom->nVersion >= CADDR_TIME_VERSION || addrman.size() < 1000)
+ if (pfrom->fOneShot || pfrom->nVersion >= CADDR_TIME_VERSION || connman.GetAddressCount() < 1000)
{
- pfrom->PushMessage("getaddr");
+ pfrom->PushMessage(NetMsgType::GETADDR);
pfrom->fGetAddr = true;
}
- addrman.Good(pfrom->addr);
- } else {
- if (((CNetAddr)pfrom->addr) == (CNetAddr)addrFrom)
- {
- addrman.Add(addrFrom, addrFrom);
- addrman.Good(addrFrom);
- }
- }
-
- // Relay alerts
- {
- LOCK(cs_mapAlerts);
- BOOST_FOREACH(PAIRTYPE(const uint256, CAlert)& item, mapAlerts)
- item.second.RelayTo(pfrom);
+ connman.MarkAddressGood(pfrom->addr);
}
pfrom->fSuccessfullyConnected = true;
@@ -4409,12 +5122,13 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
else if (pfrom->nVersion == 0)
{
// Must have a version message before anything else
+ LOCK(cs_main);
Misbehaving(pfrom->GetId(), 1);
return false;
}
- else if (strCommand == "verack")
+ else if (strCommand == NetMsgType::VERACK)
{
pfrom->SetRecvVersion(min(pfrom->nVersion, PROTOCOL_VERSION));
@@ -4429,21 +5143,35 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// We send this to non-NODE NETWORK peers as well, because even
// non-NODE NETWORK peers can announce blocks (such as pruning
// nodes)
- pfrom->PushMessage("sendheaders");
+ pfrom->PushMessage(NetMsgType::SENDHEADERS);
+ }
+ if (pfrom->nVersion >= SHORT_IDS_BLOCKS_VERSION) {
+ // Tell our peer we are willing to provide version 1 or 2 cmpctblocks
+ // However, we do not request new block announcements using
+ // cmpctblock messages.
+ // We send this to non-NODE NETWORK peers as well, because
+ // they may wish to request compact blocks from us
+ bool fAnnounceUsingCMPCTBLOCK = false;
+ uint64_t nCMPCTBLOCKVersion = 2;
+ if (pfrom->GetLocalServices() & NODE_WITNESS)
+ pfrom->PushMessage(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion);
+ nCMPCTBLOCKVersion = 1;
+ pfrom->PushMessage(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion);
}
}
- else if (strCommand == "addr")
+ else if (strCommand == NetMsgType::ADDR)
{
vector<CAddress> vAddr;
vRecv >> vAddr;
// Don't want addr from older versions unless seeding
- if (pfrom->nVersion < CADDR_TIME_VERSION && addrman.size() > 1000)
+ if (pfrom->nVersion < CADDR_TIME_VERSION && connman.GetAddressCount() > 1000)
return true;
if (vAddr.size() > 1000)
{
+ LOCK(cs_main);
Misbehaving(pfrom->GetId(), 20);
return error("message addr size() = %u", vAddr.size());
}
@@ -4456,6 +5184,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
{
boost::this_thread::interruption_point();
+ if ((addr.nServices & REQUIRED_SERVICES) != REQUIRED_SERVICES)
+ continue;
+
if (addr.nTime <= 100000000 || addr.nTime > nNow + 10 * 60)
addr.nTime = nNow - 5 * 24 * 60 * 60;
pfrom->AddAddressKnown(addr);
@@ -4463,80 +5194,85 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
if (addr.nTime > nSince && !pfrom->fGetAddr && vAddr.size() <= 10 && addr.IsRoutable())
{
// Relay to a limited number of other nodes
- {
- LOCK(cs_vNodes);
- // Use deterministic randomness to send to the same nodes for 24 hours
- // at a time so the addrKnowns of the chosen nodes prevent repeats
- static uint256 hashSalt;
- if (hashSalt.IsNull())
- hashSalt = GetRandHash();
- uint64_t hashAddr = addr.GetHash();
- uint256 hashRand = ArithToUint256(UintToArith256(hashSalt) ^ (hashAddr<<32) ^ ((GetTime()+hashAddr)/(24*60*60)));
- hashRand = Hash(BEGIN(hashRand), END(hashRand));
- multimap<uint256, CNode*> mapMix;
- BOOST_FOREACH(CNode* pnode, vNodes)
- {
- if (pnode->nVersion < CADDR_TIME_VERSION)
- continue;
- unsigned int nPointer;
- memcpy(&nPointer, &pnode, sizeof(nPointer));
- uint256 hashKey = ArithToUint256(UintToArith256(hashRand) ^ nPointer);
- hashKey = Hash(BEGIN(hashKey), END(hashKey));
- mapMix.insert(make_pair(hashKey, pnode));
- }
- int nRelayNodes = fReachable ? 2 : 1; // limited relaying of addresses outside our network(s)
- for (multimap<uint256, CNode*>::iterator mi = mapMix.begin(); mi != mapMix.end() && nRelayNodes-- > 0; ++mi)
- ((*mi).second)->PushAddress(addr);
- }
+ RelayAddress(addr, fReachable, connman);
}
// Do not store addresses outside our network
if (fReachable)
vAddrOk.push_back(addr);
}
- addrman.Add(vAddrOk, pfrom->addr, 2 * 60 * 60);
+ connman.AddNewAddresses(vAddrOk, pfrom->addr, 2 * 60 * 60);
if (vAddr.size() < 1000)
pfrom->fGetAddr = false;
if (pfrom->fOneShot)
pfrom->fDisconnect = true;
}
- else if (strCommand == "sendheaders")
+ else if (strCommand == NetMsgType::SENDHEADERS)
{
LOCK(cs_main);
State(pfrom->GetId())->fPreferHeaders = true;
}
+ else if (strCommand == NetMsgType::SENDCMPCT)
+ {
+ bool fAnnounceUsingCMPCTBLOCK = false;
+ uint64_t nCMPCTBLOCKVersion = 0;
+ vRecv >> fAnnounceUsingCMPCTBLOCK >> nCMPCTBLOCKVersion;
+ if (nCMPCTBLOCKVersion == 1 || ((pfrom->GetLocalServices() & NODE_WITNESS) && nCMPCTBLOCKVersion == 2)) {
+ LOCK(cs_main);
+ // fProvidesHeaderAndIDs is used to "lock in" version of compact blocks we send (fWantsCmpctWitness)
+ if (!State(pfrom->GetId())->fProvidesHeaderAndIDs) {
+ State(pfrom->GetId())->fProvidesHeaderAndIDs = true;
+ State(pfrom->GetId())->fWantsCmpctWitness = nCMPCTBLOCKVersion == 2;
+ }
+ if (State(pfrom->GetId())->fWantsCmpctWitness == (nCMPCTBLOCKVersion == 2)) // ignore later version announces
+ State(pfrom->GetId())->fPreferHeaderAndIDs = fAnnounceUsingCMPCTBLOCK;
+ if (!State(pfrom->GetId())->fSupportsDesiredCmpctVersion) {
+ if (pfrom->GetLocalServices() & NODE_WITNESS)
+ State(pfrom->GetId())->fSupportsDesiredCmpctVersion = (nCMPCTBLOCKVersion == 2);
+ else
+ State(pfrom->GetId())->fSupportsDesiredCmpctVersion = (nCMPCTBLOCKVersion == 1);
+ }
+ }
+ }
+
- else if (strCommand == "inv")
+ else if (strCommand == NetMsgType::INV)
{
vector<CInv> vInv;
vRecv >> vInv;
if (vInv.size() > MAX_INV_SZ)
{
+ LOCK(cs_main);
Misbehaving(pfrom->GetId(), 20);
return error("message inv size() = %u", vInv.size());
}
- bool fBlocksOnly = GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY);
+ bool fBlocksOnly = !fRelayTxes;
- // Allow whitelisted peers to send data other than blocks in blocks only mode if whitelistalwaysrelay is true
- if (pfrom->fWhitelisted && GetBoolArg("-whitelistalwaysrelay", DEFAULT_WHITELISTALWAYSRELAY))
+ // Allow whitelisted peers to send data other than blocks in blocks only mode if whitelistrelay is true
+ if (pfrom->fWhitelisted && GetBoolArg("-whitelistrelay", DEFAULT_WHITELISTRELAY))
fBlocksOnly = false;
LOCK(cs_main);
+ uint32_t nFetchFlags = GetFetchFlags(pfrom, chainActive.Tip(), chainparams.GetConsensus());
+
std::vector<CInv> vToFetch;
for (unsigned int nInv = 0; nInv < vInv.size(); nInv++)
{
- const CInv &inv = vInv[nInv];
+ CInv &inv = vInv[nInv];
boost::this_thread::interruption_point();
- pfrom->AddInventoryKnown(inv);
bool fAlreadyHave = AlreadyHave(inv);
LogPrint("net", "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom->id);
+ if (inv.type == MSG_TX) {
+ inv.type |= nFetchFlags;
+ }
+
if (inv.type == MSG_BLOCK) {
UpdateBlockAvailability(pfrom->GetId(), inv.hash);
if (!fAlreadyHave && !fImporting && !fReindex && !mapBlocksInFlight.count(inv.hash)) {
@@ -4548,11 +5284,16 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// time the block arrives, the header chain leading up to it is already validated. Not
// doing this will result in the received block being rejected as an orphan in case it is
// not a direct successor.
- pfrom->PushMessage("getheaders", chainActive.GetLocator(pindexBestHeader), inv.hash);
+ pfrom->PushMessage(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), inv.hash);
CNodeState *nodestate = State(pfrom->GetId());
if (CanDirectFetch(chainparams.GetConsensus()) &&
- nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
- vToFetch.push_back(inv);
+ nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER &&
+ (!IsWitnessEnabled(chainActive.Tip(), chainparams.GetConsensus()) || State(pfrom->GetId())->fHaveWitness)) {
+ inv.type |= nFetchFlags;
+ if (nodestate->fSupportsDesiredCmpctVersion)
+ vToFetch.push_back(CInv(MSG_CMPCT_BLOCK, inv.hash));
+ else
+ 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, chainparams.GetConsensus());
@@ -4562,32 +5303,34 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
else
{
+ pfrom->AddInventoryKnown(inv);
if (fBlocksOnly)
LogPrint("net", "transaction (%s) inv sent in violation of protocol peer=%d\n", inv.hash.ToString(), pfrom->id);
- else if (!fAlreadyHave && !fImporting && !fReindex)
+ else if (!fAlreadyHave && !fImporting && !fReindex && !IsInitialBlockDownload())
pfrom->AskFor(inv);
}
// Track requests for our stuff
GetMainSignals().Inventory(inv.hash);
- if (pfrom->nSendSize > (SendBufferSize() * 2)) {
+ if (pfrom->nSendSize > (nMaxSendBufferSize * 2)) {
Misbehaving(pfrom->GetId(), 50);
return error("send buffer size() = %u", pfrom->nSendSize);
}
}
if (!vToFetch.empty())
- pfrom->PushMessage("getdata", vToFetch);
+ pfrom->PushMessage(NetMsgType::GETDATA, vToFetch);
}
- else if (strCommand == "getdata")
+ else if (strCommand == NetMsgType::GETDATA)
{
vector<CInv> vInv;
vRecv >> vInv;
if (vInv.size() > MAX_INV_SZ)
{
+ LOCK(cs_main);
Misbehaving(pfrom->GetId(), 20);
return error("message getdata size() = %u", vInv.size());
}
@@ -4599,11 +5342,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
LogPrint("net", "received getdata for: %s peer=%d\n", vInv[0].ToString(), pfrom->id);
pfrom->vRecvGetData.insert(pfrom->vRecvGetData.end(), vInv.begin(), vInv.end());
- ProcessGetData(pfrom, chainparams.GetConsensus());
+ ProcessGetData(pfrom, chainparams.GetConsensus(), connman);
}
- else if (strCommand == "getblocks")
+ else if (strCommand == NetMsgType::GETBLOCKS)
{
CBlockLocator locator;
uint256 hashStop;
@@ -4647,7 +5390,39 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
- else if (strCommand == "getheaders")
+ else if (strCommand == NetMsgType::GETBLOCKTXN)
+ {
+ BlockTransactionsRequest req;
+ vRecv >> req;
+
+ BlockMap::iterator it = mapBlockIndex.find(req.blockhash);
+ if (it == mapBlockIndex.end() || !(it->second->nStatus & BLOCK_HAVE_DATA)) {
+ LogPrintf("Peer %d sent us a getblocktxn for a block we don't have", pfrom->id);
+ return true;
+ }
+
+ if (it->second->nHeight < chainActive.Height() - 15) {
+ LogPrint("net", "Peer %d sent us a getblocktxn for a block > 15 deep", pfrom->id);
+ return true;
+ }
+
+ CBlock block;
+ assert(ReadBlockFromDisk(block, it->second, chainparams.GetConsensus()));
+
+ BlockTransactions resp(req);
+ for (size_t i = 0; i < req.indexes.size(); i++) {
+ if (req.indexes[i] >= block.vtx.size()) {
+ Misbehaving(pfrom->GetId(), 100);
+ LogPrintf("Peer %d sent us a getblocktxn with out-of-bounds tx indices", pfrom->id);
+ return true;
+ }
+ resp.txn[i] = block.vtx[req.indexes[i]];
+ }
+ pfrom->PushMessageWithFlag(State(pfrom->GetId())->fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::BLOCKTXN, resp);
+ }
+
+
+ else if (strCommand == NetMsgType::GETHEADERS)
{
CBlockLocator locator;
uint256 hashStop;
@@ -4680,7 +5455,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// we must use CBlocks, as CBlockHeaders won't include the 0x00 nTx count at the end
vector<CBlock> vHeaders;
int nLimit = MAX_HEADERS_RESULTS;
- LogPrint("net", "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.ToString(), pfrom->id);
+ LogPrint("net", "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom->id);
for (; pindex; pindex = chainActive.Next(pindex))
{
vHeaders.push_back(pindex->GetBlockHeader());
@@ -4692,21 +5467,21 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// headers message). In both cases it's safe to update
// pindexBestHeaderSent to be our tip.
nodestate->pindexBestHeaderSent = pindex ? pindex : chainActive.Tip();
- pfrom->PushMessage("headers", vHeaders);
+ pfrom->PushMessage(NetMsgType::HEADERS, vHeaders);
}
- else if (strCommand == "tx")
+ else if (strCommand == NetMsgType::TX)
{
// Stop processing the transaction early if
- // We are in blocks only mode and peer is either not whitelisted or whitelistalwaysrelay is off
- if (GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY) && (!pfrom->fWhitelisted || !GetBoolArg("-whitelistalwaysrelay", DEFAULT_WHITELISTALWAYSRELAY)))
+ // We are in blocks only mode and peer is either not whitelisted or whitelistrelay is off
+ if (!fRelayTxes && (!pfrom->fWhitelisted || !GetBoolArg("-whitelistrelay", DEFAULT_WHITELISTRELAY)))
{
LogPrint("net", "transaction sent in violation of protocol peer=%d\n", pfrom->id);
return true;
}
- vector<uint256> vWorkQueue;
+ deque<COutPoint> vWorkQueue;
vector<uint256> vEraseQueue;
CTransaction tx;
vRecv >> tx;
@@ -4720,13 +5495,16 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
CValidationState state;
pfrom->setAskFor.erase(inv.hash);
- mapAlreadyAskedFor.erase(inv);
+ mapAlreadyAskedFor.erase(inv.hash);
- if (!AlreadyHave(inv) && AcceptToMemoryPool(mempool, state, tx, true, &fMissingInputs))
- {
+ if (!AlreadyHave(inv) && AcceptToMemoryPool(mempool, state, tx, true, &fMissingInputs)) {
mempool.check(pcoinsTip);
- RelayTransaction(tx);
- vWorkQueue.push_back(inv.hash);
+ RelayTransaction(tx, connman);
+ for (unsigned int i = 0; i < tx.vout.size(); i++) {
+ vWorkQueue.emplace_back(inv.hash, i);
+ }
+
+ pfrom->nLastTXTime = GetTime();
LogPrint("mempool", "AcceptToMemoryPool: peer=%d: accepted %s (poolsz %u txn, %u kB)\n",
pfrom->id,
@@ -4735,18 +5513,18 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Recursively process any orphan transactions that depended on this one
set<NodeId> setMisbehaving;
- for (unsigned int i = 0; i < vWorkQueue.size(); i++)
- {
- map<uint256, set<uint256> >::iterator itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue[i]);
+ while (!vWorkQueue.empty()) {
+ auto itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue.front());
+ vWorkQueue.pop_front();
if (itByPrev == mapOrphanTransactionsByPrev.end())
continue;
- for (set<uint256>::iterator mi = itByPrev->second.begin();
+ for (auto mi = itByPrev->second.begin();
mi != itByPrev->second.end();
++mi)
{
- const uint256& orphanHash = *mi;
- const CTransaction& orphanTx = mapOrphanTransactions[orphanHash].tx;
- NodeId fromPeer = mapOrphanTransactions[orphanHash].fromPeer;
+ const CTransaction& orphanTx = (*mi)->second.tx;
+ const uint256& orphanHash = orphanTx.GetHash();
+ NodeId fromPeer = (*mi)->second.fromPeer;
bool fMissingInputs2 = false;
// Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan
// resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get
@@ -4756,11 +5534,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
if (setMisbehaving.count(fromPeer))
continue;
- if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2))
- {
+ if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2)) {
LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString());
- RelayTransaction(orphanTx);
- vWorkQueue.push_back(orphanHash);
+ RelayTransaction(orphanTx, connman);
+ for (unsigned int i = 0; i < orphanTx.vout.size(); i++) {
+ vWorkQueue.emplace_back(orphanHash, i);
+ }
vEraseQueue.push_back(orphanHash);
}
else if (!fMissingInputs2)
@@ -4777,8 +5556,13 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Probably non-standard or insufficient fee/priority
LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString());
vEraseQueue.push_back(orphanHash);
- assert(recentRejects);
- recentRejects->insert(orphanHash);
+ if (orphanTx.wit.IsNull() && !stateDummy.CorruptionPossible()) {
+ // Do not use rejection cache for witness transactions or
+ // witness-stripped transactions, as they can have been malleated.
+ // See https://github.com/bitcoin/bitcoin/issues/8279 for details.
+ assert(recentRejects);
+ recentRejects->insert(orphanHash);
+ }
}
mempool.check(pcoinsTip);
}
@@ -4789,18 +5573,39 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
else if (fMissingInputs)
{
- AddOrphanTx(tx, pfrom->GetId());
+ bool fRejectedParents = false; // It may be the case that the orphans parents have all been rejected
+ BOOST_FOREACH(const CTxIn& txin, tx.vin) {
+ if (recentRejects->contains(txin.prevout.hash)) {
+ fRejectedParents = true;
+ break;
+ }
+ }
+ if (!fRejectedParents) {
+ BOOST_FOREACH(const CTxIn& txin, tx.vin) {
+ CInv _inv(MSG_TX, txin.prevout.hash);
+ pfrom->AddInventoryKnown(_inv);
+ if (!AlreadyHave(_inv)) pfrom->AskFor(_inv);
+ }
+ AddOrphanTx(tx, pfrom->GetId());
- // DoS prevention: do not allow mapOrphanTransactions to grow unbounded
- unsigned int nMaxOrphanTx = (unsigned int)std::max((int64_t)0, GetArg("-maxorphantx", DEFAULT_MAX_ORPHAN_TRANSACTIONS));
- unsigned int nEvicted = LimitOrphanTxSize(nMaxOrphanTx);
- if (nEvicted > 0)
- LogPrint("mempool", "mapOrphan overflow, removed %u tx\n", nEvicted);
+ // DoS prevention: do not allow mapOrphanTransactions to grow unbounded
+ unsigned int nMaxOrphanTx = (unsigned int)std::max((int64_t)0, GetArg("-maxorphantx", DEFAULT_MAX_ORPHAN_TRANSACTIONS));
+ unsigned int nEvicted = LimitOrphanTxSize(nMaxOrphanTx);
+ if (nEvicted > 0)
+ LogPrint("mempool", "mapOrphan overflow, removed %u tx\n", nEvicted);
+ } else {
+ LogPrint("mempool", "not keeping orphan with rejected parents %s\n",tx.GetHash().ToString());
+ }
} else {
- assert(recentRejects);
- recentRejects->insert(tx.GetHash());
+ if (tx.wit.IsNull() && !state.CorruptionPossible()) {
+ // Do not use rejection cache for witness transactions or
+ // witness-stripped transactions, as they can have been malleated.
+ // See https://github.com/bitcoin/bitcoin/issues/8279 for details.
+ assert(recentRejects);
+ recentRejects->insert(tx.GetHash());
+ }
- if (pfrom->fWhitelisted && GetBoolArg("-whitelistalwaysrelay", DEFAULT_WHITELISTALWAYSRELAY)) {
+ if (pfrom->fWhitelisted && GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY)) {
// Always relay transactions received from whitelisted peers, even
// if they were already in the mempool or rejected from it due
// to policy, allowing the node to function as a gateway for
@@ -4812,7 +5617,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
int nDoS = 0;
if (!state.IsInvalid(nDoS) || nDoS == 0) {
LogPrintf("Force relaying tx %s from whitelisted peer=%d\n", tx.GetHash().ToString(), pfrom->id);
- RelayTransaction(tx);
+ RelayTransaction(tx, connman);
} else {
LogPrintf("Not relaying invalid transaction %s from whitelisted peer=%d (%s)\n", tx.GetHash().ToString(), pfrom->id, FormatStateMessage(state));
}
@@ -4825,22 +5630,198 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
pfrom->id,
FormatStateMessage(state));
if (state.GetRejectCode() < REJECT_INTERNAL) // Never send AcceptToMemoryPool's internal codes over P2P
- pfrom->PushMessage("reject", strCommand, state.GetRejectCode(),
+ pfrom->PushMessage(NetMsgType::REJECT, strCommand, (unsigned char)state.GetRejectCode(),
state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), inv.hash);
- if (nDoS > 0)
+ if (nDoS > 0) {
Misbehaving(pfrom->GetId(), nDoS);
+ }
}
FlushStateToDisk(state, FLUSH_STATE_PERIODIC);
}
- else if (strCommand == "headers" && !fImporting && !fReindex) // Ignore headers received while importing
+ else if (strCommand == NetMsgType::CMPCTBLOCK && !fImporting && !fReindex) // Ignore blocks received while importing
+ {
+ CBlockHeaderAndShortTxIDs cmpctblock;
+ vRecv >> cmpctblock;
+
+ LOCK(cs_main);
+
+ if (mapBlockIndex.find(cmpctblock.header.hashPrevBlock) == mapBlockIndex.end()) {
+ // Doesn't connect (or is genesis), instead of DoSing in AcceptBlockHeader, request deeper headers
+ if (!IsInitialBlockDownload())
+ pfrom->PushMessage(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), uint256());
+ return true;
+ }
+
+ CBlockIndex *pindex = NULL;
+ CValidationState state;
+ if (!AcceptBlockHeader(cmpctblock.header, state, chainparams, &pindex)) {
+ int nDoS;
+ if (state.IsInvalid(nDoS)) {
+ if (nDoS > 0)
+ Misbehaving(pfrom->GetId(), nDoS);
+ LogPrintf("Peer %d sent us invalid header via cmpctblock\n", pfrom->id);
+ return true;
+ }
+ }
+
+ // If AcceptBlockHeader returned true, it set pindex
+ assert(pindex);
+ UpdateBlockAvailability(pfrom->GetId(), pindex->GetBlockHash());
+
+ std::map<uint256, pair<NodeId, list<QueuedBlock>::iterator> >::iterator blockInFlightIt = mapBlocksInFlight.find(pindex->GetBlockHash());
+ bool fAlreadyInFlight = blockInFlightIt != mapBlocksInFlight.end();
+
+ if (pindex->nStatus & BLOCK_HAVE_DATA) // Nothing to do here
+ return true;
+
+ if (pindex->nChainWork <= chainActive.Tip()->nChainWork || // We know something better
+ pindex->nTx != 0) { // We had this block at some point, but pruned it
+ if (fAlreadyInFlight) {
+ // We requested this block for some reason, but our mempool will probably be useless
+ // so we just grab the block via normal getdata
+ std::vector<CInv> vInv(1);
+ vInv[0] = CInv(MSG_BLOCK | GetFetchFlags(pfrom, pindex->pprev, chainparams.GetConsensus()), cmpctblock.header.GetHash());
+ pfrom->PushMessage(NetMsgType::GETDATA, vInv);
+ }
+ return true;
+ }
+
+ // If we're not close to tip yet, give up and let parallel block fetch work its magic
+ if (!fAlreadyInFlight && !CanDirectFetch(chainparams.GetConsensus()))
+ return true;
+
+ CNodeState *nodestate = State(pfrom->GetId());
+
+ if (IsWitnessEnabled(pindex->pprev, chainparams.GetConsensus()) && !nodestate->fSupportsDesiredCmpctVersion) {
+ // Don't bother trying to process compact blocks from v1 peers
+ // after segwit activates.
+ return true;
+ }
+
+ // We want to be a bit conservative just to be extra careful about DoS
+ // possibilities in compact block processing...
+ if (pindex->nHeight <= chainActive.Height() + 2) {
+ if ((!fAlreadyInFlight && nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) ||
+ (fAlreadyInFlight && blockInFlightIt->second.first == pfrom->GetId())) {
+ list<QueuedBlock>::iterator *queuedBlockIt = NULL;
+ if (!MarkBlockAsInFlight(pfrom->GetId(), pindex->GetBlockHash(), chainparams.GetConsensus(), pindex, &queuedBlockIt)) {
+ if (!(*queuedBlockIt)->partialBlock)
+ (*queuedBlockIt)->partialBlock.reset(new PartiallyDownloadedBlock(&mempool));
+ else {
+ // The block was already in flight using compact blocks from the same peer
+ LogPrint("net", "Peer sent us compact block we were already syncing!\n");
+ return true;
+ }
+ }
+
+ PartiallyDownloadedBlock& partialBlock = *(*queuedBlockIt)->partialBlock;
+ ReadStatus status = partialBlock.InitData(cmpctblock);
+ if (status == READ_STATUS_INVALID) {
+ MarkBlockAsReceived(pindex->GetBlockHash()); // Reset in-flight state in case of whitelist
+ Misbehaving(pfrom->GetId(), 100);
+ LogPrintf("Peer %d sent us invalid compact block\n", pfrom->id);
+ return true;
+ } else if (status == READ_STATUS_FAILED) {
+ // Duplicate txindexes, the block is now in-flight, so just request it
+ std::vector<CInv> vInv(1);
+ vInv[0] = CInv(MSG_BLOCK | GetFetchFlags(pfrom, pindex->pprev, chainparams.GetConsensus()), cmpctblock.header.GetHash());
+ pfrom->PushMessage(NetMsgType::GETDATA, vInv);
+ return true;
+ }
+
+ BlockTransactionsRequest req;
+ for (size_t i = 0; i < cmpctblock.BlockTxCount(); i++) {
+ if (!partialBlock.IsTxAvailable(i))
+ req.indexes.push_back(i);
+ }
+ if (req.indexes.empty()) {
+ // Dirty hack to jump to BLOCKTXN code (TODO: move message handling into their own functions)
+ BlockTransactions txn;
+ txn.blockhash = cmpctblock.header.GetHash();
+ CDataStream blockTxnMsg(SER_NETWORK, PROTOCOL_VERSION);
+ blockTxnMsg << txn;
+ return ProcessMessage(pfrom, NetMsgType::BLOCKTXN, blockTxnMsg, nTimeReceived, chainparams, connman);
+ } else {
+ req.blockhash = pindex->GetBlockHash();
+ pfrom->PushMessage(NetMsgType::GETBLOCKTXN, req);
+ }
+ }
+ } else {
+ if (fAlreadyInFlight) {
+ // We requested this block, but its far into the future, so our
+ // mempool will probably be useless - request the block normally
+ std::vector<CInv> vInv(1);
+ vInv[0] = CInv(MSG_BLOCK | GetFetchFlags(pfrom, pindex->pprev, chainparams.GetConsensus()), cmpctblock.header.GetHash());
+ pfrom->PushMessage(NetMsgType::GETDATA, vInv);
+ return true;
+ } else {
+ // If this was an announce-cmpctblock, we want the same treatment as a header message
+ // Dirty hack to process as if it were just a headers message (TODO: move message handling into their own functions)
+ std::vector<CBlock> headers;
+ headers.push_back(cmpctblock.header);
+ CDataStream vHeadersMsg(SER_NETWORK, PROTOCOL_VERSION);
+ vHeadersMsg << headers;
+ return ProcessMessage(pfrom, NetMsgType::HEADERS, vHeadersMsg, nTimeReceived, chainparams, connman);
+ }
+ }
+
+ CheckBlockIndex(chainparams.GetConsensus());
+ }
+
+ else if (strCommand == NetMsgType::BLOCKTXN && !fImporting && !fReindex) // Ignore blocks received while importing
+ {
+ BlockTransactions resp;
+ vRecv >> resp;
+
+ LOCK(cs_main);
+
+ map<uint256, pair<NodeId, list<QueuedBlock>::iterator> >::iterator it = mapBlocksInFlight.find(resp.blockhash);
+ if (it == mapBlocksInFlight.end() || !it->second.second->partialBlock ||
+ it->second.first != pfrom->GetId()) {
+ LogPrint("net", "Peer %d sent us block transactions for block we weren't expecting\n", pfrom->id);
+ return true;
+ }
+
+ PartiallyDownloadedBlock& partialBlock = *it->second.second->partialBlock;
+ CBlock block;
+ ReadStatus status = partialBlock.FillBlock(block, resp.txn);
+ if (status == READ_STATUS_INVALID) {
+ MarkBlockAsReceived(resp.blockhash); // Reset in-flight state in case of whitelist
+ Misbehaving(pfrom->GetId(), 100);
+ LogPrintf("Peer %d sent us invalid compact block/non-matching block transactions\n", pfrom->id);
+ return true;
+ } else if (status == READ_STATUS_FAILED) {
+ // Might have collided, fall back to getdata now :(
+ std::vector<CInv> invs;
+ invs.push_back(CInv(MSG_BLOCK | GetFetchFlags(pfrom, chainActive.Tip(), chainparams.GetConsensus()), resp.blockhash));
+ pfrom->PushMessage(NetMsgType::GETDATA, invs);
+ } else {
+ CValidationState state;
+ ProcessNewBlock(state, chainparams, pfrom, &block, false, NULL, &connman);
+ int nDoS;
+ if (state.IsInvalid(nDoS)) {
+ assert (state.GetRejectCode() < REJECT_INTERNAL); // Blocks are never rejected with internal reject codes
+ pfrom->PushMessage(NetMsgType::REJECT, strCommand, (unsigned char)state.GetRejectCode(),
+ state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), block.GetHash());
+ if (nDoS > 0) {
+ LOCK(cs_main);
+ Misbehaving(pfrom->GetId(), nDoS);
+ }
+ }
+ }
+ }
+
+
+ else if (strCommand == NetMsgType::HEADERS && !fImporting && !fReindex) // Ignore headers received while importing
{
std::vector<CBlockHeader> headers;
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
unsigned int nCount = ReadCompactSize(vRecv);
if (nCount > MAX_HEADERS_RESULTS) {
+ LOCK(cs_main);
Misbehaving(pfrom->GetId(), 20);
return error("headers message size = %u", nCount);
}
@@ -4850,6 +5831,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
ReadCompactSize(vRecv); // ignore tx count; assume it is 0.
}
+ {
LOCK(cs_main);
if (nCount == 0) {
@@ -4857,6 +5839,35 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
return true;
}
+ CNodeState *nodestate = State(pfrom->GetId());
+
+ // If this looks like it could be a block announcement (nCount <
+ // MAX_BLOCKS_TO_ANNOUNCE), use special logic for handling headers that
+ // don't connect:
+ // - Send a getheaders message in response to try to connect the chain.
+ // - The peer can send up to MAX_UNCONNECTING_HEADERS in a row that
+ // don't connect before giving DoS points
+ // - Once a headers message is received that is valid and does connect,
+ // nUnconnectingHeaders gets reset back to 0.
+ if (mapBlockIndex.find(headers[0].hashPrevBlock) == mapBlockIndex.end() && nCount < MAX_BLOCKS_TO_ANNOUNCE) {
+ nodestate->nUnconnectingHeaders++;
+ pfrom->PushMessage(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), uint256());
+ LogPrint("net", "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d, nUnconnectingHeaders=%d)\n",
+ headers[0].GetHash().ToString(),
+ headers[0].hashPrevBlock.ToString(),
+ pindexBestHeader->nHeight,
+ pfrom->id, nodestate->nUnconnectingHeaders);
+ // Set hashLastUnknownBlock for this peer, so that if we
+ // eventually get the headers - even from a different peer -
+ // we can use this peer to download.
+ UpdateBlockAvailability(pfrom->GetId(), headers.back().GetHash());
+
+ if (nodestate->nUnconnectingHeaders % MAX_UNCONNECTING_HEADERS == 0) {
+ Misbehaving(pfrom->GetId(), 20);
+ }
+ return true;
+ }
+
CBlockIndex *pindexLast = NULL;
BOOST_FOREACH(const CBlockHeader& header, headers) {
CValidationState state;
@@ -4874,19 +5885,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
}
- if (pindexLast)
- UpdateBlockAvailability(pfrom->GetId(), pindexLast->GetBlockHash());
+ if (nodestate->nUnconnectingHeaders > 0) {
+ LogPrint("net", "peer=%d: resetting nUnconnectingHeaders (%d -> 0)\n", pfrom->id, nodestate->nUnconnectingHeaders);
+ }
+ nodestate->nUnconnectingHeaders = 0;
+
+ assert(pindexLast);
+ UpdateBlockAvailability(pfrom->GetId(), pindexLast->GetBlockHash());
- if (nCount == MAX_HEADERS_RESULTS && pindexLast) {
+ if (nCount == MAX_HEADERS_RESULTS) {
// Headers message had its maximum size; the peer may have more headers.
// TODO: optimize: if pindexLast is an ancestor of chainActive.Tip or pindexBestHeader, continue
// from there instead.
LogPrint("net", "more getheaders (%d) to end to peer=%d (startheight:%d)\n", pindexLast->nHeight, pfrom->id, pfrom->nStartingHeight);
- pfrom->PushMessage("getheaders", chainActive.GetLocator(pindexLast), uint256());
+ pfrom->PushMessage(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexLast), uint256());
}
bool fCanDirectFetch = CanDirectFetch(chainparams.GetConsensus());
- CNodeState *nodestate = State(pfrom->GetId());
// If this set of headers is valid and ends in a block with at least as
// much work as our tip, download as much as possible.
if (fCanDirectFetch && pindexLast->IsValid(BLOCK_VALID_TREE) && chainActive.Tip()->nChainWork <= pindexLast->nChainWork) {
@@ -4895,7 +5910,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Calculate all the blocks we'd need to switch to pindexLast, up to a limit.
while (pindexWalk && !chainActive.Contains(pindexWalk) && vToFetch.size() <= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
if (!(pindexWalk->nStatus & BLOCK_HAVE_DATA) &&
- !mapBlocksInFlight.count(pindexWalk->GetBlockHash())) {
+ !mapBlocksInFlight.count(pindexWalk->GetBlockHash()) &&
+ (!IsWitnessEnabled(pindexWalk->pprev, chainparams.GetConsensus()) || State(pfrom->GetId())->fHaveWitness)) {
// We don't have this block, and it's not yet in flight.
vToFetch.push_back(pindexWalk);
}
@@ -4917,7 +5933,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Can't download any more from this peer
break;
}
- vGetData.push_back(CInv(MSG_BLOCK, pindex->GetBlockHash()));
+ uint32_t nFetchFlags = GetFetchFlags(pfrom, pindex->pprev, chainparams.GetConsensus());
+ vGetData.push_back(CInv(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash()));
MarkBlockAsInFlight(pfrom->GetId(), pindex->GetBlockHash(), chainparams.GetConsensus(), pindex);
LogPrint("net", "Requesting block %s from peer=%d\n",
pindex->GetBlockHash().ToString(), pfrom->id);
@@ -4927,23 +5944,30 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
pindexLast->GetBlockHash().ToString(), pindexLast->nHeight);
}
if (vGetData.size() > 0) {
- pfrom->PushMessage("getdata", vGetData);
+ if (nodestate->fSupportsDesiredCmpctVersion && vGetData.size() == 1 && mapBlocksInFlight.size() == 1 && pindexLast->pprev->IsValid(BLOCK_VALID_CHAIN)) {
+ // We seem to be rather well-synced, so it appears pfrom was the first to provide us
+ // with this block! Let's get them to announce using compact blocks in the future.
+ MaybeSetPeerAsAnnouncingHeaderAndIDs(nodestate, pfrom, connman);
+ // In any case, we want to download using a compact block, not a regular one
+ vGetData[0] = CInv(MSG_CMPCT_BLOCK, vGetData[0].hash);
+ }
+ pfrom->PushMessage(NetMsgType::GETDATA, vGetData);
}
}
}
CheckBlockIndex(chainparams.GetConsensus());
+ }
+
+ NotifyHeaderTip();
}
- else if (strCommand == "block" && !fImporting && !fReindex) // Ignore blocks received while importing
+ else if (strCommand == NetMsgType::BLOCK && !fImporting && !fReindex) // Ignore blocks received while importing
{
CBlock block;
vRecv >> block;
- CInv inv(MSG_BLOCK, block.GetHash());
- LogPrint("net", "received block %s peer=%d\n", inv.hash.ToString(), pfrom->id);
-
- pfrom->AddInventoryKnown(inv);
+ LogPrint("net", "received block %s peer=%d\n", block.GetHash().ToString(), pfrom->id);
CValidationState state;
// Process all blocks from whitelisted peers, even if not requested,
@@ -4951,12 +5975,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Such an unrequested block may still be processed, subject to the
// conditions in AcceptBlock().
bool forceProcessing = pfrom->fWhitelisted && !IsInitialBlockDownload();
- ProcessNewBlock(state, chainparams, pfrom, &block, forceProcessing, NULL);
+ ProcessNewBlock(state, chainparams, pfrom, &block, forceProcessing, NULL, &connman);
int nDoS;
if (state.IsInvalid(nDoS)) {
assert (state.GetRejectCode() < REJECT_INTERNAL); // Blocks are never rejected with internal reject codes
- pfrom->PushMessage("reject", strCommand, state.GetRejectCode(),
- state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), inv.hash);
+ pfrom->PushMessage(NetMsgType::REJECT, strCommand, (unsigned char)state.GetRejectCode(),
+ state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), block.GetHash());
if (nDoS > 0) {
LOCK(cs_main);
Misbehaving(pfrom->GetId(), nDoS);
@@ -4966,46 +5990,55 @@ 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 nodes which are behind NAT and can only make outgoing connections ignore
- // the getaddr message mitigates the attack.
- else if ((strCommand == "getaddr") && (pfrom->fInbound))
+ else if (strCommand == NetMsgType::GETADDR)
{
+ // 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 nodes which are behind NAT and can only make outgoing connections ignore
+ // the getaddr message mitigates the attack.
+ if (!pfrom->fInbound) {
+ LogPrint("net", "Ignoring \"getaddr\" from outbound connection. peer=%d\n", pfrom->id);
+ return true;
+ }
+
+ // Only send one GetAddr response per connection to reduce resource waste
+ // and discourage addr stamping of INV announcements.
+ if (pfrom->fSentAddr) {
+ LogPrint("net", "Ignoring repeated \"getaddr\". peer=%d\n", pfrom->id);
+ return true;
+ }
+ pfrom->fSentAddr = true;
+
pfrom->vAddrToSend.clear();
- vector<CAddress> vAddr = addrman.GetAddr();
+ vector<CAddress> vAddr = connman.GetAddresses();
BOOST_FOREACH(const CAddress &addr, vAddr)
pfrom->PushAddress(addr);
}
- else if (strCommand == "mempool")
+ else if (strCommand == NetMsgType::MEMPOOL)
{
- LOCK2(cs_main, pfrom->cs_filter);
+ if (!(pfrom->GetLocalServices() & NODE_BLOOM) && !pfrom->fWhitelisted)
+ {
+ LogPrint("net", "mempool request with bloom filters disabled, disconnect peer=%d\n", pfrom->GetId());
+ pfrom->fDisconnect = true;
+ return true;
+ }
- std::vector<uint256> vtxid;
- mempool.queryHashes(vtxid);
- vector<CInv> vInv;
- BOOST_FOREACH(uint256& hash, vtxid) {
- CInv inv(MSG_TX, hash);
- CTransaction tx;
- bool fInMemPool = mempool.lookup(hash, tx);
- if (!fInMemPool) continue; // another thread removed since queryHashes, maybe...
- if ((pfrom->pfilter && pfrom->pfilter->IsRelevantAndUpdate(tx)) ||
- (!pfrom->pfilter))
- vInv.push_back(inv);
- if (vInv.size() == MAX_INV_SZ) {
- pfrom->PushMessage("inv", vInv);
- vInv.clear();
- }
+ if (connman.OutboundTargetReached(false) && !pfrom->fWhitelisted)
+ {
+ LogPrint("net", "mempool request with bandwidth limit reached, disconnect peer=%d\n", pfrom->GetId());
+ pfrom->fDisconnect = true;
+ return true;
}
- if (vInv.size() > 0)
- pfrom->PushMessage("inv", vInv);
+
+ LOCK(pfrom->cs_inventory);
+ pfrom->fSendMempool = true;
}
- else if (strCommand == "ping")
+ else if (strCommand == NetMsgType::PING)
{
if (pfrom->nVersion > BIP0031_VERSION)
{
@@ -5022,12 +6055,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// it, if the remote node sends a ping once per second and this node takes 5
// seconds to respond to each, the 5th ping the remote sends would appear to
// return very quickly.
- pfrom->PushMessage("pong", nonce);
+ pfrom->PushMessage(NetMsgType::PONG, nonce);
}
}
- else if (strCommand == "pong")
+ else if (strCommand == NetMsgType::PONG)
{
int64_t pingUsecEnd = nTimeReceived;
uint64_t nonce = 0;
@@ -5084,77 +6117,54 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
- else if (fAlerts && strCommand == "alert")
- {
- CAlert alert;
- vRecv >> alert;
-
- uint256 alertHash = alert.GetHash();
- if (pfrom->setKnown.count(alertHash) == 0)
- {
- if (alert.ProcessAlert(chainparams.AlertKey()))
- {
- // Relay
- pfrom->setKnown.insert(alertHash);
- {
- LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodes)
- alert.RelayTo(pnode);
- }
- }
- else {
- // Small DoS penalty so peers that send us lots of
- // duplicate/expired/invalid-signature/whatever alerts
- // eventually get banned.
- // This isn't a Misbehaving(100) (immediate ban) because the
- // peer might be an older or different implementation with
- // a different signature key, etc.
- Misbehaving(pfrom->GetId(), 10);
- }
- }
- }
-
-
- else if (strCommand == "filterload")
+ else if (strCommand == NetMsgType::FILTERLOAD)
{
CBloomFilter filter;
vRecv >> filter;
if (!filter.IsWithinSizeConstraints())
+ {
// There is no excuse for sending a too-large filter
+ LOCK(cs_main);
Misbehaving(pfrom->GetId(), 100);
+ }
else
{
LOCK(pfrom->cs_filter);
delete pfrom->pfilter;
pfrom->pfilter = new CBloomFilter(filter);
pfrom->pfilter->UpdateEmptyFull();
+ pfrom->fRelayTxes = true;
}
- pfrom->fRelayTxes = true;
}
- else if (strCommand == "filteradd")
+ else if (strCommand == NetMsgType::FILTERADD)
{
vector<unsigned char> vData;
vRecv >> vData;
// Nodes must NEVER send a data item > 520 bytes (the max size for a script data object,
// and thus, the maximum size any matched object can have) in a filteradd message
- if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE)
- {
- Misbehaving(pfrom->GetId(), 100);
+ bool bad = false;
+ if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) {
+ bad = true;
} else {
LOCK(pfrom->cs_filter);
- if (pfrom->pfilter)
+ if (pfrom->pfilter) {
pfrom->pfilter->insert(vData);
- else
- Misbehaving(pfrom->GetId(), 100);
+ } else {
+ bad = true;
+ }
+ }
+ if (bad) {
+ LOCK(cs_main);
+ Misbehaving(pfrom->GetId(), 100);
}
}
- else if (strCommand == "filterclear")
+ else if (strCommand == NetMsgType::FILTERCLEAR)
{
LOCK(pfrom->cs_filter);
delete pfrom->pfilter;
@@ -5163,7 +6173,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
- else if (strCommand == "reject")
+ else if (strCommand == NetMsgType::REJECT)
{
if (fDebug) {
try {
@@ -5173,7 +6183,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
ostringstream ss;
ss << strMsg << " code " << itostr(ccode) << ": " << strReason;
- if (strMsg == "block" || strMsg == "tx")
+ if (strMsg == NetMsgType::BLOCK || strMsg == NetMsgType::TX)
{
uint256 hash;
vRecv >> hash;
@@ -5187,8 +6197,24 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
}
- else
- {
+ else if (strCommand == NetMsgType::FEEFILTER) {
+ CAmount newFeeFilter = 0;
+ vRecv >> newFeeFilter;
+ if (MoneyRange(newFeeFilter)) {
+ {
+ LOCK(pfrom->cs_feeFilter);
+ pfrom->minFeeFilter = newFeeFilter;
+ }
+ LogPrint("net", "received: feefilter of %s from peer=%d\n", CFeeRate(newFeeFilter).ToString(), pfrom->id);
+ }
+ }
+
+ else if (strCommand == NetMsgType::NOTFOUND) {
+ // We do not care about the NOTFOUND message, but logging an Unknown Command
+ // message would be undesirable as we transmit it ourselves.
+ }
+
+ else {
// Ignore unknown commands for extensibility
LogPrint("net", "Unknown command \"%s\" from peer=%d\n", SanitizeString(strCommand), pfrom->id);
}
@@ -5199,9 +6225,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
// requires LOCK(cs_vRecvMsg)
-bool ProcessMessages(CNode* pfrom)
+bool ProcessMessages(CNode* pfrom, CConnman& connman)
{
const CChainParams& chainparams = Params();
+ unsigned int nMaxSendBufferSize = connman.GetSendBufferSize();
//if (fDebug)
// LogPrintf("%s(%u messages)\n", __func__, pfrom->vRecvMsg.size());
@@ -5216,7 +6243,7 @@ bool ProcessMessages(CNode* pfrom)
bool fOk = true;
if (!pfrom->vRecvGetData.empty())
- ProcessGetData(pfrom, chainparams.GetConsensus());
+ ProcessGetData(pfrom, chainparams.GetConsensus(), connman);
// this maintains the order of responses
if (!pfrom->vRecvGetData.empty()) return fOk;
@@ -5224,7 +6251,7 @@ bool ProcessMessages(CNode* pfrom)
std::deque<CNetMessage>::iterator it = pfrom->vRecvMsg.begin();
while (!pfrom->fDisconnect && it != pfrom->vRecvMsg.end()) {
// Don't bother if send buffer is too full to respond anyway
- if (pfrom->nSendSize >= SendBufferSize())
+ if (pfrom->nSendSize >= nMaxSendBufferSize)
break;
// get next message
@@ -5243,7 +6270,7 @@ bool ProcessMessages(CNode* pfrom)
it++;
// Scan for message start
- if (memcmp(msg.hdr.pchMessageStart, chainparams.MessageStart(), MESSAGE_START_SIZE) != 0) {
+ if (memcmp(msg.hdr.pchMessageStart, chainparams.MessageStart(), CMessageHeader::MESSAGE_START_SIZE) != 0) {
LogPrintf("PROCESSMESSAGE: INVALID MESSAGESTART %s peer=%d\n", SanitizeString(msg.hdr.GetCommand()), pfrom->id);
fOk = false;
break;
@@ -5264,11 +6291,12 @@ bool ProcessMessages(CNode* pfrom)
// Checksum
CDataStream& vRecv = msg.vRecv;
uint256 hash = Hash(vRecv.begin(), vRecv.begin() + nMessageSize);
- unsigned int nChecksum = ReadLE32((unsigned char*)&hash);
- if (nChecksum != hdr.nChecksum)
+ if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0)
{
- LogPrintf("%s(%s, %u bytes): CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n", __func__,
- SanitizeString(strCommand), nMessageSize, nChecksum, hdr.nChecksum);
+ LogPrintf("%s(%s, %u bytes): CHECKSUM ERROR expected %s was %s\n", __func__,
+ SanitizeString(strCommand), nMessageSize,
+ HexStr(hash.begin(), hash.begin()+CMessageHeader::CHECKSUM_SIZE),
+ HexStr(hdr.pchChecksum, hdr.pchChecksum+CMessageHeader::CHECKSUM_SIZE));
continue;
}
@@ -5276,12 +6304,12 @@ bool ProcessMessages(CNode* pfrom)
bool fRet = false;
try
{
- fRet = ProcessMessage(pfrom, strCommand, vRecv, msg.nTime);
+ fRet = ProcessMessage(pfrom, strCommand, vRecv, msg.nTime, chainparams, connman);
boost::this_thread::interruption_point();
}
catch (const std::ios_base::failure& e)
{
- pfrom->PushMessage("reject", strCommand, REJECT_MALFORMED, string("error parsing message"));
+ pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_MALFORMED, string("error parsing message"));
if (strstr(e.what(), "end of data"))
{
// Allow exceptions from under-length message on vRecv
@@ -5292,6 +6320,11 @@ bool ProcessMessages(CNode* pfrom)
// Allow exceptions from over-long size
LogPrintf("%s(%s, %u bytes): Exception '%s' caught\n", __func__, SanitizeString(strCommand), nMessageSize, e.what());
}
+ else if (strstr(e.what(), "non-canonical ReadCompactSize()"))
+ {
+ // Allow exceptions from non-canonical encoding
+ LogPrintf("%s(%s, %u bytes): Exception '%s' caught\n", __func__, SanitizeString(strCommand), nMessageSize, e.what());
+ }
else
{
PrintExceptionContinue(&e, "ProcessMessages()");
@@ -5319,8 +6352,24 @@ bool ProcessMessages(CNode* pfrom)
return fOk;
}
+class CompareInvMempoolOrder
+{
+ CTxMemPool *mp;
+public:
+ CompareInvMempoolOrder(CTxMemPool *_mempool)
+ {
+ mp = _mempool;
+ }
-bool SendMessages(CNode* pto, bool fSendTrickle)
+ bool operator()(std::set<uint256>::iterator a, std::set<uint256>::iterator b)
+ {
+ /* As std::make_heap produces a max-heap, we want the entries with the
+ * fewest ancestors/highest fee to sort later. */
+ return mp->CompareDepthAndScore(*b, *a);
+ }
+};
+
+bool SendMessages(CNode* pto, CConnman& connman)
{
const Consensus::Params& consensusParams = Params().GetConsensus();
{
@@ -5340,7 +6389,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
// Ping automatically sent as a latency probe & keepalive.
pingSend = true;
}
- if (pingSend) {
+ if (pingSend && !pto->fDisconnect) {
uint64_t nonce = 0;
while (nonce == 0) {
GetRandBytes((unsigned char*)&nonce, sizeof(nonce));
@@ -5349,11 +6398,11 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
pto->nPingUsecStart = GetTimeMicros();
if (pto->nVersion > BIP0031_VERSION) {
pto->nPingNonceSent = nonce;
- pto->PushMessage("ping", nonce);
+ pto->PushMessage(NetMsgType::PING, nonce);
} else {
// Peer is too old to support ping command with nonce, pong will never arrive.
pto->nPingNonceSent = 0;
- pto->PushMessage("ping");
+ pto->PushMessage(NetMsgType::PING);
}
}
@@ -5362,28 +6411,17 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
return true;
// Address refresh broadcast
- static int64_t nLastRebroadcast;
- if (!IsInitialBlockDownload() && (GetTime() - nLastRebroadcast > 24 * 60 * 60))
- {
- LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodes)
- {
- // Periodically clear addrKnown to allow refresh broadcasts
- if (nLastRebroadcast)
- pnode->addrKnown.reset();
-
- // Rebroadcast our address
- AdvertizeLocal(pnode);
- }
- if (!vNodes.empty())
- nLastRebroadcast = GetTime();
+ int64_t nNow = GetTimeMicros();
+ if (!IsInitialBlockDownload() && pto->nNextLocalAddrSend < nNow) {
+ AdvertiseLocal(pto);
+ pto->nNextLocalAddrSend = PoissonNextSend(nNow, AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL);
}
//
// Message: addr
//
- if (fSendTrickle)
- {
+ if (pto->nNextAddrSend < nNow) {
+ pto->nNextAddrSend = PoissonNextSend(nNow, AVG_ADDRESS_BROADCAST_INTERVAL);
vector<CAddress> vAddr;
vAddr.reserve(pto->vAddrToSend.size());
BOOST_FOREACH(const CAddress& addr, pto->vAddrToSend)
@@ -5395,14 +6433,17 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
// receiver rejects addr messages larger than 1000
if (vAddr.size() >= 1000)
{
- pto->PushMessage("addr", vAddr);
+ pto->PushMessage(NetMsgType::ADDR, vAddr);
vAddr.clear();
}
}
}
pto->vAddrToSend.clear();
if (!vAddr.empty())
- pto->PushMessage("addr", vAddr);
+ pto->PushMessage(NetMsgType::ADDR, vAddr);
+ // we only send the big addr message once
+ if (pto->vAddrToSend.capacity() > 40)
+ pto->vAddrToSend.shrink_to_fit();
}
CNodeState &state = *State(pto->GetId());
@@ -5415,21 +6456,21 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
LogPrintf("Warning: not banning local peer %s!\n", pto->addr.ToString());
else
{
- CNode::Ban(pto->addr, BanReasonNodeMisbehaving);
+ connman.Ban(pto->addr, BanReasonNodeMisbehaving);
}
}
state.fShouldBan = false;
}
BOOST_FOREACH(const CBlockReject& reject, state.rejects)
- pto->PushMessage("reject", (string)"block", reject.chRejectCode, reject.strRejectReason, reject.hashBlock);
+ pto->PushMessage(NetMsgType::REJECT, (string)NetMsgType::BLOCK, reject.chRejectCode, reject.strRejectReason, reject.hashBlock);
state.rejects.clear();
// Start block sync
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 && !fImporting && !fReindex) {
+ if (!state.fSyncStarted && !pto->fClient && !pto->fDisconnect && !fImporting && !fReindex) {
// Only actively request headers from a single peer, unless we're close to today.
if ((nSyncStarted == 0 && fFetch) || pindexBestHeader->GetBlockTime() > GetAdjustedTime() - 24 * 60 * 60) {
state.fSyncStarted = true;
@@ -5445,7 +6486,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
if (pindexStart->pprev)
pindexStart = pindexStart->pprev;
LogPrint("net", "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->id, pto->nStartingHeight);
- pto->PushMessage("getheaders", chainActive.GetLocator(pindexStart), uint256());
+ pto->PushMessage(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexStart), uint256());
}
}
@@ -5454,7 +6495,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
// transactions become unconfirmed and spams other nodes.
if (!fReindex && !fImporting && !IsInitialBlockDownload())
{
- GetMainSignals().Broadcast(nTimeBestReceived);
+ GetMainSignals().Broadcast(nTimeBestReceived, &connman);
}
//
@@ -5470,7 +6511,9 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
// add all to the inv queue.
LOCK(pto->cs_inventory);
vector<CBlock> vHeaders;
- bool fRevertToInv = (!state.fPreferHeaders || pto->vBlockHashesToAnnounce.size() > MAX_BLOCKS_TO_ANNOUNCE);
+ bool fRevertToInv = ((!state.fPreferHeaders &&
+ (!state.fPreferHeaderAndIDs || pto->vBlockHashesToAnnounce.size() > 1)) ||
+ pto->vBlockHashesToAnnounce.size() > MAX_BLOCKS_TO_ANNOUNCE);
CBlockIndex *pBestIndex = NULL; // last header queued for delivery
ProcessBlockAvailability(pto->id); // ensure pindexBestKnownBlock is up-to-date
@@ -5488,7 +6531,21 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
fRevertToInv = true;
break;
}
- assert(pBestIndex == NULL || pindex->pprev == pBestIndex);
+ if (pBestIndex != NULL && pindex->pprev != pBestIndex) {
+ // This means that the list of blocks to announce don't
+ // connect to each other.
+ // This shouldn't really be possible to hit during
+ // regular operation (because reorgs should take us to
+ // a chain that has some block not on the prior chain,
+ // which should be caught by the prior check), but one
+ // way this could happen is by using invalidateblock /
+ // reconsiderblock repeatedly on the tip, causing it to
+ // be added multiple times to vBlockHashesToAnnounce.
+ // Robustly deal with this rare situation by reverting
+ // to an inv.
+ fRevertToInv = true;
+ break;
+ }
pBestIndex = pindex;
if (fFoundStartingHeader) {
// add this to the headers message
@@ -5508,6 +6565,33 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
}
}
}
+ if (!fRevertToInv && !vHeaders.empty()) {
+ if (vHeaders.size() == 1 && state.fPreferHeaderAndIDs) {
+ // We only send up to 1 block as header-and-ids, as otherwise
+ // probably means we're doing an initial-ish-sync or they're slow
+ LogPrint("net", "%s sending header-and-ids %s to peer %d\n", __func__,
+ vHeaders.front().GetHash().ToString(), pto->id);
+ //TODO: Shouldn't need to reload block from disk, but requires refactor
+ CBlock block;
+ assert(ReadBlockFromDisk(block, pBestIndex, consensusParams));
+ CBlockHeaderAndShortTxIDs cmpctblock(block, state.fWantsCmpctWitness);
+ pto->PushMessageWithFlag(state.fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::CMPCTBLOCK, cmpctblock);
+ state.pindexBestHeaderSent = pBestIndex;
+ } else if (state.fPreferHeaders) {
+ if (vHeaders.size() > 1) {
+ LogPrint("net", "%s: %u headers, range (%s, %s), to peer=%d\n", __func__,
+ vHeaders.size(),
+ vHeaders.front().GetHash().ToString(),
+ vHeaders.back().GetHash().ToString(), pto->id);
+ } else {
+ LogPrint("net", "%s: sending header %s to peer=%d\n", __func__,
+ vHeaders.front().GetHash().ToString(), pto->id);
+ }
+ pto->PushMessage(NetMsgType::HEADERS, vHeaders);
+ state.pindexBestHeaderSent = pBestIndex;
+ } else
+ fRevertToInv = true;
+ }
if (fRevertToInv) {
// If falling back to using an inv, just try to inv the tip.
// The last entry in vBlockHashesToAnnounce was our tip at some point
@@ -5526,27 +6610,13 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
hashToAnnounce.ToString(), chainActive.Tip()->GetBlockHash().ToString());
}
- // If the peer announced this block to us, don't inv it back.
- // (Since block announcements may not be via inv's, we can't solely rely on
- // setInventoryKnown to track this.)
+ // If the peer's chain has this block, don't inv it back.
if (!PeerHasHeader(&state, pindex)) {
pto->PushInventory(CInv(MSG_BLOCK, hashToAnnounce));
LogPrint("net", "%s: sending inv peer=%d hash=%s\n", __func__,
pto->id, hashToAnnounce.ToString());
}
}
- } else if (!vHeaders.empty()) {
- if (vHeaders.size() > 1) {
- LogPrint("net", "%s: %u headers, range (%s, %s), to peer=%d\n", __func__,
- vHeaders.size(),
- vHeaders.front().GetHash().ToString(),
- vHeaders.back().GetHash().ToString(), pto->id);
- } else {
- LogPrint("net", "%s: sending header %s to peer=%d\n", __func__,
- vHeaders.front().GetHash().ToString(), pto->id);
- }
- pto->PushMessage("headers", vHeaders);
- state.pindexBestHeaderSent = pBestIndex;
}
pto->vBlockHashesToAnnounce.clear();
}
@@ -5555,52 +6625,138 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
// Message: inventory
//
vector<CInv> vInv;
- vector<CInv> vInvWait;
{
LOCK(pto->cs_inventory);
- vInv.reserve(pto->vInventoryToSend.size());
- vInvWait.reserve(pto->vInventoryToSend.size());
- BOOST_FOREACH(const CInv& inv, pto->vInventoryToSend)
- {
- if (pto->setInventoryKnown.count(inv))
- continue;
+ vInv.reserve(std::max<size_t>(pto->vInventoryBlockToSend.size(), INVENTORY_BROADCAST_MAX));
+
+ // Add blocks
+ BOOST_FOREACH(const uint256& hash, pto->vInventoryBlockToSend) {
+ vInv.push_back(CInv(MSG_BLOCK, hash));
+ if (vInv.size() == MAX_INV_SZ) {
+ pto->PushMessage(NetMsgType::INV, vInv);
+ vInv.clear();
+ }
+ }
+ pto->vInventoryBlockToSend.clear();
+
+ // Check whether periodic sends should happen
+ bool fSendTrickle = pto->fWhitelisted;
+ if (pto->nNextInvSend < nNow) {
+ fSendTrickle = true;
+ // Use half the delay for outbound peers, as there is less privacy concern for them.
+ pto->nNextInvSend = PoissonNextSend(nNow, INVENTORY_BROADCAST_INTERVAL >> !pto->fInbound);
+ }
- // trickle out tx inv to protect privacy
- if (inv.type == MSG_TX && !fSendTrickle)
+ // Time to send but the peer has requested we not relay transactions.
+ if (fSendTrickle) {
+ LOCK(pto->cs_filter);
+ if (!pto->fRelayTxes) pto->setInventoryTxToSend.clear();
+ }
+
+ // Respond to BIP35 mempool requests
+ if (fSendTrickle && pto->fSendMempool) {
+ auto vtxinfo = mempool.infoAll();
+ pto->fSendMempool = false;
+ CAmount filterrate = 0;
{
- // 1/4 of tx invs blast to all immediately
- static uint256 hashSalt;
- if (hashSalt.IsNull())
- hashSalt = GetRandHash();
- uint256 hashRand = ArithToUint256(UintToArith256(inv.hash) ^ UintToArith256(hashSalt));
- hashRand = Hash(BEGIN(hashRand), END(hashRand));
- bool fTrickleWait = ((UintToArith256(hashRand) & 3) != 0);
-
- if (fTrickleWait)
- {
- vInvWait.push_back(inv);
- continue;
+ LOCK(pto->cs_feeFilter);
+ filterrate = pto->minFeeFilter;
+ }
+
+ LOCK(pto->cs_filter);
+
+ for (const auto& txinfo : vtxinfo) {
+ const uint256& hash = txinfo.tx->GetHash();
+ CInv inv(MSG_TX, hash);
+ pto->setInventoryTxToSend.erase(hash);
+ if (filterrate) {
+ if (txinfo.feeRate.GetFeePerK() < filterrate)
+ continue;
+ }
+ if (pto->pfilter) {
+ if (!pto->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue;
+ }
+ pto->filterInventoryKnown.insert(hash);
+ vInv.push_back(inv);
+ if (vInv.size() == MAX_INV_SZ) {
+ pto->PushMessage(NetMsgType::INV, vInv);
+ vInv.clear();
}
}
+ pto->timeLastMempoolReq = GetTime();
+ }
- // returns true if wasn't already contained in the set
- if (pto->setInventoryKnown.insert(inv).second)
+ // Determine transactions to relay
+ if (fSendTrickle) {
+ // Produce a vector with all candidates for sending
+ vector<std::set<uint256>::iterator> vInvTx;
+ vInvTx.reserve(pto->setInventoryTxToSend.size());
+ for (std::set<uint256>::iterator it = pto->setInventoryTxToSend.begin(); it != pto->setInventoryTxToSend.end(); it++) {
+ vInvTx.push_back(it);
+ }
+ CAmount filterrate = 0;
{
- vInv.push_back(inv);
- if (vInv.size() >= 1000)
+ LOCK(pto->cs_feeFilter);
+ filterrate = pto->minFeeFilter;
+ }
+ // Topologically and fee-rate sort the inventory we send for privacy and priority reasons.
+ // A heap is used so that not all items need sorting if only a few are being sent.
+ CompareInvMempoolOrder compareInvMempoolOrder(&mempool);
+ std::make_heap(vInvTx.begin(), vInvTx.end(), compareInvMempoolOrder);
+ // No reason to drain out at many times the network's capacity,
+ // especially since we have many peers and some will draw much shorter delays.
+ unsigned int nRelayedTransactions = 0;
+ LOCK(pto->cs_filter);
+ while (!vInvTx.empty() && nRelayedTransactions < INVENTORY_BROADCAST_MAX) {
+ // Fetch the top element from the heap
+ std::pop_heap(vInvTx.begin(), vInvTx.end(), compareInvMempoolOrder);
+ std::set<uint256>::iterator it = vInvTx.back();
+ vInvTx.pop_back();
+ uint256 hash = *it;
+ // Remove it from the to-be-sent set
+ pto->setInventoryTxToSend.erase(it);
+ // Check if not in the filter already
+ if (pto->filterInventoryKnown.contains(hash)) {
+ continue;
+ }
+ // Not in the mempool anymore? don't bother sending it.
+ auto txinfo = mempool.info(hash);
+ if (!txinfo.tx) {
+ continue;
+ }
+ if (filterrate && txinfo.feeRate.GetFeePerK() < filterrate) {
+ continue;
+ }
+ if (pto->pfilter && !pto->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue;
+ // Send
+ vInv.push_back(CInv(MSG_TX, hash));
+ nRelayedTransactions++;
{
- pto->PushMessage("inv", vInv);
+ // Expire old relay messages
+ while (!vRelayExpiration.empty() && vRelayExpiration.front().first < nNow)
+ {
+ mapRelay.erase(vRelayExpiration.front().second);
+ vRelayExpiration.pop_front();
+ }
+
+ auto ret = mapRelay.insert(std::make_pair(hash, std::move(txinfo.tx)));
+ if (ret.second) {
+ vRelayExpiration.push_back(std::make_pair(nNow + 15 * 60 * 1000000, ret.first));
+ }
+ }
+ if (vInv.size() == MAX_INV_SZ) {
+ pto->PushMessage(NetMsgType::INV, vInv);
vInv.clear();
}
+ pto->filterInventoryKnown.insert(hash);
}
}
- pto->vInventoryToSend = vInvWait;
}
if (!vInv.empty())
- pto->PushMessage("inv", vInv);
+ pto->PushMessage(NetMsgType::INV, vInv);
// Detect whether we're stalling
- int64_t nNow = GetTimeMicros();
+ nNow = GetTimeMicros();
if (!pto->fDisconnect && state.nStallingSince && state.nStallingSince < nNow - 1000000 * BLOCK_STALLING_TIMEOUT) {
// Stalling only triggers when the block download window cannot move. During normal steady state,
// the download window should be much larger than the to-be-downloaded set of blocks, so disconnection
@@ -5608,24 +6764,15 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
LogPrintf("Peer=%d is stalling block download, disconnecting\n", pto->id);
pto->fDisconnect = true;
}
- // 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
+ // 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 peers from which we're downloading validated blocks), disconnect due to timeout.
+ // We compensate for other peers to prevent killing off peers due to our own downstream link
// being saturated. We only count validated in-flight blocks so peers can't advertise non-existing block hashes
// to unreasonably increase our timeout.
- // 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) {
+ int nOtherPeersWithValidatedDownloads = nPeersWithValidatedDownloads - (state.nBlocksInFlightValidHeaders > 0);
+ if (nNow > state.nDownloadingSince + consensusParams.nPowTargetSpacing * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) {
LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", queuedBlock.hash.ToString(), pto->id);
pto->fDisconnect = true;
}
@@ -5638,9 +6785,10 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
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);
+ FindNextBlocksToDownload(pto->GetId(), MAX_BLOCKS_IN_TRANSIT_PER_PEER - state.nBlocksInFlight, vToDownload, staller, consensusParams);
BOOST_FOREACH(CBlockIndex *pindex, vToDownload) {
- vGetData.push_back(CInv(MSG_BLOCK, pindex->GetBlockHash()));
+ uint32_t nFetchFlags = GetFetchFlags(pto, pindex->pprev, consensusParams);
+ vGetData.push_back(CInv(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash()));
MarkBlockAsInFlight(pto->GetId(), pindex->GetBlockHash(), consensusParams, pindex);
LogPrint("net", "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(),
pindex->nHeight, pto->id);
@@ -5666,7 +6814,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
vGetData.push_back(inv);
if (vGetData.size() >= 1000)
{
- pto->PushMessage("getdata", vGetData);
+ pto->PushMessage(NetMsgType::GETDATA, vGetData);
vGetData.clear();
}
} else {
@@ -5676,8 +6824,31 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
pto->mapAskFor.erase(pto->mapAskFor.begin());
}
if (!vGetData.empty())
- pto->PushMessage("getdata", vGetData);
+ pto->PushMessage(NetMsgType::GETDATA, vGetData);
+ //
+ // Message: feefilter
+ //
+ // We don't want white listed peers to filter txs to us if we have -whitelistforcerelay
+ if (pto->nVersion >= FEEFILTER_VERSION && GetBoolArg("-feefilter", DEFAULT_FEEFILTER) &&
+ !(pto->fWhitelisted && GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY))) {
+ CAmount currentFilter = mempool.GetMinFee(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000).GetFeePerK();
+ int64_t timeNow = GetTimeMicros();
+ if (timeNow > pto->nextSendTimeFeeFilter) {
+ CAmount filterToSend = filterRounder.round(currentFilter);
+ if (filterToSend != pto->lastSentFeeFilter) {
+ pto->PushMessage(NetMsgType::FEEFILTER, filterToSend);
+ pto->lastSentFeeFilter = filterToSend;
+ }
+ pto->nextSendTimeFeeFilter = PoissonNextSend(timeNow, AVG_FEEFILTER_BROADCAST_INTERVAL);
+ }
+ // If the fee filter has changed substantially and it's still more than MAX_FEEFILTER_CHANGE_DELAY
+ // until scheduled broadcast, then move the broadcast to within MAX_FEEFILTER_CHANGE_DELAY.
+ else if (timeNow + MAX_FEEFILTER_CHANGE_DELAY * 1000000 < pto->nextSendTimeFeeFilter &&
+ (currentFilter < 3 * pto->lastSentFeeFilter / 4 || currentFilter > 4 * pto->lastSentFeeFilter / 3)) {
+ pto->nextSendTimeFeeFilter = timeNow + (insecure_rand() % MAX_FEEFILTER_CHANGE_DELAY) * 1000000;
+ }
+ }
}
return true;
}
@@ -5686,7 +6857,11 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
return strprintf("CBlockFileInfo(blocks=%u, size=%u, heights=%u...%u, time=%s...%s)", nBlocks, nSize, nHeightFirst, nHeightLast, DateTimeStrFormat("%Y-%m-%d", nTimeFirst), DateTimeStrFormat("%Y-%m-%d", nTimeLast));
}
-
+ThresholdState VersionBitsTipState(const Consensus::Params& params, Consensus::DeploymentPos pos)
+{
+ LOCK(cs_main);
+ return VersionBitsState(chainActive.Tip(), params, pos, versionbitscache);
+}
class CMainCleanup
{
diff --git a/src/main.h b/src/main.h
index 19623f4d96..2646d8f86b 100644
--- a/src/main.h
+++ b/src/main.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -16,6 +16,7 @@
#include "net.h"
#include "script/script_error.h"
#include "sync.h"
+#include "versionbits.h"
#include <algorithm>
#include <exception>
@@ -33,21 +34,34 @@ class CBlockTreeDB;
class CBloomFilter;
class CChainParams;
class CInv;
+class CConnman;
class CScriptCheck;
class CTxMemPool;
class CValidationInterface;
class CValidationState;
+struct PrecomputedTransactionData;
struct CNodeStateStats;
+struct LockPoints;
-/** Default for accepting alerts from the P2P network. */
-static const bool DEFAULT_ALERTS = true;
-/** Default for DEFAULT_WHITELISTALWAYSRELAY. */
-static const bool DEFAULT_WHITELISTALWAYSRELAY = true;
+/** Default for DEFAULT_WHITELISTRELAY. */
+static const bool DEFAULT_WHITELISTRELAY = true;
+/** Default for DEFAULT_WHITELISTFORCERELAY. */
+static const bool DEFAULT_WHITELISTFORCERELAY = true;
/** Default for -minrelaytxfee, minimum relay fee for transactions */
static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;
+//! -maxtxfee default
+static const CAmount DEFAULT_TRANSACTION_MAXFEE = 0.1 * COIN;
+//! Discourage users to set fees higher than this amount (in satoshis) per kB
+static const CAmount HIGH_TX_FEE_PER_KB = 0.01 * COIN;
+//! -maxtxfee will warn if called with a higher fee than this amount (in satoshis)
+static const CAmount HIGH_MAX_TX_FEE = 100 * HIGH_TX_FEE_PER_KB;
/** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
+/** Expiration time for orphan transactions in seconds */
+static const int64_t ORPHAN_TX_EXPIRE_TIME = 20 * 60;
+/** Minimum time between orphan transactions expire time checks in seconds */
+static const int64_t ORPHAN_TX_EXPIRE_INTERVAL = 5 * 60;
/** Default for -limitancestorcount, max number of in-mempool ancestors */
static const unsigned int DEFAULT_ANCESTOR_LIMIT = 25;
/** Default for -limitancestorsize, maximum kilobytes of tx + all in-mempool ancestors */
@@ -87,8 +101,28 @@ static const unsigned int DATABASE_WRITE_INTERVAL = 60 * 60;
static const unsigned int DATABASE_FLUSH_INTERVAL = 24 * 60 * 60;
/** Maximum length of reject messages. */
static const unsigned int MAX_REJECT_MESSAGE_LENGTH = 111;
+/** Average delay between local address broadcasts in seconds. */
+static const unsigned int AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL = 24 * 24 * 60;
+/** Average delay between peer address broadcasts in seconds. */
+static const unsigned int AVG_ADDRESS_BROADCAST_INTERVAL = 30;
+/** Average delay between trickled inventory transmissions in seconds.
+ * Blocks and whitelisted receivers bypass this, outbound peers get half this delay. */
+static const unsigned int INVENTORY_BROADCAST_INTERVAL = 5;
+/** Maximum number of inventory items to send per transmission.
+ * Limits the impact of low-fee transaction floods. */
+static const unsigned int INVENTORY_BROADCAST_MAX = 7 * INVENTORY_BROADCAST_INTERVAL;
+/** Average delay between feefilter broadcasts in seconds. */
+static const unsigned int AVG_FEEFILTER_BROADCAST_INTERVAL = 10 * 60;
+/** Maximum feefilter broadcast delay after significant change. */
+static const unsigned int MAX_FEEFILTER_CHANGE_DELAY = 5 * 60;
+/** Block download timeout base, expressed in millionths of the block interval (i.e. 10 min) */
+static const int64_t BLOCK_DOWNLOAD_TIMEOUT_BASE = 1000000;
+/** Additional block download timeout per parallel downloading peer (i.e. 5 min) */
+static const int64_t BLOCK_DOWNLOAD_TIMEOUT_PER_PEER = 500000;
+
static const unsigned int DEFAULT_LIMITFREERELAY = 15;
static const bool DEFAULT_RELAYPRIORITY = true;
+static const int64_t DEFAULT_MAX_TIP_AGE = 24 * 60 * 60;
/** Default for -permitbaremultisig */
static const bool DEFAULT_PERMIT_BAREMULTISIG = true;
@@ -97,10 +131,19 @@ static const bool DEFAULT_TXINDEX = false;
static const unsigned int DEFAULT_BANSCORE_THRESHOLD = 100;
static const bool DEFAULT_TESTSAFEMODE = false;
+/** Default for -mempoolreplacement */
+static const bool DEFAULT_ENABLE_REPLACEMENT = true;
+/** Default for using fee filter */
+static const bool DEFAULT_FEEFILTER = true;
/** Maximum number of headers to announce when relaying blocks with headers message.*/
static const unsigned int MAX_BLOCKS_TO_ANNOUNCE = 8;
+/** Maximum number of unconnecting headers announcements before DoS score */
+static const int MAX_UNCONNECTING_HEADERS = 10;
+
+static const bool DEFAULT_PEERBLOOMFILTERS = true;
+
struct BlockHasher
{
size_t operator()(const uint256& hash) const { return hash.GetCheapHash(); }
@@ -113,6 +156,7 @@ typedef boost::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
extern BlockMap mapBlockIndex;
extern uint64_t nLastBlockTx;
extern uint64_t nLastBlockSize;
+extern uint64_t nLastBlockWeight;
extern const std::string strMessageMagic;
extern CWaitableCriticalSection csBestBlock;
extern CConditionVariable cvBlockChange;
@@ -125,8 +169,13 @@ extern bool fRequireStandard;
extern bool fCheckBlockIndex;
extern bool fCheckpointsEnabled;
extern size_t nCoinCacheUsage;
+/** A fee rate smaller than this is considered zero fee (for relaying, mining and transaction creation) */
extern CFeeRate minRelayTxFee;
-extern bool fAlerts;
+/** Absolute maximum transaction fee (in satoshis) used by wallet and mempool (rejects high fee in sendrawtransaction) */
+extern CAmount maxTxFee;
+/** If the tip is older than this (in seconds), the node is considered to be in initial block download. */
+extern int64_t nMaxTipAge;
+extern bool fEnableReplacement;
/** Best header we've seen so far (used for getheaders queries' starting points). */
extern CBlockIndex *pindexBestHeader;
@@ -144,7 +193,7 @@ 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;
-static const signed int DEFAULT_CHECKBLOCKS = MIN_BLOCKS_TO_KEEP;
+static const signed int DEFAULT_CHECKBLOCKS = 6;
static const unsigned int DEFAULT_CHECKLEVEL = 3;
// Require that user allocate at least 550MB for block & undo files (blk???.dat and rev???.dat)
@@ -167,14 +216,14 @@ void UnregisterNodeSignals(CNodeSignals& nodeSignals);
* block is made active. Note that it does not, however, guarantee that the
* specific block passed to it has been checked for validity!
*
- * @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[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 reorganization; 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.
+ * @param[out] dbp The already known disk position of pblock, or NULL if not yet stored.
* @return True if state.IsValid()
*/
-bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, const CNode* pfrom, const CBlock* pblock, bool fForceProcessing, CDiskBlockPos* dbp);
+bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, CNode* pfrom, const CBlock* pblock, bool fForceProcessing, const CDiskBlockPos* dbp, CConnman* connman);
/** Check whether enough disk space is available for an incoming block */
bool CheckDiskSpace(uint64_t nAdditionalBytes = 0);
/** Open a block file (blk?????.dat) */
@@ -192,18 +241,16 @@ bool LoadBlockIndex();
/** Unload database information */
void UnloadBlockIndex();
/** Process protocol messages received from a given node */
-bool ProcessMessages(CNode* pfrom);
+bool ProcessMessages(CNode* pfrom, CConnman& connman);
/**
* Send queued protocol messages to be sent to a give node.
*
* @param[in] pto The node which we are sending messages to.
- * @param[in] fSendTrickle When true send the trickled data, otherwise trickle the data until true.
+ * @param[in] connman The connection manager for that node.
*/
-bool SendMessages(CNode* pto, bool fSendTrickle);
+bool SendMessages(CNode* pto, CConnman& connman);
/** 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.
@@ -217,7 +264,7 @@ 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, const Consensus::Params& params, uint256 &hashBlock, bool fAllowSlow = false);
/** Find the best known block, and make it the tip of the block chain */
-bool ActivateBestChain(CValidationState& state, const CChainParams& chainparams, const CBlock* pblock = NULL);
+bool ActivateBestChain(CValidationState& state, const CChainParams& chainparams, const CBlock* pblock = NULL, CConnman* connman = NULL);
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
/**
@@ -255,11 +302,14 @@ void PruneAndFlush();
/** (try to) add transaction to memory pool **/
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,
- bool* pfMissingInputs, bool fOverrideMempoolLimit=false, bool fRejectAbsurdFee=false);
+ bool* pfMissingInputs, bool fOverrideMempoolLimit=false, const CAmount nAbsurdFee=0);
/** Convert CValidationState to a human-readable message for logging */
std::string FormatStateMessage(const CValidationState &state);
+/** Get the BIP9 state for a given deployment at the current tip. */
+ThresholdState VersionBitsTipState(const Consensus::Params& params, Consensus::DeploymentPos pos);
+
struct CNodeStateStats {
int nMisbehavior;
int nSyncHeight;
@@ -267,33 +317,7 @@ struct CNodeStateStats {
std::vector<int> vHeightInFlight;
};
-struct CDiskTxPos : public CDiskBlockPos
-{
- unsigned int nTxOffset; // after header
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(*(CDiskBlockPos*)this);
- READWRITE(VARINT(nTxOffset));
- }
-
- CDiskTxPos(const CDiskBlockPos &blockIn, unsigned int nTxOffsetIn) : CDiskBlockPos(blockIn.nFile, blockIn.nPos), nTxOffset(nTxOffsetIn) {
- }
-
- CDiskTxPos() {
- SetNull();
- }
-
- void SetNull() {
- CDiskBlockPos::SetNull();
- nTxOffset = 0;
- }
-};
-
-CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowFree);
/**
* Count ECDSA signature operations the old-fashioned (pre-0.6) way
@@ -311,6 +335,14 @@ unsigned int GetLegacySigOpCount(const CTransaction& tx);
*/
unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& mapInputs);
+/**
+ * Compute total signature operation cost of a transaction.
+ * @param[in] tx Transaction for which we are computing the cost
+ * @param[in] inputs Map of previous transactions that have outputs we're spending
+ * @param[out] flags Script verification flags
+ * @return Total signature operation cost of tx
+ */
+int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, int flags);
/**
* Check whether all inputs of this transaction are valid (no double spends, scripts & sigs, amounts)
@@ -318,14 +350,27 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& ma
* instead of being performed inline.
*/
bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &view, bool fScriptChecks,
- unsigned int flags, bool cacheStore, std::vector<CScriptCheck> *pvChecks = NULL);
+ unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, std::vector<CScriptCheck> *pvChecks = NULL);
/** Apply the effects of this transaction on the UTXO set represented by view */
-void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, int nHeight);
+void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight);
+
+/** Transaction validation functions */
/** Context-independent validity checks */
bool CheckTransaction(const CTransaction& tx, CValidationState& state);
+namespace Consensus {
+
+/**
+ * Check whether all inputs of this transaction are valid (no double spends and amounts)
+ * This does not modify the UTXO set. This does not check scripts and sigs.
+ * Preconditions: tx.IsCoinBase() is false.
+ */
+bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight);
+
+} // namespace Consensus
+
/**
* Check if transaction is final and can be included in a block with the
* specified height and time. Consensus critical.
@@ -341,7 +386,31 @@ bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime);
*/
bool CheckFinalTx(const CTransaction &tx, int flags = -1);
-/**
+/**
+ * Test whether the LockPoints height and time are still valid on the current chain
+ */
+bool TestLockPointValidity(const LockPoints* lp);
+
+/**
+ * Check if transaction is final per BIP 68 sequence numbers and can be included in a block.
+ * Consensus critical. Takes as input a list of heights at which tx's inputs (in order) confirmed.
+ */
+bool SequenceLocks(const CTransaction &tx, int flags, std::vector<int>* prevHeights, const CBlockIndex& block);
+
+/**
+ * Check if transaction will be BIP 68 final in the next block to be created.
+ *
+ * Simulates calling SequenceLocks() with data from the tip of the current active chain.
+ * Optionally stores in LockPoints the resulting height and time calculated and the hash
+ * of the block needed for calculation or skips the calculation and uses the LockPoints
+ * passed in for evaluation.
+ * The LockPoints should not be considered valid if CheckSequenceLocks returns false.
+ *
+ * See consensus/consensus.h for flag definitions.
+ */
+bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp = NULL, bool useExistingLockPoints = false);
+
+/**
* Closure representing one script verification
* Note that this stores references to the spending transaction
*/
@@ -349,27 +418,31 @@ class CScriptCheck
{
private:
CScript scriptPubKey;
+ CAmount amount;
const CTransaction *ptxTo;
unsigned int nIn;
unsigned int nFlags;
bool cacheStore;
ScriptError error;
+ PrecomputedTransactionData *txdata;
public:
- CScriptCheck(): ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR) {}
- CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn) :
- scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey),
- ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR) { }
+ CScriptCheck(): amount(0), ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR) {}
+ CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* txdataIn) :
+ scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey), amount(txFromIn.vout[txToIn.vin[nInIn].prevout.n].nValue),
+ ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR), txdata(txdataIn) { }
bool operator()();
void swap(CScriptCheck &check) {
scriptPubKey.swap(check.scriptPubKey);
std::swap(ptxTo, check.ptxTo);
+ std::swap(amount, check.amount);
std::swap(nIn, check.nIn);
std::swap(nFlags, check.nFlags);
std::swap(cacheStore, check.cacheStore);
std::swap(error, check.error);
+ std::swap(txdata, check.txdata);
}
ScriptError GetScriptError() const { return error; }
@@ -383,80 +456,42 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus
/** Functions for validating blocks and updating the block tree */
+/** Context-independent validity checks */
+bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW = true);
+bool CheckBlock(const CBlock& block, CValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
+
+/** Context-dependent validity checks.
+ * By "context", we mean only the previous block headers, but not the UTXO
+ * set; UTXO-related validity checks are done in ConnectBlock(). */
+bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev, int64_t nAdjustedTime);
+bool ContextualCheckBlock(const CBlock& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev);
+
+/** Apply the effects of this block (with given index) on the UTXO set represented by coins.
+ * Validity checks that depend on the UTXO set are also done; ConnectBlock()
+ * can fail if those validity checks fail (among other reasons). */
+bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins,
+ const CChainParams& chainparams, bool fJustCheck = false);
+
/** Undo the effects of this block (with given index) on the UTXO set represented by coins.
* In case pfClean is provided, operation will try to be tolerant about errors, and *pfClean
* will be true if no problems were found. Otherwise, the return value will be false in case
* of problems. Note that in any case, coins may be modified. */
bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockIndex* pindex, CCoinsViewCache& coins, bool* pfClean = NULL);
-/** Apply the effects of this block (with given index) on the UTXO set represented by coins */
-bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck = false);
-
-/** Context-independent validity checks */
-bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW = true);
-bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
-
-/** Context-dependent validity checks */
-bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex *pindexPrev);
-bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIndex *pindexPrev);
-
/** 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 CChainParams& chainparams, const CBlock& block, CBlockIndex* pindexPrev, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
+/** Check whether witness commitments are required for block. */
+bool IsWitnessEnabled(const CBlockIndex* pindexPrev, const Consensus::Params& params);
-class CBlockFileInfo
-{
-public:
- unsigned int nBlocks; //! number of blocks stored in file
- unsigned int nSize; //! number of used bytes of block file
- unsigned int nUndoSize; //! number of used bytes in the undo file
- unsigned int nHeightFirst; //! lowest height of block in file
- unsigned int nHeightLast; //! highest height of block in file
- uint64_t nTimeFirst; //! earliest time of block in file
- uint64_t nTimeLast; //! latest time of block in file
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(VARINT(nBlocks));
- READWRITE(VARINT(nSize));
- READWRITE(VARINT(nUndoSize));
- READWRITE(VARINT(nHeightFirst));
- READWRITE(VARINT(nHeightLast));
- READWRITE(VARINT(nTimeFirst));
- READWRITE(VARINT(nTimeLast));
- }
+/** When there are blocks in the active chain with missing data, rewind the chainstate and remove them from the block index */
+bool RewindBlockIndex(const CChainParams& params);
- void SetNull() {
- nBlocks = 0;
- nSize = 0;
- nUndoSize = 0;
- nHeightFirst = 0;
- nHeightLast = 0;
- nTimeFirst = 0;
- nTimeLast = 0;
- }
-
- CBlockFileInfo() {
- SetNull();
- }
-
- std::string ToString() const;
-
- /** update statistics (does not update nSize) */
- void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn) {
- if (nBlocks==0 || nHeightFirst > nHeightIn)
- nHeightFirst = nHeightIn;
- if (nBlocks==0 || nTimeFirst > nTimeIn)
- nTimeFirst = nTimeIn;
- nBlocks++;
- if (nHeightIn > nHeightLast)
- nHeightLast = nHeightIn;
- if (nTimeIn > nTimeLast)
- nTimeLast = nTimeIn;
- }
-};
+/** Update uncommitted block structures (currently: only the witness nonce). This is safe for submitted blocks. */
+void UpdateUncommittedBlockStructures(CBlock& block, const CBlockIndex* pindexPrev, const Consensus::Params& consensusParams);
+
+/** Produce the necessary coinbase commitment for a block (modifies the hash, don't call for mined blocks). */
+std::vector<unsigned char> GenerateCoinbaseCommitment(CBlock& block, const CBlockIndex* pindexPrev, const Consensus::Params& consensusParams);
/** RAII wrapper for VerifyDB: Verify consistency of the block and coin databases */
class CVerifyDB {
@@ -470,10 +505,10 @@ public:
CBlockIndex* FindForkInGlobalIndex(const CChain& chain, const CBlockLocator& locator);
/** Mark a block as invalid. */
-bool InvalidateBlock(CValidationState& state, const Consensus::Params& consensusParams, CBlockIndex *pindex);
+bool InvalidateBlock(CValidationState& state, const CChainParams& chainparams, CBlockIndex *pindex);
/** Remove invalidity status from a block and its descendants. */
-bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex);
+bool ResetBlockFailureFlags(CBlockIndex *pindex);
/** The currently-connected chain of blocks (protected by cs_main). */
extern CChain chainActive;
@@ -491,6 +526,13 @@ extern CBlockTreeDB *pblocktree;
*/
int GetSpendHeight(const CCoinsViewCache& inputs);
+extern VersionBitsCache versionbitscache;
+
+/**
+ * Determine what nVersion a new block should use.
+ */
+int32_t ComputeBlockVersion(const CBlockIndex* pindexPrev, const Consensus::Params& params);
+
/** Reject codes greater or equal to this can be returned by AcceptToMemPool
* for transactions, to signal internal conditions. They cannot and should not
* be sent over the P2P network.
diff --git a/src/memusage.h b/src/memusage.h
index 49760e64c7..3810bfad07 100644
--- a/src/memusage.h
+++ b/src/memusage.h
@@ -5,6 +5,8 @@
#ifndef BITCOIN_MEMUSAGE_H
#define BITCOIN_MEMUSAGE_H
+#include "indirectmap.h"
+
#include <stdlib.h>
#include <map>
@@ -70,6 +72,15 @@ private:
X x;
};
+struct stl_shared_counter
+{
+ /* Various platforms use different sized counters here.
+ * Conservatively assume that they won't be larger than size_t. */
+ void* class_type;
+ size_t use_count;
+ size_t weak_count;
+};
+
template<typename X>
static inline size_t DynamicUsage(const std::vector<X>& v)
{
@@ -106,6 +117,35 @@ static inline size_t IncrementalDynamicUsage(const std::map<X, Y, Z>& m)
return MallocUsage(sizeof(stl_tree_node<std::pair<const X, Y> >));
}
+// indirectmap has underlying map with pointer as key
+
+template<typename X, typename Y>
+static inline size_t DynamicUsage(const indirectmap<X, Y>& m)
+{
+ return MallocUsage(sizeof(stl_tree_node<std::pair<const X*, Y> >)) * m.size();
+}
+
+template<typename X, typename Y>
+static inline size_t IncrementalDynamicUsage(const indirectmap<X, Y>& m)
+{
+ return MallocUsage(sizeof(stl_tree_node<std::pair<const X*, Y> >));
+}
+
+template<typename X>
+static inline size_t DynamicUsage(const std::unique_ptr<X>& p)
+{
+ return p ? MallocUsage(sizeof(X)) : 0;
+}
+
+template<typename X>
+static inline size_t DynamicUsage(const std::shared_ptr<X>& p)
+{
+ // A shared_ptr can either use a single continuous memory block for both
+ // the counter and the storage (when using std::make_shared), or separate.
+ // We can't observe the difference, however, so assume the worst.
+ return p ? MallocUsage(sizeof(X)) + MallocUsage(sizeof(stl_shared_counter)) : 0;
+}
+
// Boost data structures
template<typename X>
diff --git a/src/merkleblock.cpp b/src/merkleblock.cpp
index f8e877df25..31332526a9 100644
--- a/src/merkleblock.cpp
+++ b/src/merkleblock.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -95,7 +95,7 @@ void CPartialMerkleTree::TraverseAndBuild(int height, unsigned int pos, const st
}
}
-uint256 CPartialMerkleTree::TraverseAndExtract(int height, unsigned int pos, unsigned int &nBitsUsed, unsigned int &nHashUsed, std::vector<uint256> &vMatch) {
+uint256 CPartialMerkleTree::TraverseAndExtract(int height, unsigned int pos, unsigned int &nBitsUsed, unsigned int &nHashUsed, std::vector<uint256> &vMatch, std::vector<unsigned int> &vnIndex) {
if (nBitsUsed >= vBits.size()) {
// overflowed the bits array - failure
fBad = true;
@@ -110,14 +110,16 @@ uint256 CPartialMerkleTree::TraverseAndExtract(int height, unsigned int pos, uns
return uint256();
}
const uint256 &hash = vHash[nHashUsed++];
- if (height==0 && fParentOfMatch) // in case of height 0, we have a matched txid
+ if (height==0 && fParentOfMatch) { // in case of height 0, we have a matched txid
vMatch.push_back(hash);
+ vnIndex.push_back(pos);
+ }
return hash;
} else {
// otherwise, descend into the subtrees to extract matched txids and hashes
- uint256 left = TraverseAndExtract(height-1, pos*2, nBitsUsed, nHashUsed, vMatch), right;
+ uint256 left = TraverseAndExtract(height-1, pos*2, nBitsUsed, nHashUsed, vMatch, vnIndex), right;
if (pos*2+1 < CalcTreeWidth(height-1)) {
- right = TraverseAndExtract(height-1, pos*2+1, nBitsUsed, nHashUsed, vMatch);
+ right = TraverseAndExtract(height-1, pos*2+1, nBitsUsed, nHashUsed, vMatch, vnIndex);
if (right == left) {
// The left and right branches should never be identical, as the transaction
// hashes covered by them must each be unique.
@@ -147,13 +149,13 @@ CPartialMerkleTree::CPartialMerkleTree(const std::vector<uint256> &vTxid, const
CPartialMerkleTree::CPartialMerkleTree() : nTransactions(0), fBad(true) {}
-uint256 CPartialMerkleTree::ExtractMatches(std::vector<uint256> &vMatch) {
+uint256 CPartialMerkleTree::ExtractMatches(std::vector<uint256> &vMatch, std::vector<unsigned int> &vnIndex) {
vMatch.clear();
// An empty set will not work
if (nTransactions == 0)
return uint256();
// check for excessively high numbers of transactions
- if (nTransactions > MAX_BLOCK_SIZE / 60) // 60 is the lower bound for the size of a serialized CTransaction
+ if (nTransactions > MAX_BLOCK_BASE_SIZE / 60) // 60 is the lower bound for the size of a serialized CTransaction
return uint256();
// there can never be more hashes provided than one for every txid
if (vHash.size() > nTransactions)
@@ -167,7 +169,7 @@ uint256 CPartialMerkleTree::ExtractMatches(std::vector<uint256> &vMatch) {
nHeight++;
// traverse the partial tree
unsigned int nBitsUsed = 0, nHashUsed = 0;
- uint256 hashMerkleRoot = TraverseAndExtract(nHeight, 0, nBitsUsed, nHashUsed, vMatch);
+ uint256 hashMerkleRoot = TraverseAndExtract(nHeight, 0, nBitsUsed, nHashUsed, vMatch, vnIndex);
// verify that no problems occurred during the tree traversal
if (fBad)
return uint256();
diff --git a/src/merkleblock.h b/src/merkleblock.h
index 904c22abc2..835cbcce55 100644
--- a/src/merkleblock.h
+++ b/src/merkleblock.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -75,9 +75,9 @@ protected:
/**
* recursive function that traverses tree nodes, consuming the bits and hashes produced by TraverseAndBuild.
- * it returns the hash of the respective node.
+ * it returns the hash of the respective node and its respective index.
*/
- uint256 TraverseAndExtract(int height, unsigned int pos, unsigned int &nBitsUsed, unsigned int &nHashUsed, std::vector<uint256> &vMatch);
+ uint256 TraverseAndExtract(int height, unsigned int pos, unsigned int &nBitsUsed, unsigned int &nHashUsed, std::vector<uint256> &vMatch, std::vector<unsigned int> &vnIndex);
public:
@@ -110,10 +110,11 @@ public:
CPartialMerkleTree();
/**
- * extract the matching txid's represented by this partial merkle tree.
+ * extract the matching txid's represented by this partial merkle tree
+ * and their respective indices within the partial tree.
* returns the merkle root, or 0 in case of failure
*/
- uint256 ExtractMatches(std::vector<uint256> &vMatch);
+ uint256 ExtractMatches(std::vector<uint256> &vMatch, std::vector<unsigned int> &vnIndex);
};
diff --git a/src/miner.cpp b/src/miner.cpp
index 2728c7e6a7..9575858840 100644
--- a/src/miner.cpp
+++ b/src/miner.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -25,6 +25,7 @@
#include "utilmoneystr.h"
#include "validationinterface.h"
+#include <algorithm>
#include <boost/thread.hpp>
#include <boost/tuple/tuple.hpp>
#include <queue>
@@ -44,6 +45,7 @@ using namespace std;
uint64_t nLastBlockTx = 0;
uint64_t nLastBlockSize = 0;
+uint64_t nLastBlockWeight = 0;
class ScoreCompare
{
@@ -71,450 +73,535 @@ int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParam
return nNewTime - nOldTime;
}
-CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn)
+BlockAssembler::BlockAssembler(const CChainParams& _chainparams)
+ : chainparams(_chainparams)
{
- // Create new block
- auto_ptr<CBlockTemplate> pblocktemplate(new CBlockTemplate());
+ // Block resource limits
+ // If neither -blockmaxsize or -blockmaxweight is given, limit to DEFAULT_BLOCK_MAX_*
+ // If only one is given, only restrict the specified resource.
+ // If both are given, restrict both.
+ nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
+ nBlockMaxSize = DEFAULT_BLOCK_MAX_SIZE;
+ bool fWeightSet = false;
+ if (mapArgs.count("-blockmaxweight")) {
+ nBlockMaxWeight = GetArg("-blockmaxweight", DEFAULT_BLOCK_MAX_WEIGHT);
+ nBlockMaxSize = MAX_BLOCK_SERIALIZED_SIZE;
+ fWeightSet = true;
+ }
+ if (mapArgs.count("-blockmaxsize")) {
+ nBlockMaxSize = GetArg("-blockmaxsize", DEFAULT_BLOCK_MAX_SIZE);
+ if (!fWeightSet) {
+ nBlockMaxWeight = nBlockMaxSize * WITNESS_SCALE_FACTOR;
+ }
+ }
+
+ // Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity:
+ nBlockMaxWeight = std::max((unsigned int)4000, std::min((unsigned int)(MAX_BLOCK_WEIGHT-4000), nBlockMaxWeight));
+ // Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity:
+ nBlockMaxSize = std::max((unsigned int)1000, std::min((unsigned int)(MAX_BLOCK_SERIALIZED_SIZE-1000), nBlockMaxSize));
+
+ // Whether we need to account for byte usage (in addition to weight usage)
+ fNeedSizeAccounting = (nBlockMaxSize < MAX_BLOCK_SERIALIZED_SIZE-1000);
+}
+
+void BlockAssembler::resetBlock()
+{
+ inBlock.clear();
+
+ // Reserve space for coinbase tx
+ nBlockSize = 1000;
+ nBlockWeight = 4000;
+ nBlockSigOpsCost = 400;
+ fIncludeWitness = false;
+
+ // These counters do not include coinbase tx
+ nBlockTx = 0;
+ nFees = 0;
+
+ lastFewTxs = 0;
+ blockFinished = false;
+}
+
+CBlockTemplate* BlockAssembler::CreateNewBlock(const CScript& scriptPubKeyIn)
+{
+ resetBlock();
+
+ pblocktemplate.reset(new CBlockTemplate());
+
if(!pblocktemplate.get())
return NULL;
- CBlock *pblock = &pblocktemplate->block; // pointer for convenience
+ pblock = &pblocktemplate->block; // pointer for convenience
+
+ // Add dummy coinbase tx as first transaction
+ pblock->vtx.push_back(CTransaction());
+ pblocktemplate->vTxFees.push_back(-1); // updated at end
+ pblocktemplate->vTxSigOpsCost.push_back(-1); // updated at end
+
+ LOCK2(cs_main, mempool.cs);
+ CBlockIndex* pindexPrev = chainActive.Tip();
+ nHeight = pindexPrev->nHeight + 1;
+ pblock->nVersion = ComputeBlockVersion(pindexPrev, chainparams.GetConsensus());
// -regtest only: allow overriding block.nVersion with
// -blockversion=N to test forking scenarios
if (chainparams.MineBlocksOnDemand())
pblock->nVersion = GetArg("-blockversion", pblock->nVersion);
- // Create coinbase tx
- CMutableTransaction txNew;
- txNew.vin.resize(1);
- txNew.vin[0].prevout.SetNull();
- txNew.vout.resize(1);
- txNew.vout[0].scriptPubKey = scriptPubKeyIn;
-
- // Add dummy coinbase tx as first transaction
- pblock->vtx.push_back(CTransaction());
- pblocktemplate->vTxFees.push_back(-1); // updated at end
- pblocktemplate->vTxSigOps.push_back(-1); // updated at end
-
- // Largest block you're willing to create:
- unsigned int nBlockMaxSize = GetArg("-blockmaxsize", DEFAULT_BLOCK_MAX_SIZE);
- // Limit to between 1K and MAX_BLOCK_SIZE-1K for sanity:
- nBlockMaxSize = std::max((unsigned int)1000, std::min((unsigned int)(MAX_BLOCK_SIZE-1000), nBlockMaxSize));
+ pblock->nTime = GetAdjustedTime();
+ const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast();
+
+ nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST)
+ ? nMedianTimePast
+ : pblock->GetBlockTime();
+
+ // Decide whether to include witness transactions
+ // This is only needed in case the witness softfork activation is reverted
+ // (which would require a very deep reorganization) or when
+ // -promiscuousmempoolflags is used.
+ // TODO: replace this with a call to main to assess validity of a mempool
+ // transaction (which in most cases can be a no-op).
+ fIncludeWitness = IsWitnessEnabled(pindexPrev, chainparams.GetConsensus());
+
+ addPriorityTxs();
+ addPackageTxs();
+
+ nLastBlockTx = nBlockTx;
+ nLastBlockSize = nBlockSize;
+ nLastBlockWeight = nBlockWeight;
+ LogPrintf("CreateNewBlock(): total size %u txs: %u fees: %ld sigops %d\n", nBlockSize, nBlockTx, nFees, nBlockSigOpsCost);
+
+ // Create coinbase transaction.
+ CMutableTransaction coinbaseTx;
+ coinbaseTx.vin.resize(1);
+ coinbaseTx.vin[0].prevout.SetNull();
+ coinbaseTx.vout.resize(1);
+ coinbaseTx.vout[0].scriptPubKey = scriptPubKeyIn;
+ coinbaseTx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus());
+ coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
+ pblock->vtx[0] = coinbaseTx;
+ pblocktemplate->vchCoinbaseCommitment = GenerateCoinbaseCommitment(*pblock, pindexPrev, chainparams.GetConsensus());
+ pblocktemplate->vTxFees[0] = -nFees;
+
+ // Fill in header
+ pblock->hashPrevBlock = pindexPrev->GetBlockHash();
+ UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev);
+ pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
+ pblock->nNonce = 0;
+ pblocktemplate->vTxSigOpsCost[0] = WITNESS_SCALE_FACTOR * GetLegacySigOpCount(pblock->vtx[0]);
- // How much of the block should be dedicated to high-priority transactions,
- // included regardless of the fees they pay
- unsigned int nBlockPrioritySize = GetArg("-blockprioritysize", DEFAULT_BLOCK_PRIORITY_SIZE);
- nBlockPrioritySize = std::min(nBlockMaxSize, nBlockPrioritySize);
+ CValidationState state;
+ if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) {
+ throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, FormatStateMessage(state)));
+ }
- // Minimum block size you want to create; block will be filled with free transactions
- // until there are no more or the block reaches this size:
- unsigned int nBlockMinSize = GetArg("-blockminsize", DEFAULT_BLOCK_MIN_SIZE);
- nBlockMinSize = std::min(nBlockMaxSize, nBlockMinSize);
+ return pblocktemplate.release();
+}
- // Collect memory pool transactions into the block
- CTxMemPool::setEntries inBlock;
- CTxMemPool::setEntries waitSet;
+bool BlockAssembler::isStillDependent(CTxMemPool::txiter iter)
+{
+ BOOST_FOREACH(CTxMemPool::txiter parent, mempool.GetMemPoolParents(iter))
+ {
+ if (!inBlock.count(parent)) {
+ return true;
+ }
+ }
+ return false;
+}
- // This vector will be sorted into a priority queue:
- vector<TxCoinAgePriority> vecPriority;
- TxCoinAgePriorityCompare pricomparer;
- std::map<CTxMemPool::txiter, double, CTxMemPool::CompareIteratorByHash> waitPriMap;
- typedef std::map<CTxMemPool::txiter, double, CTxMemPool::CompareIteratorByHash>::iterator waitPriIter;
- double actualPriority = -1;
+void BlockAssembler::onlyUnconfirmed(CTxMemPool::setEntries& testSet)
+{
+ for (CTxMemPool::setEntries::iterator iit = testSet.begin(); iit != testSet.end(); ) {
+ // Only test txs not already in the block
+ if (inBlock.count(*iit)) {
+ testSet.erase(iit++);
+ }
+ else {
+ iit++;
+ }
+ }
+}
- std::priority_queue<CTxMemPool::txiter, std::vector<CTxMemPool::txiter>, ScoreCompare> clearedTxs;
- bool fPrintPriority = GetBoolArg("-printpriority", DEFAULT_PRINTPRIORITY);
- uint64_t nBlockSize = 1000;
- uint64_t nBlockTx = 0;
- unsigned int nBlockSigOps = 100;
- int lastFewTxs = 0;
- CAmount nFees = 0;
+bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost)
+{
+ // TODO: switch to weight-based accounting for packages instead of vsize-based accounting.
+ if (nBlockWeight + WITNESS_SCALE_FACTOR * packageSize >= nBlockMaxWeight)
+ return false;
+ if (nBlockSigOpsCost + packageSigOpsCost >= MAX_BLOCK_SIGOPS_COST)
+ return false;
+ return true;
+}
- {
- LOCK2(cs_main, mempool.cs);
- CBlockIndex* pindexPrev = chainActive.Tip();
- const int nHeight = pindexPrev->nHeight + 1;
- pblock->nTime = GetAdjustedTime();
- const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast();
-
- int64_t nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST)
- ? nMedianTimePast
- : pblock->GetBlockTime();
-
- bool fPriorityBlock = nBlockPrioritySize > 0;
- if (fPriorityBlock) {
- vecPriority.reserve(mempool.mapTx.size());
- for (CTxMemPool::indexed_transaction_set::iterator mi = mempool.mapTx.begin();
- mi != mempool.mapTx.end(); ++mi)
- {
- double dPriority = mi->GetPriority(nHeight);
- CAmount dummy;
- mempool.ApplyDeltas(mi->GetTx().GetHash(), dPriority, dummy);
- vecPriority.push_back(TxCoinAgePriority(dPriority, mi));
+// Perform transaction-level checks before adding to block:
+// - transaction finality (locktime)
+// - premature witness (in case segwit transactions are added to mempool before
+// segwit activation)
+// - serialized size (in case -blockmaxsize is in use)
+bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& package)
+{
+ uint64_t nPotentialBlockSize = nBlockSize; // only used with fNeedSizeAccounting
+ BOOST_FOREACH (const CTxMemPool::txiter it, package) {
+ if (!IsFinalTx(it->GetTx(), nHeight, nLockTimeCutoff))
+ return false;
+ if (!fIncludeWitness && !it->GetTx().wit.IsNull())
+ return false;
+ if (fNeedSizeAccounting) {
+ uint64_t nTxSize = ::GetSerializeSize(it->GetTx(), SER_NETWORK, PROTOCOL_VERSION);
+ if (nPotentialBlockSize + nTxSize >= nBlockMaxSize) {
+ return false;
}
- std::make_heap(vecPriority.begin(), vecPriority.end(), pricomparer);
+ nPotentialBlockSize += nTxSize;
}
+ }
+ return true;
+}
- CTxMemPool::indexed_transaction_set::nth_index<3>::type::iterator mi = mempool.mapTx.get<3>().begin();
- CTxMemPool::txiter iter;
-
- while (mi != mempool.mapTx.get<3>().end() || !clearedTxs.empty())
- {
- bool priorityTx = false;
- if (fPriorityBlock && !vecPriority.empty()) { // add a tx from priority queue to fill the blockprioritysize
- priorityTx = true;
- iter = vecPriority.front().second;
- actualPriority = vecPriority.front().first;
- std::pop_heap(vecPriority.begin(), vecPriority.end(), pricomparer);
- vecPriority.pop_back();
- }
- else if (clearedTxs.empty()) { // add tx with next highest score
- iter = mempool.mapTx.project<0>(mi);
- mi++;
+bool BlockAssembler::TestForBlock(CTxMemPool::txiter iter)
+{
+ if (nBlockWeight + iter->GetTxWeight() >= nBlockMaxWeight) {
+ // If the block is so close to full that no more txs will fit
+ // or if we've tried more than 50 times to fill remaining space
+ // then flag that the block is finished
+ if (nBlockWeight > nBlockMaxWeight - 400 || lastFewTxs > 50) {
+ blockFinished = true;
+ return false;
+ }
+ // Once we're within 4000 weight of a full block, only look at 50 more txs
+ // to try to fill the remaining space.
+ if (nBlockWeight > nBlockMaxWeight - 4000) {
+ lastFewTxs++;
+ }
+ return false;
+ }
+
+ if (fNeedSizeAccounting) {
+ if (nBlockSize + ::GetSerializeSize(iter->GetTx(), SER_NETWORK, PROTOCOL_VERSION) >= nBlockMaxSize) {
+ if (nBlockSize > nBlockMaxSize - 100 || lastFewTxs > 50) {
+ blockFinished = true;
+ return false;
}
- else { // try to add a previously postponed child tx
- iter = clearedTxs.top();
- clearedTxs.pop();
+ if (nBlockSize > nBlockMaxSize - 1000) {
+ lastFewTxs++;
}
+ return false;
+ }
+ }
- if (inBlock.count(iter))
- continue; // could have been added to the priorityBlock
+ if (nBlockSigOpsCost + iter->GetSigOpCost() >= MAX_BLOCK_SIGOPS_COST) {
+ // If the block has room for no more sig ops then
+ // flag that the block is finished
+ if (nBlockSigOpsCost > MAX_BLOCK_SIGOPS_COST - 8) {
+ blockFinished = true;
+ return false;
+ }
+ // Otherwise attempt to find another tx with fewer sigops
+ // to put in the block.
+ return false;
+ }
- const CTransaction& tx = iter->GetTx();
+ // Must check that lock times are still valid
+ // This can be removed once MTP is always enforced
+ // as long as reorgs keep the mempool consistent.
+ if (!IsFinalTx(iter->GetTx(), nHeight, nLockTimeCutoff))
+ return false;
- bool fOrphan = false;
- BOOST_FOREACH(CTxMemPool::txiter parent, mempool.GetMemPoolParents(iter))
- {
- if (!inBlock.count(parent)) {
- fOrphan = true;
- break;
- }
- }
- if (fOrphan) {
- if (priorityTx)
- waitPriMap.insert(std::make_pair(iter,actualPriority));
- else
- waitSet.insert(iter);
- continue;
- }
+ return true;
+}
- unsigned int nTxSize = iter->GetTxSize();
- if (fPriorityBlock &&
- (nBlockSize + nTxSize >= nBlockPrioritySize || !AllowFree(actualPriority))) {
- fPriorityBlock = false;
- waitPriMap.clear();
- }
- if (!priorityTx &&
- (iter->GetModifiedFee() < ::minRelayTxFee.GetFee(nTxSize) && nBlockSize >= nBlockMinSize)) {
- break;
- }
- if (nBlockSize + nTxSize >= nBlockMaxSize) {
- if (nBlockSize > nBlockMaxSize - 100 || lastFewTxs > 50) {
- break;
- }
- // Once we're within 1000 bytes of a full block, only look at 50 more txs
- // to try to fill the remaining space.
- if (nBlockSize > nBlockMaxSize - 1000) {
- lastFewTxs++;
- }
- continue;
- }
+void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
+{
+ pblock->vtx.push_back(iter->GetTx());
+ pblocktemplate->vTxFees.push_back(iter->GetFee());
+ pblocktemplate->vTxSigOpsCost.push_back(iter->GetSigOpCost());
+ if (fNeedSizeAccounting) {
+ nBlockSize += ::GetSerializeSize(iter->GetTx(), SER_NETWORK, PROTOCOL_VERSION);
+ }
+ nBlockWeight += iter->GetTxWeight();
+ ++nBlockTx;
+ nBlockSigOpsCost += iter->GetSigOpCost();
+ nFees += iter->GetFee();
+ inBlock.insert(iter);
- if (!IsFinalTx(tx, nHeight, nLockTimeCutoff))
- continue;
+ bool fPrintPriority = GetBoolArg("-printpriority", DEFAULT_PRINTPRIORITY);
+ if (fPrintPriority) {
+ double dPriority = iter->GetPriority(nHeight);
+ CAmount dummy;
+ mempool.ApplyDeltas(iter->GetTx().GetHash(), dPriority, dummy);
+ LogPrintf("priority %.1f fee %s txid %s\n",
+ dPriority,
+ CFeeRate(iter->GetModifiedFee(), iter->GetTxSize()).ToString(),
+ iter->GetTx().GetHash().ToString());
+ }
+}
- unsigned int nTxSigOps = iter->GetSigOpCount();
- if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) {
- if (nBlockSigOps > MAX_BLOCK_SIGOPS - 2) {
- break;
- }
+void BlockAssembler::UpdatePackagesForAdded(const CTxMemPool::setEntries& alreadyAdded,
+ indexed_modified_transaction_set &mapModifiedTx)
+{
+ BOOST_FOREACH(const CTxMemPool::txiter it, alreadyAdded) {
+ CTxMemPool::setEntries descendants;
+ mempool.CalculateDescendants(it, descendants);
+ // Insert all descendants (not yet in block) into the modified set
+ BOOST_FOREACH(CTxMemPool::txiter desc, descendants) {
+ if (alreadyAdded.count(desc))
continue;
+ modtxiter mit = mapModifiedTx.find(desc);
+ if (mit == mapModifiedTx.end()) {
+ CTxMemPoolModifiedEntry modEntry(desc);
+ modEntry.nSizeWithAncestors -= it->GetTxSize();
+ modEntry.nModFeesWithAncestors -= it->GetModifiedFee();
+ modEntry.nSigOpCostWithAncestors -= it->GetSigOpCost();
+ mapModifiedTx.insert(modEntry);
+ } else {
+ mapModifiedTx.modify(mit, update_for_parent_inclusion(it));
}
+ }
+ }
+}
- CAmount nTxFees = iter->GetFee();
- // Added
- pblock->vtx.push_back(tx);
- pblocktemplate->vTxFees.push_back(nTxFees);
- pblocktemplate->vTxSigOps.push_back(nTxSigOps);
- nBlockSize += nTxSize;
- ++nBlockTx;
- nBlockSigOps += nTxSigOps;
- nFees += nTxFees;
-
- if (fPrintPriority)
- {
- double dPriority = iter->GetPriority(nHeight);
- CAmount dummy;
- mempool.ApplyDeltas(tx.GetHash(), dPriority, dummy);
- LogPrintf("priority %.1f fee %s txid %s\n",
- dPriority , CFeeRate(iter->GetModifiedFee(), nTxSize).ToString(), tx.GetHash().ToString());
- }
+// Skip entries in mapTx that are already in a block or are present
+// in mapModifiedTx (which implies that the mapTx ancestor state is
+// stale due to ancestor inclusion in the block)
+// Also skip transactions that we've already failed to add. This can happen if
+// we consider a transaction in mapModifiedTx and it fails: we can then
+// potentially consider it again while walking mapTx. It's currently
+// guaranteed to fail again, but as a belt-and-suspenders check we put it in
+// failedTx and avoid re-evaluation, since the re-evaluation would be using
+// cached size/sigops/fee values that are not actually correct.
+bool BlockAssembler::SkipMapTxEntry(CTxMemPool::txiter it, indexed_modified_transaction_set &mapModifiedTx, CTxMemPool::setEntries &failedTx)
+{
+ assert (it != mempool.mapTx.end());
+ if (mapModifiedTx.count(it) || inBlock.count(it) || failedTx.count(it))
+ return true;
+ return false;
+}
- inBlock.insert(iter);
+void BlockAssembler::SortForBlock(const CTxMemPool::setEntries& package, CTxMemPool::txiter entry, std::vector<CTxMemPool::txiter>& sortedEntries)
+{
+ // Sort package by ancestor count
+ // If a transaction A depends on transaction B, then A's ancestor count
+ // must be greater than B's. So this is sufficient to validly order the
+ // transactions for block inclusion.
+ sortedEntries.clear();
+ sortedEntries.insert(sortedEntries.begin(), package.begin(), package.end());
+ std::sort(sortedEntries.begin(), sortedEntries.end(), CompareTxIterByAncestorCount());
+}
- // Add transactions that depend on this one to the priority queue
- BOOST_FOREACH(CTxMemPool::txiter child, mempool.GetMemPoolChildren(iter))
- {
- if (fPriorityBlock) {
- waitPriIter wpiter = waitPriMap.find(child);
- if (wpiter != waitPriMap.end()) {
- vecPriority.push_back(TxCoinAgePriority(wpiter->second,child));
- std::push_heap(vecPriority.begin(), vecPriority.end(), pricomparer);
- waitPriMap.erase(wpiter);
- }
- }
- else {
- if (waitSet.count(child)) {
- clearedTxs.push(child);
- waitSet.erase(child);
- }
- }
+// This transaction selection algorithm orders the mempool based
+// on feerate of a transaction including all unconfirmed ancestors.
+// Since we don't remove transactions from the mempool as we select them
+// for block inclusion, we need an alternate method of updating the feerate
+// of a transaction with its not-yet-selected ancestors as we go.
+// This is accomplished by walking the in-mempool descendants of selected
+// transactions and storing a temporary modified state in mapModifiedTxs.
+// Each time through the loop, we compare the best transaction in
+// mapModifiedTxs with the next transaction in the mempool to decide what
+// transaction package to work on next.
+void BlockAssembler::addPackageTxs()
+{
+ // mapModifiedTx will store sorted packages after they are modified
+ // because some of their txs are already in the block
+ indexed_modified_transaction_set mapModifiedTx;
+ // Keep track of entries that failed inclusion, to avoid duplicate work
+ CTxMemPool::setEntries failedTx;
+
+ // Start by adding all descendants of previously added txs to mapModifiedTx
+ // and modifying them for their already included ancestors
+ UpdatePackagesForAdded(inBlock, mapModifiedTx);
+
+ CTxMemPool::indexed_transaction_set::index<ancestor_score>::type::iterator mi = mempool.mapTx.get<ancestor_score>().begin();
+ CTxMemPool::txiter iter;
+ while (mi != mempool.mapTx.get<ancestor_score>().end() || !mapModifiedTx.empty())
+ {
+ // First try to find a new transaction in mapTx to evaluate.
+ if (mi != mempool.mapTx.get<ancestor_score>().end() &&
+ SkipMapTxEntry(mempool.mapTx.project<0>(mi), mapModifiedTx, failedTx)) {
+ ++mi;
+ continue;
+ }
+
+ // Now that mi is not stale, determine which transaction to evaluate:
+ // the next entry from mapTx, or the best from mapModifiedTx?
+ bool fUsingModified = false;
+
+ modtxscoreiter modit = mapModifiedTx.get<ancestor_score>().begin();
+ if (mi == mempool.mapTx.get<ancestor_score>().end()) {
+ // We're out of entries in mapTx; use the entry from mapModifiedTx
+ iter = modit->iter;
+ fUsingModified = true;
+ } else {
+ // Try to compare the mapTx entry to the mapModifiedTx entry
+ iter = mempool.mapTx.project<0>(mi);
+ if (modit != mapModifiedTx.get<ancestor_score>().end() &&
+ CompareModifiedEntry()(*modit, CTxMemPoolModifiedEntry(iter))) {
+ // The best entry in mapModifiedTx has higher score
+ // than the one from mapTx.
+ // Switch which transaction (package) to consider
+ iter = modit->iter;
+ fUsingModified = true;
+ } else {
+ // Either no entry in mapModifiedTx, or it's worse than mapTx.
+ // Increment mi for the next loop iteration.
+ ++mi;
}
}
- nLastBlockTx = nBlockTx;
- nLastBlockSize = nBlockSize;
- LogPrintf("CreateNewBlock(): total size %u txs: %u fees: %ld sigops %d\n", nBlockSize, nBlockTx, nFees, nBlockSigOps);
-
- // Compute final coinbase transaction.
- 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, chainparams.GetConsensus(), pindexPrev);
- pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
- pblock->nNonce = 0;
- pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]);
-
- CValidationState state;
- if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) {
- throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, FormatStateMessage(state)));
+
+ // We skip mapTx entries that are inBlock, and mapModifiedTx shouldn't
+ // contain anything that is inBlock.
+ assert(!inBlock.count(iter));
+
+ uint64_t packageSize = iter->GetSizeWithAncestors();
+ CAmount packageFees = iter->GetModFeesWithAncestors();
+ int64_t packageSigOpsCost = iter->GetSigOpCostWithAncestors();
+ if (fUsingModified) {
+ packageSize = modit->nSizeWithAncestors;
+ packageFees = modit->nModFeesWithAncestors;
+ packageSigOpsCost = modit->nSigOpCostWithAncestors;
}
- }
- return pblocktemplate.release();
-}
+ if (packageFees < ::minRelayTxFee.GetFee(packageSize)) {
+ // Everything else we might consider has a lower fee rate
+ return;
+ }
-void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned int& nExtraNonce)
-{
- // Update nExtraNonce
- static uint256 hashPrevBlock;
- if (hashPrevBlock != pblock->hashPrevBlock)
- {
- nExtraNonce = 0;
- hashPrevBlock = pblock->hashPrevBlock;
- }
- ++nExtraNonce;
- unsigned int nHeight = pindexPrev->nHeight+1; // Height first in coinbase required for block.version=2
- CMutableTransaction txCoinbase(pblock->vtx[0]);
- txCoinbase.vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce)) + COINBASE_FLAGS;
- assert(txCoinbase.vin[0].scriptSig.size() <= 100);
+ if (!TestPackage(packageSize, packageSigOpsCost)) {
+ if (fUsingModified) {
+ // Since we always look at the best entry in mapModifiedTx,
+ // we must erase failed entries so that we can consider the
+ // next best entry on the next loop iteration
+ mapModifiedTx.get<ancestor_score>().erase(modit);
+ failedTx.insert(iter);
+ }
+ continue;
+ }
- pblock->vtx[0] = txCoinbase;
- pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
-}
+ CTxMemPool::setEntries ancestors;
+ uint64_t nNoLimit = std::numeric_limits<uint64_t>::max();
+ std::string dummy;
+ mempool.CalculateMemPoolAncestors(*iter, ancestors, nNoLimit, nNoLimit, nNoLimit, nNoLimit, dummy, false);
-//////////////////////////////////////////////////////////////////////////////
-//
-// Internal miner
-//
+ onlyUnconfirmed(ancestors);
+ ancestors.insert(iter);
-//
-// ScanHash scans nonces looking for a hash with at least some zero bits.
-// The nonce is usually preserved between calls, but periodically or if the
-// nonce is 0xffff0000 or above, the block is rebuilt and nNonce starts over at
-// zero.
-//
-bool static ScanHash(const CBlockHeader *pblock, uint32_t& nNonce, uint256 *phash)
-{
- // Write the first 76 bytes of the block header to a double-SHA256 state.
- CHash256 hasher;
- CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
- ss << *pblock;
- assert(ss.size() == 80);
- hasher.Write((unsigned char*)&ss[0], 76);
-
- while (true) {
- nNonce++;
-
- // Write the last 4 bytes of the block header (the nonce) to a copy of
- // the double-SHA256 state, and compute the result.
- CHash256(hasher).Write((unsigned char*)&nNonce, 4).Finalize((unsigned char*)phash);
-
- // Return the nonce if the hash has at least some zero bits,
- // caller will check if it has enough to reach the target
- if (((uint16_t*)phash)[15] == 0)
- return true;
+ // Test if all tx's are Final
+ if (!TestPackageTransactions(ancestors)) {
+ if (fUsingModified) {
+ mapModifiedTx.get<ancestor_score>().erase(modit);
+ failedTx.insert(iter);
+ }
+ continue;
+ }
- // If nothing found after trying for a while, return -1
- if ((nNonce & 0xfff) == 0)
- return false;
+ // Package can be added. Sort the entries in a valid order.
+ vector<CTxMemPool::txiter> sortedEntries;
+ SortForBlock(ancestors, iter, sortedEntries);
+
+ for (size_t i=0; i<sortedEntries.size(); ++i) {
+ AddToBlock(sortedEntries[i]);
+ // Erase from the modified set, if present
+ mapModifiedTx.erase(sortedEntries[i]);
+ }
+
+ // Update transactions that depend on each of these
+ UpdatePackagesForAdded(ancestors, mapModifiedTx);
}
}
-static bool ProcessBlockFound(const CBlock* pblock, const CChainParams& chainparams)
+void BlockAssembler::addPriorityTxs()
{
- LogPrintf("%s\n", pblock->ToString());
- LogPrintf("generated %s\n", FormatMoney(pblock->vtx[0].vout[0].nValue));
+ // How much of the block should be dedicated to high-priority transactions,
+ // included regardless of the fees they pay
+ unsigned int nBlockPrioritySize = GetArg("-blockprioritysize", DEFAULT_BLOCK_PRIORITY_SIZE);
+ nBlockPrioritySize = std::min(nBlockMaxSize, nBlockPrioritySize);
- // Found a solution
- {
- LOCK(cs_main);
- if (pblock->hashPrevBlock != chainActive.Tip()->GetBlockHash())
- return error("BitcoinMiner: generated block is stale");
+ if (nBlockPrioritySize == 0) {
+ return;
}
- // Inform about the new block
- GetMainSignals().BlockFound(pblock->GetHash());
+ bool fSizeAccounting = fNeedSizeAccounting;
+ fNeedSizeAccounting = true;
- // Process this block the same as if we had received it from another node
- CValidationState state;
- if (!ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL))
- return error("BitcoinMiner: ProcessNewBlock, block not accepted");
+ // This vector will be sorted into a priority queue:
+ vector<TxCoinAgePriority> vecPriority;
+ TxCoinAgePriorityCompare pricomparer;
+ std::map<CTxMemPool::txiter, double, CTxMemPool::CompareIteratorByHash> waitPriMap;
+ typedef std::map<CTxMemPool::txiter, double, CTxMemPool::CompareIteratorByHash>::iterator waitPriIter;
+ double actualPriority = -1;
- return true;
-}
+ vecPriority.reserve(mempool.mapTx.size());
+ for (CTxMemPool::indexed_transaction_set::iterator mi = mempool.mapTx.begin();
+ mi != mempool.mapTx.end(); ++mi)
+ {
+ double dPriority = mi->GetPriority(nHeight);
+ CAmount dummy;
+ mempool.ApplyDeltas(mi->GetTx().GetHash(), dPriority, dummy);
+ vecPriority.push_back(TxCoinAgePriority(dPriority, mi));
+ }
+ std::make_heap(vecPriority.begin(), vecPriority.end(), pricomparer);
+
+ CTxMemPool::txiter iter;
+ while (!vecPriority.empty() && !blockFinished) { // add a tx from priority queue to fill the blockprioritysize
+ iter = vecPriority.front().second;
+ actualPriority = vecPriority.front().first;
+ std::pop_heap(vecPriority.begin(), vecPriority.end(), pricomparer);
+ vecPriority.pop_back();
+
+ // If tx already in block, skip
+ if (inBlock.count(iter)) {
+ assert(false); // shouldn't happen for priority txs
+ continue;
+ }
-void static BitcoinMiner(const CChainParams& chainparams)
-{
- LogPrintf("BitcoinMiner started\n");
- SetThreadPriority(THREAD_PRIORITY_LOWEST);
- RenameThread("bitcoin-miner");
-
- unsigned int nExtraNonce = 0;
-
- boost::shared_ptr<CReserveScript> coinbaseScript;
- GetMainSignals().ScriptForMining(coinbaseScript);
-
- try {
- // Throw an error if no script was provided. This can happen
- // due to some internal error but also if the keypool is empty.
- // In the latter case, already the pointer is NULL.
- if (!coinbaseScript || coinbaseScript->reserveScript.empty())
- throw std::runtime_error("No coinbase script available (mining requires a wallet)");
-
- while (true) {
- 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.
- do {
- bool fvNodesEmpty;
- {
- LOCK(cs_vNodes);
- fvNodesEmpty = vNodes.empty();
- }
- if (!fvNodesEmpty && !IsInitialBlockDownload())
- break;
- MilliSleep(1000);
- } while (true);
- }
+ // cannot accept witness transactions into a non-witness block
+ if (!fIncludeWitness && !iter->GetTx().wit.IsNull())
+ continue;
+
+ // If tx is dependent on other mempool txs which haven't yet been included
+ // then put it in the waitSet
+ if (isStillDependent(iter)) {
+ waitPriMap.insert(std::make_pair(iter, actualPriority));
+ continue;
+ }
- //
- // Create new block
- //
- unsigned int nTransactionsUpdatedLast = mempool.GetTransactionsUpdated();
- CBlockIndex* pindexPrev = chainActive.Tip();
+ // If this tx fits in the block add it, otherwise keep looping
+ if (TestForBlock(iter)) {
+ AddToBlock(iter);
- auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlock(chainparams, coinbaseScript->reserveScript));
- if (!pblocktemplate.get())
- {
- LogPrintf("Error in BitcoinMiner: Keypool ran out, please call keypoolrefill before restarting the mining thread\n");
- return;
+ // If now that this txs is added we've surpassed our desired priority size
+ // or have dropped below the AllowFreeThreshold, then we're done adding priority txs
+ if (nBlockSize >= nBlockPrioritySize || !AllowFree(actualPriority)) {
+ break;
}
- CBlock *pblock = &pblocktemplate->block;
- IncrementExtraNonce(pblock, pindexPrev, nExtraNonce);
-
- LogPrintf("Running BitcoinMiner with %u transactions in block (%u bytes)\n", pblock->vtx.size(),
- ::GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION));
-
- //
- // Search
- //
- int64_t nStart = GetTime();
- arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
- uint256 hash;
- uint32_t nNonce = 0;
- while (true) {
- // Check if something found
- if (ScanHash(pblock, nNonce, &hash))
- {
- if (UintToArith256(hash) <= hashTarget)
- {
- // Found a solution
- pblock->nNonce = nNonce;
- assert(hash == pblock->GetHash());
-
- SetThreadPriority(THREAD_PRIORITY_NORMAL);
- LogPrintf("BitcoinMiner:\n");
- LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", hash.GetHex(), hashTarget.GetHex());
- ProcessBlockFound(pblock, chainparams);
- SetThreadPriority(THREAD_PRIORITY_LOWEST);
- coinbaseScript->KeepScript();
-
- // In regression test mode, stop mining after a block is found.
- if (chainparams.MineBlocksOnDemand())
- throw boost::thread_interrupted();
-
- break;
- }
- }
- // Check for stop or if block needs to be rebuilt
- boost::this_thread::interruption_point();
- // Regtest mode doesn't require peers
- if (vNodes.empty() && chainparams.MiningRequiresPeers())
- break;
- if (nNonce >= 0xffff0000)
- break;
- if (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 60)
- break;
- if (pindexPrev != chainActive.Tip())
- break;
-
- // Update nTime every few seconds
- if (UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev) < 0)
- break; // Recreate the block if the clock has run backwards,
- // so that we can use the correct time.
- if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks)
- {
- // Changing pblock->nTime can change work required on testnet:
- hashTarget.SetCompact(pblock->nBits);
+ // This tx was successfully added, so
+ // add transactions that depend on this one to the priority queue to try again
+ BOOST_FOREACH(CTxMemPool::txiter child, mempool.GetMemPoolChildren(iter))
+ {
+ waitPriIter wpiter = waitPriMap.find(child);
+ if (wpiter != waitPriMap.end()) {
+ vecPriority.push_back(TxCoinAgePriority(wpiter->second,child));
+ std::push_heap(vecPriority.begin(), vecPriority.end(), pricomparer);
+ waitPriMap.erase(wpiter);
}
}
}
}
- catch (const boost::thread_interrupted&)
- {
- LogPrintf("BitcoinMiner terminated\n");
- throw;
- }
- catch (const std::runtime_error &e)
- {
- LogPrintf("BitcoinMiner runtime error: %s\n", e.what());
- return;
- }
+ fNeedSizeAccounting = fSizeAccounting;
}
-void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams)
+void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned int& nExtraNonce)
{
- static boost::thread_group* minerThreads = NULL;
-
- if (nThreads < 0)
- nThreads = GetNumCores();
-
- if (minerThreads != NULL)
+ // Update nExtraNonce
+ static uint256 hashPrevBlock;
+ if (hashPrevBlock != pblock->hashPrevBlock)
{
- minerThreads->interrupt_all();
- delete minerThreads;
- minerThreads = NULL;
+ nExtraNonce = 0;
+ hashPrevBlock = pblock->hashPrevBlock;
}
+ ++nExtraNonce;
+ unsigned int nHeight = pindexPrev->nHeight+1; // Height first in coinbase required for block.version=2
+ CMutableTransaction txCoinbase(pblock->vtx[0]);
+ txCoinbase.vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce)) + COINBASE_FLAGS;
+ assert(txCoinbase.vin[0].scriptSig.size() <= 100);
- if (nThreads == 0 || !fGenerate)
- return;
-
- minerThreads = new boost::thread_group();
- for (int i = 0; i < nThreads; i++)
- minerThreads->create_thread(boost::bind(&BitcoinMiner, boost::cref(chainparams)));
+ pblock->vtx[0] = txCoinbase;
+ pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
}
diff --git a/src/miner.h b/src/miner.h
index 16c8e2a976..11753f5e43 100644
--- a/src/miner.h
+++ b/src/miner.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
@@ -7,18 +7,20 @@
#define BITCOIN_MINER_H
#include "primitives/block.h"
+#include "txmempool.h"
#include <stdint.h>
+#include <memory>
+#include "boost/multi_index_container.hpp"
+#include "boost/multi_index/ordered_index.hpp"
class CBlockIndex;
class CChainParams;
class CReserveKey;
class CScript;
class CWallet;
-namespace Consensus { struct Params; };
-static const bool DEFAULT_GENERATE = false;
-static const int DEFAULT_GENERATE_THREADS = 1;
+namespace Consensus { struct Params; };
static const bool DEFAULT_PRINTPRIORITY = false;
@@ -26,13 +28,183 @@ struct CBlockTemplate
{
CBlock block;
std::vector<CAmount> vTxFees;
- std::vector<int64_t> vTxSigOps;
+ std::vector<int64_t> vTxSigOpsCost;
+ std::vector<unsigned char> vchCoinbaseCommitment;
+};
+
+// Container for tracking updates to ancestor feerate as we include (parent)
+// transactions in a block
+struct CTxMemPoolModifiedEntry {
+ CTxMemPoolModifiedEntry(CTxMemPool::txiter entry)
+ {
+ iter = entry;
+ nSizeWithAncestors = entry->GetSizeWithAncestors();
+ nModFeesWithAncestors = entry->GetModFeesWithAncestors();
+ nSigOpCostWithAncestors = entry->GetSigOpCostWithAncestors();
+ }
+
+ CTxMemPool::txiter iter;
+ uint64_t nSizeWithAncestors;
+ CAmount nModFeesWithAncestors;
+ int64_t nSigOpCostWithAncestors;
+};
+
+/** Comparator for CTxMemPool::txiter objects.
+ * It simply compares the internal memory address of the CTxMemPoolEntry object
+ * pointed to. This means it has no meaning, and is only useful for using them
+ * as key in other indexes.
+ */
+struct CompareCTxMemPoolIter {
+ bool operator()(const CTxMemPool::txiter& a, const CTxMemPool::txiter& b) const
+ {
+ return &(*a) < &(*b);
+ }
+};
+
+struct modifiedentry_iter {
+ typedef CTxMemPool::txiter result_type;
+ result_type operator() (const CTxMemPoolModifiedEntry &entry) const
+ {
+ return entry.iter;
+ }
+};
+
+// This matches the calculation in CompareTxMemPoolEntryByAncestorFee,
+// except operating on CTxMemPoolModifiedEntry.
+// TODO: refactor to avoid duplication of this logic.
+struct CompareModifiedEntry {
+ bool operator()(const CTxMemPoolModifiedEntry &a, const CTxMemPoolModifiedEntry &b)
+ {
+ double f1 = (double)a.nModFeesWithAncestors * b.nSizeWithAncestors;
+ double f2 = (double)b.nModFeesWithAncestors * a.nSizeWithAncestors;
+ if (f1 == f2) {
+ return CTxMemPool::CompareIteratorByHash()(a.iter, b.iter);
+ }
+ return f1 > f2;
+ }
+};
+
+// A comparator that sorts transactions based on number of ancestors.
+// This is sufficient to sort an ancestor package in an order that is valid
+// to appear in a block.
+struct CompareTxIterByAncestorCount {
+ bool operator()(const CTxMemPool::txiter &a, const CTxMemPool::txiter &b)
+ {
+ if (a->GetCountWithAncestors() != b->GetCountWithAncestors())
+ return a->GetCountWithAncestors() < b->GetCountWithAncestors();
+ return CTxMemPool::CompareIteratorByHash()(a, b);
+ }
+};
+
+typedef boost::multi_index_container<
+ CTxMemPoolModifiedEntry,
+ boost::multi_index::indexed_by<
+ boost::multi_index::ordered_unique<
+ modifiedentry_iter,
+ CompareCTxMemPoolIter
+ >,
+ // sorted by modified ancestor fee rate
+ boost::multi_index::ordered_non_unique<
+ // Reuse same tag from CTxMemPool's similar index
+ boost::multi_index::tag<ancestor_score>,
+ boost::multi_index::identity<CTxMemPoolModifiedEntry>,
+ CompareModifiedEntry
+ >
+ >
+> indexed_modified_transaction_set;
+
+typedef indexed_modified_transaction_set::nth_index<0>::type::iterator modtxiter;
+typedef indexed_modified_transaction_set::index<ancestor_score>::type::iterator modtxscoreiter;
+
+struct update_for_parent_inclusion
+{
+ update_for_parent_inclusion(CTxMemPool::txiter it) : iter(it) {}
+
+ void operator() (CTxMemPoolModifiedEntry &e)
+ {
+ e.nModFeesWithAncestors -= iter->GetFee();
+ e.nSizeWithAncestors -= iter->GetTxSize();
+ e.nSigOpCostWithAncestors -= iter->GetSigOpCost();
+ }
+
+ CTxMemPool::txiter iter;
};
-/** Run the miner threads */
-void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams);
/** Generate a new block, without valid proof-of-work */
-CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn);
+class BlockAssembler
+{
+private:
+ // The constructed block template
+ std::unique_ptr<CBlockTemplate> pblocktemplate;
+ // A convenience pointer that always refers to the CBlock in pblocktemplate
+ CBlock* pblock;
+
+ // Configuration parameters for the block size
+ bool fIncludeWitness;
+ unsigned int nBlockMaxWeight, nBlockMaxSize;
+ bool fNeedSizeAccounting;
+
+ // Information on the current status of the block
+ uint64_t nBlockWeight;
+ uint64_t nBlockSize;
+ uint64_t nBlockTx;
+ uint64_t nBlockSigOpsCost;
+ CAmount nFees;
+ CTxMemPool::setEntries inBlock;
+
+ // Chain context for the block
+ int nHeight;
+ int64_t nLockTimeCutoff;
+ const CChainParams& chainparams;
+
+ // Variables used for addPriorityTxs
+ int lastFewTxs;
+ bool blockFinished;
+
+public:
+ BlockAssembler(const CChainParams& chainparams);
+ /** Construct a new block template with coinbase to scriptPubKeyIn */
+ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn);
+
+private:
+ // utility functions
+ /** Clear the block's state and prepare for assembling a new block */
+ void resetBlock();
+ /** Add a tx to the block */
+ void AddToBlock(CTxMemPool::txiter iter);
+
+ // Methods for how to add transactions to a block.
+ /** Add transactions based on tx "priority" */
+ void addPriorityTxs();
+ /** Add transactions based on feerate including unconfirmed ancestors */
+ void addPackageTxs();
+
+ // helper function for addPriorityTxs
+ /** Test if tx will still "fit" in the block */
+ bool TestForBlock(CTxMemPool::txiter iter);
+ /** Test if tx still has unconfirmed parents not yet in block */
+ bool isStillDependent(CTxMemPool::txiter iter);
+
+ // helper functions for addPackageTxs()
+ /** Remove confirmed (inBlock) entries from given set */
+ void onlyUnconfirmed(CTxMemPool::setEntries& testSet);
+ /** Test if a new package would "fit" in the block */
+ bool TestPackage(uint64_t packageSize, int64_t packageSigOpsCost);
+ /** Perform checks on each transaction in a package:
+ * locktime, premature-witness, serialized size (if necessary)
+ * These checks should always succeed, and they're here
+ * only as an extra check in case of suboptimal node configuration */
+ bool TestPackageTransactions(const CTxMemPool::setEntries& package);
+ /** Return true if given transaction from mapTx has already been evaluated,
+ * or if the transaction's cached data in mapTx is incorrect. */
+ bool SkipMapTxEntry(CTxMemPool::txiter it, indexed_modified_transaction_set &mapModifiedTx, CTxMemPool::setEntries &failedTx);
+ /** Sort the package in an order that is valid to appear in a block */
+ void SortForBlock(const CTxMemPool::setEntries& package, CTxMemPool::txiter entry, std::vector<CTxMemPool::txiter>& sortedEntries);
+ /** Add descendants of given transactions to mapModifiedTx with ancestor
+ * state updated assuming given transactions are inBlock. */
+ void UpdatePackagesForAdded(const CTxMemPool::setEntries& alreadyAdded, indexed_modified_transaction_set &mapModifiedTx);
+};
+
/** Modify the extranonce in a block */
void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev);
diff --git a/src/mruset.h b/src/mruset.h
deleted file mode 100644
index 398aa173bf..0000000000
--- a/src/mruset.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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 <set>
-#include <vector>
-#include <utility>
-
-/** STL-like set container that only keeps the most recent N elements. */
-template <typename T>
-class mruset
-{
-public:
- typedef T key_type;
- typedef T value_type;
- typedef typename std::set<T>::iterator iterator;
- typedef typename std::set<T>::const_iterator const_iterator;
- typedef typename std::set<T>::size_type size_type;
-
-protected:
- std::set<T> set;
- std::vector<iterator> order;
- size_type first_used;
- size_type first_unused;
- const size_type nMaxSize;
-
-public:
- 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(); }
- bool empty() const { return set.empty(); }
- iterator find(const key_type& k) const { return set.find(k); }
- size_type count(const key_type& k) const { return set.count(k); }
- void clear()
- {
- set.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; }
- bool inline friend operator<(const mruset<T>& a, const mruset<T>& b) { return a.set < b.set; }
- std::pair<iterator, bool> insert(const key_type& x)
- {
- std::pair<iterator, bool> ret = set.insert(x);
- if (ret.second) {
- if (set.size() == nMaxSize + 1) {
- set.erase(order[first_used]);
- order[first_used] = set.end();
- if (++first_used == nMaxSize) first_used = 0;
- }
- order[first_unused] = ret.first;
- if (++first_unused == nMaxSize) first_unused = 0;
- }
- return ret;
- }
- size_type max_size() const { return nMaxSize; }
-};
-
-#endif // BITCOIN_MRUSET_H
diff --git a/src/net.cpp b/src/net.cpp
index e5659efc01..5f9942c9dc 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -14,8 +14,10 @@
#include "clientversion.h"
#include "consensus/consensus.h"
#include "crypto/common.h"
+#include "crypto/sha256.h"
#include "hash.h"
#include "primitives/transaction.h"
+#include "netbase.h"
#include "scheduler.h"
#include "ui_interface.h"
#include "utilstrencodings.h"
@@ -36,9 +38,14 @@
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
-// Dump addresses to peers.dat every 15 minutes (900s)
+#include <math.h>
+
+// Dump addresses to peers.dat and banlist.dat every 15 minutes (900s)
#define DUMP_ADDRESSES_INTERVAL 900
+// We add a random period time (0 to 1 seconds) to feeler connections to prevent synchronization.
+#define FEELER_SLEEP_WINDOW 1
+
#if !defined(HAVE_MSG_NOSIGNAL) && !defined(MSG_NOSIGNAL)
#define MSG_NOSIGNAL 0
#endif
@@ -54,64 +61,28 @@
#endif
#endif
-using namespace std;
-
-namespace {
- const int MAX_OUTBOUND_CONNECTIONS = 8;
-
- struct ListenSocket {
- SOCKET socket;
- bool whitelisted;
-
- ListenSocket(SOCKET socket, bool whitelisted) : socket(socket), whitelisted(whitelisted) {}
- };
-}
+const static std::string NET_MESSAGE_COMMAND_OTHER = "*other*";
+static const uint64_t RANDOMIZER_ID_NETGROUP = 0x6c0edd8036ef4036ULL; // SHA256("netgroup")[0:8]
//
// Global state variables
//
bool fDiscover = true;
bool fListen = true;
-uint64_t nLocalServices = NODE_NETWORK;
+bool fRelayTxes = true;
CCriticalSection cs_mapLocalHost;
-map<CNetAddr, LocalServiceInfo> mapLocalHost;
-static bool vfReachable[NET_MAX] = {};
+std::map<CNetAddr, LocalServiceInfo> mapLocalHost;
static bool vfLimited[NET_MAX] = {};
static CNode* pnodeLocalHost = NULL;
-uint64_t nLocalHostNonce = 0;
-static std::vector<ListenSocket> vhListenSocket;
-CAddrMan addrman;
-int nMaxConnections = DEFAULT_MAX_PEER_CONNECTIONS;
-bool fAddressesInitialized = false;
std::string strSubVersion;
-vector<CNode*> vNodes;
-CCriticalSection cs_vNodes;
-map<CInv, CDataStream> mapRelay;
-deque<pair<int64_t, CInv> > vRelayExpiration;
-CCriticalSection cs_mapRelay;
-limitedmap<CInv, int64_t> mapAlreadyAskedFor(MAX_INV_SZ);
-
-static deque<string> vOneShots;
-CCriticalSection cs_vOneShots;
-
-set<CNetAddr> setservAddNodeAddresses;
-CCriticalSection cs_setservAddNodeAddresses;
-
-vector<std::string> vAddedNodes;
-CCriticalSection cs_vAddedNodes;
-
-NodeId nLastNodeId = 0;
-CCriticalSection cs_nLastNodeId;
-
-static CSemaphore *semOutbound = NULL;
-boost::condition_variable messageHandlerCondition;
+limitedmap<uint256, int64_t> mapAlreadyAskedFor(MAX_INV_SZ);
// Signals for message handling
static CNodeSignals g_signals;
CNodeSignals& GetNodeSignals() { return g_signals; }
-void AddOneShot(const std::string& strDest)
+void CConnman::AddOneShot(const std::string& strDest)
{
LOCK(cs_vOneShots);
vOneShots.push_back(strDest);
@@ -132,7 +103,7 @@ bool GetLocal(CService& addr, const CNetAddr *paddrPeer)
int nBestReachability = -1;
{
LOCK(cs_mapLocalHost);
- for (map<CNetAddr, LocalServiceInfo>::iterator it = mapLocalHost.begin(); it != mapLocalHost.end(); it++)
+ for (std::map<CNetAddr, LocalServiceInfo>::iterator it = mapLocalHost.begin(); it != mapLocalHost.end(); it++)
{
int nScore = (*it).second.nScore;
int nReachability = (*it).first.GetReachabilityFrom(paddrPeer);
@@ -161,7 +132,7 @@ static std::vector<CAddress> convertSeed6(const std::vector<SeedSpec6> &vSeedsIn
{
struct in6_addr ip;
memcpy(&ip, i->addr, sizeof(ip));
- CAddress addr(CService(ip, i->port));
+ CAddress addr(CService(ip, i->port), NODE_NETWORK);
addr.nTime = GetTime() - GetRand(nOneWeek) - nOneWeek;
vSeedsOut.push_back(addr);
}
@@ -172,15 +143,14 @@ static std::vector<CAddress> convertSeed6(const std::vector<SeedSpec6> &vSeedsIn
// Otherwise, return the unroutable 0.0.0.0 but filled in with
// the normal parameters, since the IP may be changed to a useful
// one by discovery.
-CAddress GetLocalAddress(const CNetAddr *paddrPeer)
+CAddress GetLocalAddress(const CNetAddr *paddrPeer, ServiceFlags nLocalServices)
{
- CAddress ret(CService("0.0.0.0",GetListenPort()),0);
+ CAddress ret(CService(CNetAddr(),GetListenPort()), NODE_NONE);
CService addr;
if (GetLocal(addr, paddrPeer))
{
- ret = CAddress(addr);
+ ret = CAddress(addr, nLocalServices);
}
- ret.nServices = nLocalServices;
ret.nTime = GetAdjustedTime();
return ret;
}
@@ -201,11 +171,11 @@ bool IsPeerAddrLocalGood(CNode *pnode)
}
// pushes our own address to a peer
-void AdvertizeLocal(CNode *pnode)
+void AdvertiseLocal(CNode *pnode)
{
if (fListen && pnode->fSuccessfullyConnected)
{
- CAddress addrLocal = GetLocalAddress(&pnode->addr);
+ CAddress addrLocal = GetLocalAddress(&pnode->addr, pnode->GetLocalServices());
// If discovery is enabled, sometimes give our peer the address it
// tells us that it sees us as in case it has a better idea of our
// address than we do.
@@ -216,20 +186,12 @@ void AdvertizeLocal(CNode *pnode)
}
if (addrLocal.IsRoutable())
{
- LogPrintf("AdvertizeLocal: advertizing address %s\n", addrLocal.ToString());
+ LogPrint("net", "AdvertiseLocal: advertising address %s\n", addrLocal.ToString());
pnode->PushAddress(addrLocal);
}
}
}
-void SetReachable(enum Network net, bool fFlag)
-{
- LOCK(cs_mapLocalHost);
- vfReachable[net] = fFlag;
- if (net == NET_IPV6 && fFlag)
- vfReachable[NET_IPV4] = true;
-}
-
// learn a new local address
bool AddLocal(const CService& addr, int nScore)
{
@@ -252,7 +214,6 @@ bool AddLocal(const CService& addr, int nScore)
info.nScore = nScore + (fAlready ? 1 : 0);
info.nPort = addr.GetPort();
}
- SetReachable(addr.GetNetwork());
}
return true;
@@ -315,7 +276,7 @@ bool IsLocal(const CService& addr)
bool IsReachable(enum Network net)
{
LOCK(cs_mapLocalHost);
- return vfReachable[net] && !vfLimited[net];
+ return !vfLimited[net];
}
/** check whether a given address is in a network we can probably connect to */
@@ -325,23 +286,8 @@ bool IsReachable(const CNetAddr& addr)
return IsReachable(net);
}
-void AddressCurrentlyConnected(const CService& addr)
-{
- addrman.Connected(addr);
-}
-
-uint64_t CNode::nTotalBytesRecv = 0;
-uint64_t CNode::nTotalBytesSent = 0;
-CCriticalSection CNode::cs_totalBytesRecv;
-CCriticalSection CNode::cs_totalBytesSent;
-
-uint64_t CNode::nMaxOutboundLimit = 0;
-uint64_t CNode::nMaxOutboundTotalBytesSentInCycle = 0;
-uint64_t CNode::nMaxOutboundTimeframe = 60*60*24; //1 day
-uint64_t CNode::nMaxOutboundCycleStartTime = 0;
-
-CNode* FindNode(const CNetAddr& ip)
+CNode* CConnman::FindNode(const CNetAddr& ip)
{
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
@@ -350,7 +296,7 @@ CNode* FindNode(const CNetAddr& ip)
return NULL;
}
-CNode* FindNode(const CSubNet& subNet)
+CNode* CConnman::FindNode(const CSubNet& subNet)
{
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
@@ -359,7 +305,7 @@ CNode* FindNode(const CSubNet& subNet)
return NULL;
}
-CNode* FindNode(const std::string& addrName)
+CNode* CConnman::FindNode(const std::string& addrName)
{
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
@@ -368,7 +314,7 @@ CNode* FindNode(const std::string& addrName)
return NULL;
}
-CNode* FindNode(const CService& addr)
+CNode* CConnman::FindNode(const CService& addr)
{
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
@@ -377,7 +323,17 @@ CNode* FindNode(const CService& addr)
return NULL;
}
-CNode* ConnectNode(CAddress addrConnect, const char *pszDest)
+bool CConnman::CheckIncomingNonce(uint64_t nonce)
+{
+ LOCK(cs_vNodes);
+ BOOST_FOREACH(CNode* pnode, vNodes) {
+ if (!pnode->fSuccessfullyConnected && !pnode->fInbound && pnode->GetLocalNonce() == nonce)
+ return false;
+ }
+ return true;
+}
+
+CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure)
{
if (pszDest == NULL) {
if (IsLocal(addrConnect))
@@ -409,10 +365,31 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest)
return NULL;
}
- addrman.Attempt(addrConnect);
+ if (pszDest && addrConnect.IsValid()) {
+ // It is possible that we already have a connection to the IP/port pszDest resolved to.
+ // In that case, drop the connection that was just created, and return the existing CNode instead.
+ // Also store the name we used to connect in that CNode, so that future FindNode() calls to that
+ // name catch this early.
+ CNode* pnode = FindNode((CService)addrConnect);
+ if (pnode)
+ {
+ pnode->AddRef();
+ {
+ LOCK(cs_vNodes);
+ if (pnode->addrName.empty()) {
+ pnode->addrName = std::string(pszDest);
+ }
+ }
+ CloseSocket(hSocket);
+ return pnode;
+ }
+ }
+
+ addrman.Attempt(addrConnect, fCountFailure);
// Add node
- CNode* pnode = new CNode(hSocket, addrConnect, pszDest ? pszDest : "", false);
+ CNode* pnode = new CNode(GetNewNodeId(), nLocalServices, GetBestHeight(), hSocket, addrConnect, CalculateKeyedNetGroup(addrConnect), pszDest ? pszDest : "", false);
+ GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
pnode->AddRef();
{
@@ -420,18 +397,39 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest)
vNodes.push_back(pnode);
}
+ pnode->nServicesExpected = ServiceFlags(addrConnect.nServices & nRelevantServices);
pnode->nTimeConnected = GetTime();
return pnode;
} else if (!proxyConnectionFailed) {
// If connecting to the node failed, and failure is not caused by a problem connecting to
// the proxy, mark this as an attempt.
- addrman.Attempt(addrConnect);
+ addrman.Attempt(addrConnect, fCountFailure);
}
return NULL;
}
+void CConnman::DumpBanlist()
+{
+ SweepBanned(); // clean unused entries (if bantime has expired)
+
+ if (!BannedSetIsDirty())
+ return;
+
+ int64_t nStart = GetTimeMillis();
+
+ CBanDB bandb;
+ banmap_t banmap;
+ SetBannedSetDirty(false);
+ GetBanned(banmap);
+ if (!bandb.Write(banmap))
+ SetBannedSetDirty(true);
+
+ LogPrint("net", "Flushed %d banned node ips/subnets to banlist.dat %dms\n",
+ banmap.size(), GetTimeMillis() - nStart);
+}
+
void CNode::CloseSocketDisconnect()
{
fDisconnect = true;
@@ -449,36 +447,34 @@ void CNode::CloseSocketDisconnect()
void CNode::PushVersion()
{
- int nBestHeight = g_signals.GetHeight().get_value_or(0);
-
int64_t nTime = (fInbound ? GetAdjustedTime() : GetTime());
- CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService("0.0.0.0",0)));
- CAddress addrMe = GetLocalAddress(&addr);
- GetRandBytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce));
+ CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService(), addr.nServices));
+ CAddress addrMe = CAddress(CService(), nLocalServices);
if (fLogIPs)
- LogPrint("net", "send version message: version %d, blocks=%d, us=%s, them=%s, peer=%d\n", PROTOCOL_VERSION, nBestHeight, addrMe.ToString(), addrYou.ToString(), id);
+ LogPrint("net", "send version message: version %d, blocks=%d, us=%s, them=%s, peer=%d\n", PROTOCOL_VERSION, nMyStartingHeight, addrMe.ToString(), addrYou.ToString(), id);
else
- LogPrint("net", "send version message: version %d, blocks=%d, us=%s, peer=%d\n", PROTOCOL_VERSION, nBestHeight, addrMe.ToString(), id);
- PushMessage("version", PROTOCOL_VERSION, nLocalServices, nTime, addrYou, addrMe,
- nLocalHostNonce, strSubVersion, nBestHeight, !GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY));
+ LogPrint("net", "send version message: version %d, blocks=%d, us=%s, peer=%d\n", PROTOCOL_VERSION, nMyStartingHeight, addrMe.ToString(), id);
+ PushMessage(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalServices, nTime, addrYou, addrMe,
+ nLocalHostNonce, strSubVersion, nMyStartingHeight, ::fRelayTxes);
}
-banmap_t CNode::setBanned;
-CCriticalSection CNode::cs_setBanned;
-bool CNode::setBannedIsDirty;
-
-void CNode::ClearBanned()
+void CConnman::ClearBanned()
{
- LOCK(cs_setBanned);
- setBanned.clear();
- setBannedIsDirty = true;
+ {
+ LOCK(cs_setBanned);
+ setBanned.clear();
+ setBannedIsDirty = true;
+ }
+ DumpBanlist(); //store banlist to disk
+ if(clientInterface)
+ clientInterface->BannedListChanged();
}
-bool CNode::IsBanned(CNetAddr ip)
+bool CConnman::IsBanned(CNetAddr ip)
{
bool fResult = false;
{
@@ -495,7 +491,7 @@ bool CNode::IsBanned(CNetAddr ip)
return fResult;
}
-bool CNode::IsBanned(CSubNet subnet)
+bool CConnman::IsBanned(CSubNet subnet)
{
bool fResult = false;
{
@@ -511,12 +507,12 @@ bool CNode::IsBanned(CSubNet subnet)
return fResult;
}
-void CNode::Ban(const CNetAddr& addr, const BanReason &banReason, int64_t bantimeoffset, bool sinceUnixEpoch) {
+void CConnman::Ban(const CNetAddr& addr, const BanReason &banReason, int64_t bantimeoffset, bool sinceUnixEpoch) {
CSubNet subNet(addr);
Ban(subNet, banReason, bantimeoffset, sinceUnixEpoch);
}
-void CNode::Ban(const CSubNet& subNet, const BanReason &banReason, int64_t bantimeoffset, bool sinceUnixEpoch) {
+void CConnman::Ban(const CSubNet& subNet, const BanReason &banReason, int64_t bantimeoffset, bool sinceUnixEpoch) {
CBanEntry banEntry(GetTime());
banEntry.banReason = banReason;
if (bantimeoffset <= 0)
@@ -526,42 +522,60 @@ void CNode::Ban(const CSubNet& subNet, const BanReason &banReason, int64_t banti
}
banEntry.nBanUntil = (sinceUnixEpoch ? 0 : GetTime() )+bantimeoffset;
- LOCK(cs_setBanned);
- if (setBanned[subNet].nBanUntil < banEntry.nBanUntil)
- setBanned[subNet] = banEntry;
-
- setBannedIsDirty = true;
+ {
+ LOCK(cs_setBanned);
+ if (setBanned[subNet].nBanUntil < banEntry.nBanUntil) {
+ setBanned[subNet] = banEntry;
+ setBannedIsDirty = true;
+ }
+ else
+ return;
+ }
+ if(clientInterface)
+ clientInterface->BannedListChanged();
+ {
+ LOCK(cs_vNodes);
+ BOOST_FOREACH(CNode* pnode, vNodes) {
+ if (subNet.Match((CNetAddr)pnode->addr))
+ pnode->fDisconnect = true;
+ }
+ }
+ if(banReason == BanReasonManuallyAdded)
+ DumpBanlist(); //store banlist to disk immediately if user requested ban
}
-bool CNode::Unban(const CNetAddr &addr) {
+bool CConnman::Unban(const CNetAddr &addr) {
CSubNet subNet(addr);
return Unban(subNet);
}
-bool CNode::Unban(const CSubNet &subNet) {
- LOCK(cs_setBanned);
- if (setBanned.erase(subNet))
+bool CConnman::Unban(const CSubNet &subNet) {
{
+ LOCK(cs_setBanned);
+ if (!setBanned.erase(subNet))
+ return false;
setBannedIsDirty = true;
- return true;
}
- return false;
+ if(clientInterface)
+ clientInterface->BannedListChanged();
+ DumpBanlist(); //store banlist to disk immediately
+ return true;
}
-void CNode::GetBanned(banmap_t &banMap)
+void CConnman::GetBanned(banmap_t &banMap)
{
LOCK(cs_setBanned);
banMap = setBanned; //create a thread safe copy
}
-void CNode::SetBanned(const banmap_t &banMap)
+void CConnman::SetBanned(const banmap_t &banMap)
{
LOCK(cs_setBanned);
setBanned = banMap;
setBannedIsDirty = true;
}
-void CNode::SweepBanned()
+void CConnman::SweepBanned()
{
int64_t now = GetTime();
@@ -569,34 +583,33 @@ void CNode::SweepBanned()
banmap_t::iterator it = setBanned.begin();
while(it != setBanned.end())
{
+ CSubNet subNet = (*it).first;
CBanEntry banEntry = (*it).second;
if(now > banEntry.nBanUntil)
{
setBanned.erase(it++);
setBannedIsDirty = true;
+ LogPrint("net", "%s: Removed banned node ip/subnet from banlist.dat: %s\n", __func__, subNet.ToString());
}
else
++it;
}
}
-bool CNode::BannedSetIsDirty()
+bool CConnman::BannedSetIsDirty()
{
LOCK(cs_setBanned);
return setBannedIsDirty;
}
-void CNode::SetBannedSetDirty(bool dirty)
+void CConnman::SetBannedSetDirty(bool dirty)
{
LOCK(cs_setBanned); //reuse setBanned lock for the isDirty flag
setBannedIsDirty = dirty;
}
-std::vector<CSubNet> CNode::vWhitelistedRange;
-CCriticalSection CNode::cs_vWhitelistedRange;
-
-bool CNode::IsWhitelistedRange(const CNetAddr &addr) {
+bool CConnman::IsWhitelistedRange(const CNetAddr &addr) {
LOCK(cs_vWhitelistedRange);
BOOST_FOREACH(const CSubNet& subnet, vWhitelistedRange) {
if (subnet.Match(addr))
@@ -605,7 +618,7 @@ bool CNode::IsWhitelistedRange(const CNetAddr &addr) {
return false;
}
-void CNode::AddWhitelistedRange(const CSubNet &subnet) {
+void CConnman::AddWhitelistedRange(const CSubNet &subnet) {
LOCK(cs_vWhitelistedRange);
vWhitelistedRange.push_back(subnet);
}
@@ -616,6 +629,7 @@ void CNode::copyStats(CNodeStats &stats)
{
stats.nodeid = this->GetId();
X(nServices);
+ X(addr);
X(fRelayTxes);
X(nLastSend);
X(nLastRecv);
@@ -627,7 +641,9 @@ void CNode::copyStats(CNodeStats &stats)
X(fInbound);
X(nStartingHeight);
X(nSendBytes);
+ X(mapSendBytesPerMsgCmd);
X(nRecvBytes);
+ X(mapRecvBytesPerMsgCmd);
X(fWhitelisted);
// It is common for nodes with good ping times to suddenly become lagged,
@@ -652,8 +668,9 @@ void CNode::copyStats(CNodeStats &stats)
#undef X
// requires LOCK(cs_vRecvMsg)
-bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes)
+bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes, bool& complete)
{
+ complete = false;
while (nBytes > 0) {
// get current incomplete message, or create a new one
@@ -682,8 +699,17 @@ bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes)
nBytes -= handled;
if (msg.complete()) {
+
+ //store received bytes per message command
+ //to prevent a memory DOS, only allow valid commands
+ mapMsgCmdSize::iterator i = mapRecvBytesPerMsgCmd.find(msg.hdr.pchCommand);
+ if (i == mapRecvBytesPerMsgCmd.end())
+ i = mapRecvBytesPerMsgCmd.find(NET_MESSAGE_COMMAND_OTHER);
+ assert(i != mapRecvBytesPerMsgCmd.end());
+ i->second += msg.hdr.nMessageSize + CMessageHeader::HEADER_SIZE;
+
msg.nTime = GetTimeMicros();
- messageHandlerCondition.notify_one();
+ complete = true;
}
}
@@ -746,9 +772,10 @@ int CNetMessage::readData(const char *pch, unsigned int nBytes)
// requires LOCK(cs_vSend)
-void SocketSendData(CNode *pnode)
+size_t SocketSendData(CNode *pnode)
{
std::deque<CSerializeData>::iterator it = pnode->vSendMsg.begin();
+ size_t nSentSize = 0;
while (it != pnode->vSendMsg.end()) {
const CSerializeData &data = *it;
@@ -758,7 +785,7 @@ void SocketSendData(CNode *pnode)
pnode->nLastSend = GetTime();
pnode->nSendBytes += nBytes;
pnode->nSendOffset += nBytes;
- pnode->RecordBytesSent(nBytes);
+ nSentSize += nBytes;
if (pnode->nSendOffset == data.size()) {
pnode->nSendOffset = 0;
pnode->nSendSize -= data.size();
@@ -787,91 +814,65 @@ void SocketSendData(CNode *pnode)
assert(pnode->nSendSize == 0);
}
pnode->vSendMsg.erase(pnode->vSendMsg.begin(), it);
+ return nSentSize;
}
-static list<CNode*> vNodesDisconnected;
-
-class CNodeRef {
-public:
- CNodeRef(CNode *pnode) : _pnode(pnode) {
- LOCK(cs_vNodes);
- _pnode->AddRef();
- }
-
- ~CNodeRef() {
- LOCK(cs_vNodes);
- _pnode->Release();
- }
-
- CNode& operator *() const {return *_pnode;};
- CNode* operator ->() const {return _pnode;};
-
- CNodeRef& operator =(const CNodeRef& other)
- {
- if (this != &other) {
- LOCK(cs_vNodes);
-
- _pnode->Release();
- _pnode = other._pnode;
- _pnode->AddRef();
- }
- return *this;
- }
-
- CNodeRef(const CNodeRef& other):
- _pnode(other._pnode)
- {
- LOCK(cs_vNodes);
- _pnode->AddRef();
- }
-private:
- CNode *_pnode;
+struct NodeEvictionCandidate
+{
+ NodeId id;
+ int64_t nTimeConnected;
+ int64_t nMinPingUsecTime;
+ int64_t nLastBlockTime;
+ int64_t nLastTXTime;
+ bool fNetworkNode;
+ bool fRelayTxes;
+ bool fBloomFilter;
+ CAddress addr;
+ uint64_t nKeyedNetGroup;
};
-static bool ReverseCompareNodeMinPingTime(const CNodeRef &a, const CNodeRef &b)
+static bool ReverseCompareNodeMinPingTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
{
- return a->nMinPingUsecTime > b->nMinPingUsecTime;
+ return a.nMinPingUsecTime > b.nMinPingUsecTime;
}
-static bool ReverseCompareNodeTimeConnected(const CNodeRef &a, const CNodeRef &b)
+static bool ReverseCompareNodeTimeConnected(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
{
- return a->nTimeConnected > b->nTimeConnected;
+ return a.nTimeConnected > b.nTimeConnected;
}
-class CompareNetGroupKeyed
-{
- std::vector<unsigned char> vchSecretKey;
-public:
- CompareNetGroupKeyed()
- {
- vchSecretKey.resize(32, 0);
- GetRandBytes(vchSecretKey.data(), vchSecretKey.size());
- }
-
- bool operator()(const CNodeRef &a, const CNodeRef &b)
- {
- std::vector<unsigned char> vchGroupA, vchGroupB;
- CSHA256 hashA, hashB;
- std::vector<unsigned char> vchA(32), vchB(32);
-
- vchGroupA = a->addr.GetGroup();
- vchGroupB = b->addr.GetGroup();
-
- hashA.Write(begin_ptr(vchGroupA), vchGroupA.size());
- hashB.Write(begin_ptr(vchGroupB), vchGroupB.size());
-
- hashA.Write(begin_ptr(vchSecretKey), vchSecretKey.size());
- hashB.Write(begin_ptr(vchSecretKey), vchSecretKey.size());
+static bool CompareNetGroupKeyed(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) {
+ return a.nKeyedNetGroup < b.nKeyedNetGroup;
+}
- hashA.Finalize(begin_ptr(vchA));
- hashB.Finalize(begin_ptr(vchB));
+static bool CompareNodeBlockTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
+{
+ // There is a fall-through here because it is common for a node to have many peers which have not yet relayed a block.
+ if (a.nLastBlockTime != b.nLastBlockTime) return a.nLastBlockTime < b.nLastBlockTime;
+ if (a.fNetworkNode != b.fNetworkNode) return b.fNetworkNode;
+ return a.nTimeConnected > b.nTimeConnected;
+}
- return vchA < vchB;
- }
-};
+static bool CompareNodeTXTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
+{
+ // There is a fall-through here because it is common for a node to have more than a few peers that have not yet relayed txn.
+ if (a.nLastTXTime != b.nLastTXTime) return a.nLastTXTime < b.nLastTXTime;
+ if (a.fRelayTxes != b.fRelayTxes) return b.fRelayTxes;
+ if (a.fBloomFilter != b.fBloomFilter) return a.fBloomFilter;
+ return a.nTimeConnected > b.nTimeConnected;
+}
-static bool AttemptToEvictConnection(bool fPreferNewConnection) {
- std::vector<CNodeRef> vEvictionCandidates;
+/** Try to find a connection to evict when the node is full.
+ * Extreme care must be taken to avoid opening the node to attacker
+ * triggered network partitioning.
+ * The strategy used here is to protect a small number of peers
+ * for each of several distinct characteristics which are difficult
+ * to forge. In order to partition a node the attacker must be
+ * simultaneously better at all of them than honest peers.
+ */
+bool CConnman::AttemptToEvictConnection()
+{
+ std::vector<NodeEvictionCandidate> vEvictionCandidates;
{
LOCK(cs_vNodes);
@@ -882,9 +883,10 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) {
continue;
if (node->fDisconnect)
continue;
- if (node->addr.IsLocal())
- continue;
- vEvictionCandidates.push_back(CNodeRef(node));
+ NodeEvictionCandidate candidate = {node->id, node->nTimeConnected, node->nMinPingUsecTime,
+ node->nLastBlockTime, node->nLastTXTime, node->fNetworkNode,
+ node->fRelayTxes, node->pfilter != NULL, node->addr, node->nKeyedNetGroup};
+ vEvictionCandidates.push_back(candidate);
}
}
@@ -893,69 +895,87 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) {
// Protect connections with certain characteristics
// Deterministically select 4 peers to protect by netgroup.
- // An attacker cannot predict which netgroups will be protected.
- static CompareNetGroupKeyed comparerNetGroupKeyed;
- std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), comparerNetGroupKeyed);
+ // An attacker cannot predict which netgroups will be protected
+ std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), CompareNetGroupKeyed);
vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(4, static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end());
if (vEvictionCandidates.empty()) return false;
- // Protect the 8 nodes with the best ping times.
+ // Protect the 8 nodes with the lowest minimum ping time.
// An attacker cannot manipulate this metric without physically moving nodes closer to the target.
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeMinPingTime);
vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(8, static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end());
if (vEvictionCandidates.empty()) return false;
+ // Protect 4 nodes that most recently sent us transactions.
+ // An attacker cannot manipulate this metric without performing useful work.
+ std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), CompareNodeTXTime);
+ vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(4, static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end());
+
+ if (vEvictionCandidates.empty()) return false;
+
+ // Protect 4 nodes that most recently sent us blocks.
+ // An attacker cannot manipulate this metric without performing useful work.
+ std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), CompareNodeBlockTime);
+ vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(4, static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end());
+
+ if (vEvictionCandidates.empty()) return false;
+
// Protect the half of the remaining nodes which have been connected the longest.
- // This replicates the existing implicit behavior.
+ // This replicates the non-eviction implicit behavior, and precludes attacks that start later.
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeTimeConnected);
vEvictionCandidates.erase(vEvictionCandidates.end() - static_cast<int>(vEvictionCandidates.size() / 2), vEvictionCandidates.end());
if (vEvictionCandidates.empty()) return false;
- // Identify the network group with the most connections
- std::vector<unsigned char> naMostConnections;
+ // Identify the network group with the most connections and youngest member.
+ // (vEvictionCandidates is already sorted by reverse connect time)
+ uint64_t naMostConnections;
unsigned int nMostConnections = 0;
- std::map<std::vector<unsigned char>, std::vector<CNodeRef> > mapAddrCounts;
- BOOST_FOREACH(const CNodeRef &node, vEvictionCandidates) {
- mapAddrCounts[node->addr.GetGroup()].push_back(node);
-
- if (mapAddrCounts[node->addr.GetGroup()].size() > nMostConnections) {
- nMostConnections = mapAddrCounts[node->addr.GetGroup()].size();
- naMostConnections = node->addr.GetGroup();
+ int64_t nMostConnectionsTime = 0;
+ std::map<uint64_t, std::vector<NodeEvictionCandidate> > mapNetGroupNodes;
+ BOOST_FOREACH(const NodeEvictionCandidate &node, vEvictionCandidates) {
+ mapNetGroupNodes[node.nKeyedNetGroup].push_back(node);
+ int64_t grouptime = mapNetGroupNodes[node.nKeyedNetGroup][0].nTimeConnected;
+ size_t groupsize = mapNetGroupNodes[node.nKeyedNetGroup].size();
+
+ if (groupsize > nMostConnections || (groupsize == nMostConnections && grouptime > nMostConnectionsTime)) {
+ nMostConnections = groupsize;
+ nMostConnectionsTime = grouptime;
+ naMostConnections = node.nKeyedNetGroup;
}
}
// Reduce to the network group with the most connections
- vEvictionCandidates = mapAddrCounts[naMostConnections];
+ vEvictionCandidates = std::move(mapNetGroupNodes[naMostConnections]);
- // Do not disconnect peers if there is only 1 connection from their network group
- if (vEvictionCandidates.size() <= 1)
- // unless we prefer the new connection (for whitelisted peers)
- if (!fPreferNewConnection)
- return false;
-
- // Disconnect the most recent connection from the network group with the most connections
- std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeTimeConnected);
- vEvictionCandidates[0]->fDisconnect = true;
-
- return true;
+ // Disconnect from the network group with the most connections
+ NodeId evicted = vEvictionCandidates.front().id;
+ LOCK(cs_vNodes);
+ for(std::vector<CNode*>::const_iterator it(vNodes.begin()); it != vNodes.end(); ++it) {
+ if ((*it)->GetId() == evicted) {
+ (*it)->fDisconnect = true;
+ return true;
+ }
+ }
+ return false;
}
-static void AcceptConnection(const ListenSocket& hListenSocket) {
+void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
struct sockaddr_storage sockaddr;
socklen_t len = sizeof(sockaddr);
SOCKET hSocket = accept(hListenSocket.socket, (struct sockaddr*)&sockaddr, &len);
CAddress addr;
int nInbound = 0;
- int nMaxInbound = nMaxConnections - MAX_OUTBOUND_CONNECTIONS;
+ int nMaxInbound = nMaxConnections - (nMaxOutbound + nMaxFeeler);
+ assert(nMaxInbound > 0);
if (hSocket != INVALID_SOCKET)
if (!addr.SetSockAddr((const struct sockaddr*)&sockaddr))
LogPrintf("Warning: Unknown socket family\n");
- bool whitelisted = hListenSocket.whitelisted || CNode::IsWhitelistedRange(addr);
+ bool whitelisted = hListenSocket.whitelisted || IsWhitelistedRange(addr);
{
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
@@ -987,7 +1007,7 @@ static void AcceptConnection(const ListenSocket& hListenSocket) {
setsockopt(hSocket, IPPROTO_TCP, TCP_NODELAY, (void*)&set, sizeof(int));
#endif
- if (CNode::IsBanned(addr) && !whitelisted)
+ if (IsBanned(addr) && !whitelisted)
{
LogPrintf("connection from %s dropped (banned)\n", addr.ToString());
CloseSocket(hSocket);
@@ -996,7 +1016,7 @@ static void AcceptConnection(const ListenSocket& hListenSocket) {
if (nInbound >= nMaxInbound)
{
- if (!AttemptToEvictConnection(whitelisted)) {
+ if (!AttemptToEvictConnection()) {
// No connection to evict, disconnect the new connection
LogPrint("net", "failed to find an eviction candidate - connection dropped (full)\n");
CloseSocket(hSocket);
@@ -1004,7 +1024,8 @@ static void AcceptConnection(const ListenSocket& hListenSocket) {
}
}
- CNode* pnode = new CNode(hSocket, addr, "", true);
+ CNode* pnode = new CNode(GetNewNodeId(), nLocalServices, GetBestHeight(), hSocket, addr, CalculateKeyedNetGroup(addr), "", true);
+ GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
pnode->AddRef();
pnode->fWhitelisted = whitelisted;
@@ -1016,7 +1037,7 @@ static void AcceptConnection(const ListenSocket& hListenSocket) {
}
}
-void ThreadSocketHandler()
+void CConnman::ThreadSocketHandler()
{
unsigned int nPrevNodeCount = 0;
while (true)
@@ -1027,7 +1048,7 @@ void ThreadSocketHandler()
{
LOCK(cs_vNodes);
// Disconnect unused nodes
- vector<CNode*> vNodesCopy = vNodes;
+ std::vector<CNode*> vNodesCopy = vNodes;
BOOST_FOREACH(CNode* pnode, vNodesCopy)
{
if (pnode->fDisconnect ||
@@ -1051,7 +1072,7 @@ void ThreadSocketHandler()
}
{
// Delete disconnected nodes
- list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected;
+ std::list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected;
BOOST_FOREACH(CNode* pnode, vNodesDisconnectedCopy)
{
// wait until threads are done using it
@@ -1074,14 +1095,15 @@ void ThreadSocketHandler()
if (fDelete)
{
vNodesDisconnected.remove(pnode);
- delete pnode;
+ DeleteNode(pnode);
}
}
}
}
if(vNodes.size() != nPrevNodeCount) {
nPrevNodeCount = vNodes.size();
- uiInterface.NotifyNumConnectionsChanged(nPrevNodeCount);
+ if(clientInterface)
+ clientInterface->NotifyNumConnectionsChanged(nPrevNodeCount);
}
//
@@ -1102,7 +1124,7 @@ void ThreadSocketHandler()
BOOST_FOREACH(const ListenSocket& hListenSocket, vhListenSocket) {
FD_SET(hListenSocket.socket, &fdsetRecv);
- hSocketMax = max(hSocketMax, hListenSocket.socket);
+ hSocketMax = std::max(hSocketMax, hListenSocket.socket);
have_fds = true;
}
@@ -1113,7 +1135,7 @@ void ThreadSocketHandler()
if (pnode->hSocket == INVALID_SOCKET)
continue;
FD_SET(pnode->hSocket, &fdsetError);
- hSocketMax = max(hSocketMax, pnode->hSocket);
+ hSocketMax = std::max(hSocketMax, pnode->hSocket);
have_fds = true;
// Implement the following logic:
@@ -1133,16 +1155,22 @@ void ThreadSocketHandler()
// * We process a message in the buffer (message handler thread).
{
TRY_LOCK(pnode->cs_vSend, lockSend);
- if (lockSend && !pnode->vSendMsg.empty()) {
- FD_SET(pnode->hSocket, &fdsetSend);
- continue;
+ if (lockSend) {
+ if (pnode->nOptimisticBytesWritten) {
+ RecordBytesSent(pnode->nOptimisticBytesWritten);
+ pnode->nOptimisticBytesWritten = 0;
+ }
+ if (!pnode->vSendMsg.empty()) {
+ FD_SET(pnode->hSocket, &fdsetSend);
+ continue;
+ }
}
}
{
TRY_LOCK(pnode->cs_vRecvMsg, lockRecv);
if (lockRecv && (
pnode->vRecvMsg.empty() || !pnode->vRecvMsg.front().complete() ||
- pnode->GetTotalRecvSize() <= ReceiveFloodSize()))
+ pnode->GetTotalRecvSize() <= GetReceiveFloodSize()))
FD_SET(pnode->hSocket, &fdsetRecv);
}
}
@@ -1180,7 +1208,7 @@ void ThreadSocketHandler()
//
// Service each socket
//
- vector<CNode*> vNodesCopy;
+ std::vector<CNode*> vNodesCopy;
{
LOCK(cs_vNodes);
vNodesCopy = vNodes;
@@ -1207,11 +1235,14 @@ void ThreadSocketHandler()
int nBytes = recv(pnode->hSocket, pchBuf, sizeof(pchBuf), MSG_DONTWAIT);
if (nBytes > 0)
{
- if (!pnode->ReceiveMsgBytes(pchBuf, nBytes))
+ bool notify = false;
+ if (!pnode->ReceiveMsgBytes(pchBuf, nBytes, notify))
pnode->CloseSocketDisconnect();
+ if(notify)
+ messageHandlerCondition.notify_one();
pnode->nLastRecv = GetTime();
pnode->nRecvBytes += nBytes;
- pnode->RecordBytesRecv(nBytes);
+ RecordBytesRecv(nBytes);
}
else if (nBytes == 0)
{
@@ -1243,8 +1274,11 @@ void ThreadSocketHandler()
if (FD_ISSET(pnode->hSocket, &fdsetSend))
{
TRY_LOCK(pnode->cs_vSend, lockSend);
- if (lockSend)
- SocketSendData(pnode);
+ if (lockSend) {
+ size_t nBytes = SocketSendData(pnode);
+ if (nBytes)
+ RecordBytesSent(nBytes);
+ }
}
//
@@ -1329,15 +1363,18 @@ void ThreadMapPort()
{
if(externalIPAddress[0])
{
- LogPrintf("UPnP: ExternalIPAddress = %s\n", externalIPAddress);
- AddLocal(CNetAddr(externalIPAddress), LOCAL_UPNP);
+ CNetAddr resolved;
+ if(LookupHost(externalIPAddress, resolved, false)) {
+ LogPrintf("UPnP: ExternalIPAddress = %s\n", resolved.ToString().c_str());
+ AddLocal(resolved, LOCAL_UPNP);
+ }
}
else
LogPrintf("UPnP: GetExternalIPAddress failed.\n");
}
}
- string strDesc = "Bitcoin " + FormatFullVersion();
+ std::string strDesc = "Bitcoin " + FormatFullVersion();
try {
while (true) {
@@ -1355,7 +1392,7 @@ void ThreadMapPort()
LogPrintf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",
port, port, lanaddr, r, strupnperror(r));
else
- LogPrintf("UPnP Port Mapping successful.\n");;
+ LogPrintf("UPnP Port Mapping successful.\n");
MilliSleep(20*60*1000); // Refresh every 20 minutes
}
@@ -1409,7 +1446,20 @@ void MapPort(bool)
-void ThreadDNSAddressSeed()
+static std::string GetDNSHost(const CDNSSeedData& data, ServiceFlags* requiredServiceBits)
+{
+ //use default host for non-filter-capable seeds or if we use the default service bits (NODE_NETWORK)
+ if (!data.supportsServiceBitsFiltering || *requiredServiceBits == NODE_NETWORK) {
+ *requiredServiceBits = NODE_NETWORK;
+ return data.host;
+ }
+
+ // See chainparams.cpp, most dnsseeds only support one or two possible servicebits hostnames
+ return strprintf("x%x.%s", *requiredServiceBits, data.host);
+}
+
+
+void CConnman::ThreadDNSAddressSeed()
{
// goal: only query DNS seeds if address need is acute
if ((addrman.size() > 0) &&
@@ -1423,7 +1473,7 @@ void ThreadDNSAddressSeed()
}
}
- const vector<CDNSSeedData> &vSeeds = Params().DNSSeeds();
+ const std::vector<CDNSSeedData> &vSeeds = Params().DNSSeeds();
int found = 0;
LogPrintf("Loading addresses from DNS seeds (could take a while)\n");
@@ -1432,20 +1482,29 @@ void ThreadDNSAddressSeed()
if (HaveNameProxy()) {
AddOneShot(seed.host);
} else {
- vector<CNetAddr> vIPs;
- vector<CAddress> vAdd;
- if (LookupHost(seed.host.c_str(), vIPs))
+ std::vector<CNetAddr> vIPs;
+ std::vector<CAddress> vAdd;
+ ServiceFlags requiredServiceBits = nRelevantServices;
+ if (LookupHost(GetDNSHost(seed, &requiredServiceBits).c_str(), vIPs, 0, true))
{
BOOST_FOREACH(const CNetAddr& ip, vIPs)
{
int nOneDay = 24*3600;
- CAddress addr = CAddress(CService(ip, Params().GetDefaultPort()));
+ CAddress addr = CAddress(CService(ip, Params().GetDefaultPort()), requiredServiceBits);
addr.nTime = GetTime() - 3*nOneDay - GetRand(4*nOneDay); // use a random age between 3 and 7 days old
vAdd.push_back(addr);
found++;
}
}
- addrman.Add(vAdd, CNetAddr(seed.name, true));
+ // TODO: The seed name resolve may fail, yielding an IP of [::], which results in
+ // addrman assigning the same source to results from different seeds.
+ // This should switch to a hard-coded stable dummy IP for each seed name, so that the
+ // resolve is not required at all.
+ if (!vIPs.empty()) {
+ CService seedSource;
+ Lookup(seed.name.c_str(), seedSource, 0, true);
+ addrman.Add(vAdd, seedSource);
+ }
}
}
@@ -1463,7 +1522,7 @@ void ThreadDNSAddressSeed()
-void DumpAddresses()
+void CConnman::DumpAddresses()
{
int64_t nStart = GetTimeMillis();
@@ -1474,20 +1533,15 @@ void DumpAddresses()
addrman.size(), GetTimeMillis() - nStart);
}
-void DumpData()
+void CConnman::DumpData()
{
DumpAddresses();
-
- if (CNode::BannedSetIsDirty())
- {
- DumpBanlist();
- CNode::SetBannedSetDirty(false);
- }
+ DumpBanlist();
}
-void static ProcessOneShot()
+void CConnman::ProcessOneShot()
{
- string strDest;
+ std::string strDest;
{
LOCK(cs_vOneShots);
if (vOneShots.empty())
@@ -1498,12 +1552,12 @@ void static ProcessOneShot()
CAddress addr;
CSemaphoreGrant grant(*semOutbound, true);
if (grant) {
- if (!OpenNetworkConnection(addr, &grant, strDest.c_str(), true))
+ if (!OpenNetworkConnection(addr, false, &grant, strDest.c_str(), true))
AddOneShot(strDest);
}
}
-void ThreadOpenConnections()
+void CConnman::ThreadOpenConnections()
{
// Connect to specific addresses
if (mapArgs.count("-connect") && mapMultiArgs["-connect"].size() > 0)
@@ -1513,8 +1567,8 @@ void ThreadOpenConnections()
ProcessOneShot();
BOOST_FOREACH(const std::string& strAddr, mapMultiArgs["-connect"])
{
- CAddress addr;
- OpenNetworkConnection(addr, NULL, strAddr.c_str());
+ CAddress addr(CService(), NODE_NONE);
+ OpenNetworkConnection(addr, false, NULL, strAddr.c_str());
for (int i = 0; i < 10 && i < nLoop; i++)
{
MilliSleep(500);
@@ -1526,6 +1580,9 @@ void ThreadOpenConnections()
// Initiate network connections
int64_t nStart = GetTime();
+
+ // Minimum time before next feeler connection (in microseconds).
+ int64_t nNextFeeler = PoissonNextSend(nStart*1000*1000, FEELER_INTERVAL);
while (true)
{
ProcessOneShot();
@@ -1540,7 +1597,9 @@ void ThreadOpenConnections()
static bool done = false;
if (!done) {
LogPrintf("Adding fixed seed nodes as DNS doesn't seem to be available.\n");
- addrman.Add(convertSeed6(Params().FixedSeeds()), CNetAddr("127.0.0.1"));
+ CNetAddr local;
+ LookupHost("127.0.0.1", local, false);
+ addrman.Add(convertSeed6(Params().FixedSeeds()), local);
done = true;
}
}
@@ -1553,7 +1612,7 @@ void ThreadOpenConnections()
// Only connect out to one peer per network group (/16 for IPv4).
// Do this here so we don't have to critsect vNodes inside mapAddresses critsect.
int nOutbound = 0;
- set<vector<unsigned char> > setConnected;
+ std::set<std::vector<unsigned char> > setConnected;
{
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes) {
@@ -1563,13 +1622,36 @@ void ThreadOpenConnections()
}
}
}
+ assert(nOutbound <= (nMaxOutbound + nMaxFeeler));
- int64_t nANow = GetAdjustedTime();
+ // Feeler Connections
+ //
+ // Design goals:
+ // * Increase the number of connectable addresses in the tried table.
+ //
+ // Method:
+ // * Choose a random address from new and attempt to connect to it if we can connect
+ // successfully it is added to tried.
+ // * Start attempting feeler connections only after node finishes making outbound
+ // connections.
+ // * Only make a feeler connection once every few minutes.
+ //
+ bool fFeeler = false;
+ if (nOutbound >= nMaxOutbound) {
+ int64_t nTime = GetTimeMicros(); // The current time right now (in microseconds).
+ if (nTime > nNextFeeler) {
+ nNextFeeler = PoissonNextSend(nTime, FEELER_INTERVAL);
+ fFeeler = true;
+ } else {
+ continue;
+ }
+ }
+ int64_t nANow = GetAdjustedTime();
int nTries = 0;
while (true)
{
- CAddrInfo addr = addrman.Select();
+ CAddrInfo addr = addrman.Select(fFeeler);
// if we selected an invalid address, restart
if (!addr.IsValid() || setConnected.count(addr.GetGroup()) || IsLocal(addr))
@@ -1585,10 +1667,18 @@ void ThreadOpenConnections()
if (IsLimited(addr))
continue;
+ // only connect to full nodes
+ if ((addr.nServices & REQUIRED_SERVICES) != REQUIRED_SERVICES)
+ continue;
+
// only consider very recently tried nodes after 30 failed attempts
if (nANow - addr.nLastTry < 600 && nTries < 30)
continue;
+ // only consider nodes missing relevant services after 40 failed attempts
+ if ((addr.nServices & nRelevantServices) != nRelevantServices && nTries < 40)
+ continue;
+
// do not allow non-default ports, unless after 50 invalid addresses selected already
if (addr.GetPort() != Params().GetDefaultPort() && nTries < 50)
continue;
@@ -1597,84 +1687,99 @@ void ThreadOpenConnections()
break;
}
- if (addrConnect.IsValid())
- OpenNetworkConnection(addrConnect, &grant);
+ if (addrConnect.IsValid()) {
+
+ if (fFeeler) {
+ // Add small amount of random noise before connection to avoid synchronization.
+ int randsleep = GetRandInt(FEELER_SLEEP_WINDOW * 1000);
+ MilliSleep(randsleep);
+ LogPrint("net", "Making feeler connection to %s\n", addrConnect.ToString());
+ }
+
+ OpenNetworkConnection(addrConnect, (int)setConnected.size() >= std::min(nMaxConnections - 1, 2), &grant, NULL, false, fFeeler);
+ }
}
}
-void ThreadOpenAddedConnections()
+std::vector<AddedNodeInfo> CConnman::GetAddedNodeInfo()
{
+ std::vector<AddedNodeInfo> ret;
+
+ std::list<std::string> lAddresses(0);
{
LOCK(cs_vAddedNodes);
- vAddedNodes = mapMultiArgs["-addnode"];
+ ret.reserve(vAddedNodes.size());
+ BOOST_FOREACH(const std::string& strAddNode, vAddedNodes)
+ lAddresses.push_back(strAddNode);
}
- if (HaveNameProxy()) {
- while(true) {
- list<string> lAddresses(0);
- {
- LOCK(cs_vAddedNodes);
- BOOST_FOREACH(const std::string& strAddNode, vAddedNodes)
- lAddresses.push_back(strAddNode);
+
+ // Build a map of all already connected addresses (by IP:port and by name) to inbound/outbound and resolved CService
+ std::map<CService, bool> mapConnected;
+ std::map<std::string, std::pair<bool, CService>> mapConnectedByName;
+ {
+ LOCK(cs_vNodes);
+ for (const CNode* pnode : vNodes) {
+ if (pnode->addr.IsValid()) {
+ mapConnected[pnode->addr] = pnode->fInbound;
}
- BOOST_FOREACH(const std::string& strAddNode, lAddresses) {
- CAddress addr;
- CSemaphoreGrant grant(*semOutbound);
- OpenNetworkConnection(addr, &grant, strAddNode.c_str());
- MilliSleep(500);
+ if (!pnode->addrName.empty()) {
+ mapConnectedByName[pnode->addrName] = std::make_pair(pnode->fInbound, static_cast<const CService&>(pnode->addr));
}
- MilliSleep(120000); // Retry every 2 minutes
}
}
- for (unsigned int i = 0; true; i++)
- {
- list<string> lAddresses(0);
- {
- LOCK(cs_vAddedNodes);
- BOOST_FOREACH(const std::string& strAddNode, vAddedNodes)
- lAddresses.push_back(strAddNode);
+ BOOST_FOREACH(const std::string& strAddNode, lAddresses) {
+ CService service(LookupNumeric(strAddNode.c_str(), Params().GetDefaultPort()));
+ if (service.IsValid()) {
+ // strAddNode is an IP:port
+ auto it = mapConnected.find(service);
+ if (it != mapConnected.end()) {
+ ret.push_back(AddedNodeInfo{strAddNode, service, true, it->second});
+ } else {
+ ret.push_back(AddedNodeInfo{strAddNode, CService(), false, false});
+ }
+ } else {
+ // strAddNode is a name
+ auto it = mapConnectedByName.find(strAddNode);
+ if (it != mapConnectedByName.end()) {
+ ret.push_back(AddedNodeInfo{strAddNode, it->second.second, true, it->second.first});
+ } else {
+ ret.push_back(AddedNodeInfo{strAddNode, CService(), false, false});
+ }
}
+ }
- list<vector<CService> > lservAddressesToAdd(0);
- 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(const CService& serv, vservNode)
- setservAddNodeAddresses.insert(serv);
- }
+ return ret;
+}
+
+void CConnman::ThreadOpenAddedConnections()
+{
+ {
+ LOCK(cs_vAddedNodes);
+ vAddedNodes = mapMultiArgs["-addnode"];
+ }
+
+ for (unsigned int i = 0; true; i++)
+ {
+ std::vector<AddedNodeInfo> vInfo = GetAddedNodeInfo();
+ for (const AddedNodeInfo& info : vInfo) {
+ if (!info.fConnected) {
+ CSemaphoreGrant grant(*semOutbound);
+ // If strAddedNode is an IP/port, decode it immediately, so
+ // OpenNetworkConnection can detect existing connections to that IP/port.
+ CService service(LookupNumeric(info.strAddedNode.c_str(), Params().GetDefaultPort()));
+ OpenNetworkConnection(CAddress(service, NODE_NONE), false, &grant, info.strAddedNode.c_str(), false);
+ MilliSleep(500);
}
}
- // Attempt to connect to each IP for each addnode entry until at least one is successful per addnode entry
- // (keeping in mind that addnode entries can have many IPs if fNameLookup)
- {
- LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodes)
- for (list<vector<CService> >::iterator it = lservAddressesToAdd.begin(); it != lservAddressesToAdd.end(); it++)
- BOOST_FOREACH(const CService& addrNode, *(it))
- if (pnode->addr == addrNode)
- {
- it = lservAddressesToAdd.erase(it);
- it--;
- break;
- }
- }
- BOOST_FOREACH(vector<CService>& vserv, lservAddressesToAdd)
- {
- CSemaphoreGrant grant(*semOutbound);
- OpenNetworkConnection(CAddress(vserv[i % vserv.size()]), &grant);
- MilliSleep(500);
- }
+
MilliSleep(120000); // Retry every 2 minutes
}
}
// if successful, this moves the passed grant to the constructed node
-bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound, const char *pszDest, bool fOneShot)
+bool CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound, const char *pszDest, bool fOneShot, bool fFeeler)
{
//
// Initiate outbound network connection
@@ -1682,13 +1787,13 @@ bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOu
boost::this_thread::interruption_point();
if (!pszDest) {
if (IsLocal(addrConnect) ||
- FindNode((CNetAddr)addrConnect) || CNode::IsBanned(addrConnect) ||
+ FindNode((CNetAddr)addrConnect) || IsBanned(addrConnect) ||
FindNode(addrConnect.ToStringIPPort()))
return false;
} else if (FindNode(std::string(pszDest)))
return false;
- CNode* pnode = ConnectNode(addrConnect, pszDest);
+ CNode* pnode = ConnectNode(addrConnect, pszDest, fCountFailure);
boost::this_thread::interruption_point();
if (!pnode)
@@ -1698,20 +1803,21 @@ bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOu
pnode->fNetworkNode = true;
if (fOneShot)
pnode->fOneShot = true;
+ if (fFeeler)
+ pnode->fFeeler = true;
return true;
}
-void ThreadMessageHandler()
+void CConnman::ThreadMessageHandler()
{
boost::mutex condition_mutex;
boost::unique_lock<boost::mutex> lock(condition_mutex);
- SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
while (true)
{
- vector<CNode*> vNodesCopy;
+ std::vector<CNode*> vNodesCopy;
{
LOCK(cs_vNodes);
vNodesCopy = vNodes;
@@ -1720,11 +1826,6 @@ void ThreadMessageHandler()
}
}
- // Poll the connected nodes for messages
- CNode* pnodeTrickle = NULL;
- if (!vNodesCopy.empty())
- pnodeTrickle = vNodesCopy[GetRand(vNodesCopy.size())];
-
bool fSleep = true;
BOOST_FOREACH(CNode* pnode, vNodesCopy)
@@ -1737,10 +1838,10 @@ void ThreadMessageHandler()
TRY_LOCK(pnode->cs_vRecvMsg, lockRecv);
if (lockRecv)
{
- if (!g_signals.ProcessMessages(pnode))
+ if (!GetNodeSignals().ProcessMessages(pnode, *this))
pnode->CloseSocketDisconnect();
- if (pnode->nSendSize < SendBufferSize())
+ if (pnode->nSendSize < GetSendBufferSize())
{
if (!pnode->vRecvGetData.empty() || (!pnode->vRecvMsg.empty() && pnode->vRecvMsg[0].complete()))
{
@@ -1755,7 +1856,7 @@ void ThreadMessageHandler()
{
TRY_LOCK(pnode->cs_vSend, lockSend);
if (lockSend)
- g_signals.SendMessages(pnode, pnode == pnodeTrickle || pnode->fWhitelisted);
+ GetNodeSignals().SendMessages(pnode, *this);
}
boost::this_thread::interruption_point();
}
@@ -1776,7 +1877,7 @@ void ThreadMessageHandler()
-bool BindListenPort(const CService &addrBind, string& strError, bool fWhitelisted)
+bool CConnman::BindListenPort(const CService &addrBind, std::string& strError, bool fWhitelisted)
{
strError = "";
int nOne = 1;
@@ -1848,7 +1949,7 @@ bool BindListenPort(const CService &addrBind, string& strError, bool fWhiteliste
{
int nErr = WSAGetLastError();
if (nErr == WSAEADDRINUSE)
- strError = strprintf(_("Unable to bind to %s on this computer. Bitcoin Core is probably already running."), addrBind.ToString());
+ strError = strprintf(_("Unable to bind to %s on this computer. %s is probably already running."), addrBind.ToString(), _(PACKAGE_NAME));
else
strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %s)"), addrBind.ToString(), NetworkErrorString(nErr));
LogPrintf("%s\n", strError);
@@ -1874,7 +1975,7 @@ bool BindListenPort(const CService &addrBind, string& strError, bool fWhiteliste
return true;
}
-void static Discover(boost::thread_group& threadGroup)
+void Discover(boost::thread_group& threadGroup)
{
if (!fDiscover)
return;
@@ -1884,8 +1985,8 @@ void static Discover(boost::thread_group& threadGroup)
char pszHostName[256] = "";
if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR)
{
- vector<CNetAddr> vaddr;
- if (LookupHost(pszHostName, vaddr))
+ std::vector<CNetAddr> vaddr;
+ if (LookupHost(pszHostName, vaddr, 0, true))
{
BOOST_FOREACH (const CNetAddr &addr, vaddr)
{
@@ -1925,41 +2026,95 @@ void static Discover(boost::thread_group& threadGroup)
#endif
}
-void StartNode(boost::thread_group& threadGroup, CScheduler& scheduler)
+CConnman::CConnman(uint64_t nSeed0In, uint64_t nSeed1In) : nSeed0(nSeed0In), nSeed1(nSeed1In)
+{
+ setBannedIsDirty = false;
+ fAddressesInitialized = false;
+ nLastNodeId = 0;
+ nSendBufferMaxSize = 0;
+ nReceiveFloodSize = 0;
+ semOutbound = NULL;
+ nMaxConnections = 0;
+ nMaxOutbound = 0;
+ nBestHeight = 0;
+ clientInterface = NULL;
+}
+
+NodeId CConnman::GetNewNodeId()
{
- uiInterface.InitMessage(_("Loading addresses..."));
- // Load addresses for peers.dat
+ return nLastNodeId.fetch_add(1, std::memory_order_relaxed);
+}
+
+bool CConnman::Start(boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError, Options connOptions)
+{
+ nTotalBytesRecv = 0;
+ nTotalBytesSent = 0;
+ nMaxOutboundTotalBytesSentInCycle = 0;
+ nMaxOutboundCycleStartTime = 0;
+
+ nRelevantServices = connOptions.nRelevantServices;
+ nLocalServices = connOptions.nLocalServices;
+ nMaxConnections = connOptions.nMaxConnections;
+ nMaxOutbound = std::min((connOptions.nMaxOutbound), nMaxConnections);
+ nMaxFeeler = connOptions.nMaxFeeler;
+
+ nSendBufferMaxSize = connOptions.nSendBufferMaxSize;
+ nReceiveFloodSize = connOptions.nSendBufferMaxSize;
+
+ nMaxOutboundLimit = connOptions.nMaxOutboundLimit;
+ nMaxOutboundTimeframe = connOptions.nMaxOutboundTimeframe;
+
+ SetBestHeight(connOptions.nBestHeight);
+
+ clientInterface = connOptions.uiInterface;
+ if (clientInterface)
+ clientInterface->InitMessage(_("Loading addresses..."));
+ // Load addresses from peers.dat
int64_t nStart = GetTimeMillis();
{
CAddrDB adb;
- if (!adb.Read(addrman))
+ if (adb.Read(addrman))
+ LogPrintf("Loaded %i addresses from peers.dat %dms\n", addrman.size(), GetTimeMillis() - nStart);
+ else {
+ addrman.Clear(); // Addrman can be in an inconsistent state after failure, reset it
LogPrintf("Invalid or missing peers.dat; recreating\n");
+ DumpAddresses();
+ }
}
-
- //try to read stored banlist
+ if (clientInterface)
+ clientInterface->InitMessage(_("Loading banlist..."));
+ // Load addresses from banlist.dat
+ nStart = GetTimeMillis();
CBanDB bandb;
banmap_t banmap;
- if (!bandb.Read(banmap))
+ if (bandb.Read(banmap)) {
+ SetBanned(banmap); // thread save setter
+ SetBannedSetDirty(false); // no need to write down, just read data
+ SweepBanned(); // sweep out unused entries
+
+ LogPrint("net", "Loaded %d banned node ips/subnets from banlist.dat %dms\n",
+ banmap.size(), GetTimeMillis() - nStart);
+ } else {
LogPrintf("Invalid or missing banlist.dat; recreating\n");
+ SetBannedSetDirty(true); // force write
+ DumpBanlist();
+ }
- CNode::SetBanned(banmap); //thread save setter
- CNode::SetBannedSetDirty(false); //no need to write down just read or nonexistent data
- CNode::SweepBanned(); //sweap out unused entries
+ uiInterface.InitMessage(_("Starting network threads..."));
- LogPrintf("Loaded %i addresses from peers.dat %dms\n",
- addrman.size(), GetTimeMillis() - nStart);
fAddressesInitialized = true;
if (semOutbound == NULL) {
// initialize semaphore
- int nMaxOutbound = min(MAX_OUTBOUND_CONNECTIONS, nMaxConnections);
- semOutbound = new CSemaphore(nMaxOutbound);
+ semOutbound = new CSemaphore(std::min((nMaxOutbound + nMaxFeeler), nMaxConnections));
}
- if (pnodeLocalHost == NULL)
- pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress(CService("127.0.0.1", 0), nLocalServices));
-
- Discover(threadGroup);
+ if (pnodeLocalHost == NULL) {
+ CNetAddr local;
+ LookupHost("127.0.0.1", local, false);
+ pnodeLocalHost = new CNode(GetNewNodeId(), nLocalServices, GetBestHeight(), INVALID_SOCKET, CAddress(CService(local, 0), nLocalServices), 0);
+ GetNodeSignals().InitializeNode(pnodeLocalHost->GetId(), pnodeLocalHost);
+ }
//
// Start threads
@@ -1968,40 +2123,22 @@ void StartNode(boost::thread_group& threadGroup, CScheduler& scheduler)
if (!GetBoolArg("-dnsseed", true))
LogPrintf("DNS seeding disabled\n");
else
- threadGroup.create_thread(boost::bind(&TraceThread<void (*)()>, "dnsseed", &ThreadDNSAddressSeed));
-
- // Map ports with UPnP
- MapPort(GetBoolArg("-upnp", DEFAULT_UPNP));
+ threadGroup.create_thread(boost::bind(&TraceThread<boost::function<void()> >, "dnsseed", boost::function<void()>(boost::bind(&CConnman::ThreadDNSAddressSeed, this))));
// Send and receive from sockets, accept connections
- threadGroup.create_thread(boost::bind(&TraceThread<void (*)()>, "net", &ThreadSocketHandler));
+ threadGroup.create_thread(boost::bind(&TraceThread<boost::function<void()> >, "net", boost::function<void()>(boost::bind(&CConnman::ThreadSocketHandler, this))));
// Initiate outbound connections from -addnode
- threadGroup.create_thread(boost::bind(&TraceThread<void (*)()>, "addcon", &ThreadOpenAddedConnections));
+ threadGroup.create_thread(boost::bind(&TraceThread<boost::function<void()> >, "addcon", boost::function<void()>(boost::bind(&CConnman::ThreadOpenAddedConnections, this))));
// Initiate outbound connections
- threadGroup.create_thread(boost::bind(&TraceThread<void (*)()>, "opencon", &ThreadOpenConnections));
+ threadGroup.create_thread(boost::bind(&TraceThread<boost::function<void()> >, "opencon", boost::function<void()>(boost::bind(&CConnman::ThreadOpenConnections, this))));
// Process messages
- threadGroup.create_thread(boost::bind(&TraceThread<void (*)()>, "msghand", &ThreadMessageHandler));
+ threadGroup.create_thread(boost::bind(&TraceThread<boost::function<void()> >, "msghand", boost::function<void()>(boost::bind(&CConnman::ThreadMessageHandler, this))));
// Dump network addresses
- scheduler.scheduleEvery(&DumpData, DUMP_ADDRESSES_INTERVAL);
-}
-
-bool StopNode()
-{
- LogPrintf("StopNode()\n");
- MapPort(false);
- if (semOutbound)
- for (int i=0; i<MAX_OUTBOUND_CONNECTIONS; i++)
- semOutbound->post();
-
- if (fAddressesInitialized)
- {
- DumpData();
- fAddressesInitialized = false;
- }
+ scheduler.scheduleEvery(boost::bind(&CConnman::DumpData, this), DUMP_ADDRESSES_INTERVAL);
return true;
}
@@ -2013,28 +2150,6 @@ public:
~CNetCleanup()
{
- // Close sockets
- BOOST_FOREACH(CNode* pnode, vNodes)
- if (pnode->hSocket != INVALID_SOCKET)
- CloseSocket(pnode->hSocket);
- BOOST_FOREACH(ListenSocket& hListenSocket, vhListenSocket)
- if (hListenSocket.socket != INVALID_SOCKET)
- if (!CloseSocket(hListenSocket.socket))
- LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
-
- // clean up some globals (to help leak detection)
- BOOST_FOREACH(CNode *pnode, vNodes)
- delete pnode;
- BOOST_FOREACH(CNode *pnode, vNodesDisconnected)
- delete pnode;
- vNodes.clear();
- vNodesDisconnected.clear();
- vhListenSocket.clear();
- delete semOutbound;
- semOutbound = NULL;
- delete pnodeLocalHost;
- pnodeLocalHost = NULL;
-
#ifdef WIN32
// Shutdown Windows Sockets
WSACleanup();
@@ -2043,58 +2158,196 @@ public:
}
instance_of_cnetcleanup;
+void CConnman::Stop()
+{
+ LogPrintf("%s\n",__func__);
+ if (semOutbound)
+ for (int i=0; i<(nMaxOutbound + nMaxFeeler); i++)
+ semOutbound->post();
+ if (fAddressesInitialized)
+ {
+ DumpData();
+ fAddressesInitialized = false;
+ }
+ // Close sockets
+ BOOST_FOREACH(CNode* pnode, vNodes)
+ if (pnode->hSocket != INVALID_SOCKET)
+ CloseSocket(pnode->hSocket);
+ BOOST_FOREACH(ListenSocket& hListenSocket, vhListenSocket)
+ if (hListenSocket.socket != INVALID_SOCKET)
+ if (!CloseSocket(hListenSocket.socket))
+ LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
+ // clean up some globals (to help leak detection)
+ BOOST_FOREACH(CNode *pnode, vNodes) {
+ DeleteNode(pnode);
+ }
+ BOOST_FOREACH(CNode *pnode, vNodesDisconnected) {
+ DeleteNode(pnode);
+ }
+ vNodes.clear();
+ vNodesDisconnected.clear();
+ vhListenSocket.clear();
+ delete semOutbound;
+ semOutbound = NULL;
+ if(pnodeLocalHost)
+ DeleteNode(pnodeLocalHost);
+ pnodeLocalHost = NULL;
+}
+void CConnman::DeleteNode(CNode* pnode)
+{
+ assert(pnode);
+ bool fUpdateConnectionTime = false;
+ GetNodeSignals().FinalizeNode(pnode->GetId(), fUpdateConnectionTime);
+ if(fUpdateConnectionTime)
+ addrman.Connected(pnode->addr);
+ delete pnode;
+}
+CConnman::~CConnman()
+{
+ Stop();
+}
-void RelayTransaction(const CTransaction& tx)
+size_t CConnman::GetAddressCount() const
{
- CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
- ss.reserve(10000);
- ss << tx;
- RelayTransaction(tx, ss);
+ return addrman.size();
}
-void RelayTransaction(const CTransaction& tx, const CDataStream& ss)
+void CConnman::SetServices(const CService &addr, ServiceFlags nServices)
{
- CInv inv(MSG_TX, tx.GetHash());
- {
- LOCK(cs_mapRelay);
- // Expire old relay messages
- while (!vRelayExpiration.empty() && vRelayExpiration.front().first < GetTime())
- {
- mapRelay.erase(vRelayExpiration.front().second);
- vRelayExpiration.pop_front();
+ addrman.SetServices(addr, nServices);
+}
+
+void CConnman::MarkAddressGood(const CAddress& addr)
+{
+ addrman.Good(addr);
+}
+
+void CConnman::AddNewAddress(const CAddress& addr, const CAddress& addrFrom, int64_t nTimePenalty)
+{
+ addrman.Add(addr, addrFrom, nTimePenalty);
+}
+
+void CConnman::AddNewAddresses(const std::vector<CAddress>& vAddr, const CAddress& addrFrom, int64_t nTimePenalty)
+{
+ addrman.Add(vAddr, addrFrom, nTimePenalty);
+}
+
+std::vector<CAddress> CConnman::GetAddresses()
+{
+ return addrman.GetAddr();
+}
+
+bool CConnman::AddNode(const std::string& strNode)
+{
+ LOCK(cs_vAddedNodes);
+ for(std::vector<std::string>::const_iterator it = vAddedNodes.begin(); it != vAddedNodes.end(); ++it) {
+ if (strNode == *it)
+ return false;
+ }
+
+ vAddedNodes.push_back(strNode);
+ return true;
+}
+
+bool CConnman::RemoveAddedNode(const std::string& strNode)
+{
+ LOCK(cs_vAddedNodes);
+ for(std::vector<std::string>::iterator it = vAddedNodes.begin(); it != vAddedNodes.end(); ++it) {
+ if (strNode == *it) {
+ vAddedNodes.erase(it);
+ return true;
}
+ }
+ return false;
+}
+
+size_t CConnman::GetNodeCount(NumConnections flags)
+{
+ LOCK(cs_vNodes);
+ if (flags == CConnman::CONNECTIONS_ALL) // Shortcut if we want total
+ return vNodes.size();
+
+ int nNum = 0;
+ for(std::vector<CNode*>::const_iterator it = vNodes.begin(); it != vNodes.end(); ++it)
+ if (flags & ((*it)->fInbound ? CONNECTIONS_IN : CONNECTIONS_OUT))
+ nNum++;
+
+ return nNum;
+}
+
+void CConnman::GetNodeStats(std::vector<CNodeStats>& vstats)
+{
+ vstats.clear();
+ LOCK(cs_vNodes);
+ vstats.reserve(vNodes.size());
+ for(std::vector<CNode*>::iterator it = vNodes.begin(); it != vNodes.end(); ++it) {
+ CNode* pnode = *it;
+ CNodeStats stats;
+ pnode->copyStats(stats);
+ vstats.push_back(stats);
+ }
+}
+
+bool CConnman::DisconnectAddress(const CNetAddr& netAddr)
+{
+ if (CNode* pnode = FindNode(netAddr)) {
+ pnode->fDisconnect = true;
+ return true;
+ }
+ return false;
+}
+
+bool CConnman::DisconnectSubnet(const CSubNet& subNet)
+{
+ if (CNode* pnode = FindNode(subNet)) {
+ pnode->fDisconnect = true;
+ return true;
+ }
+ return false;
+}
- // Save original serialized message so newer versions are preserved
- mapRelay.insert(std::make_pair(inv, ss));
- vRelayExpiration.push_back(std::make_pair(GetTime() + 15 * 60, inv));
+bool CConnman::DisconnectNode(const std::string& strNode)
+{
+ if (CNode* pnode = FindNode(strNode)) {
+ pnode->fDisconnect = true;
+ return true;
}
+ return false;
+}
+bool CConnman::DisconnectNode(NodeId id)
+{
+ LOCK(cs_vNodes);
+ for(CNode* pnode : vNodes) {
+ if (id == pnode->id) {
+ pnode->fDisconnect = true;
+ return true;
+ }
+ }
+ return false;
+}
+
+void CConnman::RelayTransaction(const CTransaction& tx)
+{
+ CInv inv(MSG_TX, tx.GetHash());
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
{
- if(!pnode->fRelayTxes)
- continue;
- LOCK(pnode->cs_filter);
- if (pnode->pfilter)
- {
- if (pnode->pfilter->IsRelevantAndUpdate(tx))
- pnode->PushInventory(inv);
- } else
- pnode->PushInventory(inv);
+ pnode->PushInventory(inv);
}
}
-void CNode::RecordBytesRecv(uint64_t bytes)
+void CConnman::RecordBytesRecv(uint64_t bytes)
{
LOCK(cs_totalBytesRecv);
nTotalBytesRecv += bytes;
}
-void CNode::RecordBytesSent(uint64_t bytes)
+void CConnman::RecordBytesSent(uint64_t bytes)
{
LOCK(cs_totalBytesSent);
nTotalBytesSent += bytes;
@@ -2111,29 +2364,25 @@ void CNode::RecordBytesSent(uint64_t bytes)
nMaxOutboundTotalBytesSentInCycle += bytes;
}
-void CNode::SetMaxOutboundTarget(uint64_t limit)
+void CConnman::SetMaxOutboundTarget(uint64_t limit)
{
LOCK(cs_totalBytesSent);
- uint64_t recommendedMinimum = (nMaxOutboundTimeframe / 600) * MAX_BLOCK_SIZE;
nMaxOutboundLimit = limit;
-
- if (limit > 0 && limit < recommendedMinimum)
- LogPrintf("Max outbound target is very small (%s bytes) and will be overshot. Recommended minimum is %s bytes.\n", nMaxOutboundLimit, recommendedMinimum);
}
-uint64_t CNode::GetMaxOutboundTarget()
+uint64_t CConnman::GetMaxOutboundTarget()
{
LOCK(cs_totalBytesSent);
return nMaxOutboundLimit;
}
-uint64_t CNode::GetMaxOutboundTimeframe()
+uint64_t CConnman::GetMaxOutboundTimeframe()
{
LOCK(cs_totalBytesSent);
return nMaxOutboundTimeframe;
}
-uint64_t CNode::GetMaxOutboundTimeLeftInCycle()
+uint64_t CConnman::GetMaxOutboundTimeLeftInCycle()
{
LOCK(cs_totalBytesSent);
if (nMaxOutboundLimit == 0)
@@ -2147,7 +2396,7 @@ uint64_t CNode::GetMaxOutboundTimeLeftInCycle()
return (cycleEndTime < now) ? 0 : cycleEndTime - GetTime();
}
-void CNode::SetMaxOutboundTimeframe(uint64_t timeframe)
+void CConnman::SetMaxOutboundTimeframe(uint64_t timeframe)
{
LOCK(cs_totalBytesSent);
if (nMaxOutboundTimeframe != timeframe)
@@ -2159,7 +2408,7 @@ void CNode::SetMaxOutboundTimeframe(uint64_t timeframe)
nMaxOutboundTimeframe = timeframe;
}
-bool CNode::OutboundTargetReached(bool historicalBlockServingLimit)
+bool CConnman::OutboundTargetReached(bool historicalBlockServingLimit)
{
LOCK(cs_totalBytesSent);
if (nMaxOutboundLimit == 0)
@@ -2167,9 +2416,9 @@ bool CNode::OutboundTargetReached(bool historicalBlockServingLimit)
if (historicalBlockServingLimit)
{
- // keep a large enought buffer to at least relay each block once
+ // keep a large enough buffer to at least relay each block once
uint64_t timeLeftInCycle = GetMaxOutboundTimeLeftInCycle();
- uint64_t buffer = timeLeftInCycle / 600 * MAX_BLOCK_SIZE;
+ uint64_t buffer = timeLeftInCycle / 600 * MAX_BLOCK_SERIALIZED_SIZE;
if (buffer >= nMaxOutboundLimit || nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit - buffer)
return true;
}
@@ -2179,7 +2428,7 @@ bool CNode::OutboundTargetReached(bool historicalBlockServingLimit)
return false;
}
-uint64_t CNode::GetOutboundTargetBytesLeft()
+uint64_t CConnman::GetOutboundTargetBytesLeft()
{
LOCK(cs_totalBytesSent);
if (nMaxOutboundLimit == 0)
@@ -2188,18 +2437,33 @@ uint64_t CNode::GetOutboundTargetBytesLeft()
return (nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit) ? 0 : nMaxOutboundLimit - nMaxOutboundTotalBytesSentInCycle;
}
-uint64_t CNode::GetTotalBytesRecv()
+uint64_t CConnman::GetTotalBytesRecv()
{
LOCK(cs_totalBytesRecv);
return nTotalBytesRecv;
}
-uint64_t CNode::GetTotalBytesSent()
+uint64_t CConnman::GetTotalBytesSent()
{
LOCK(cs_totalBytesSent);
return nTotalBytesSent;
}
+ServiceFlags CConnman::GetLocalServices() const
+{
+ return nLocalServices;
+}
+
+void CConnman::SetBestHeight(int height)
+{
+ nBestHeight.store(height, std::memory_order_release);
+}
+
+int CConnman::GetBestHeight() const
+{
+ return nBestHeight.load(std::memory_order_acquire);
+}
+
void CNode::Fuzz(int nChance)
{
if (!fSuccessfullyConnected) return; // Don't fuzz initial handshake
@@ -2235,116 +2499,18 @@ void CNode::Fuzz(int nChance)
Fuzz(2);
}
-//
-// CAddrDB
-//
-
-CAddrDB::CAddrDB()
-{
- pathAddr = GetDataDir() / "peers.dat";
-}
-
-bool CAddrDB::Write(const CAddrMan& addr)
-{
- // Generate random temporary filename
- unsigned short randv = 0;
- GetRandBytes((unsigned char*)&randv, sizeof(randv));
- std::string tmpfn = strprintf("peers.dat.%04x", randv);
-
- // serialize addresses, checksum data up to that point, then append csum
- CDataStream ssPeers(SER_DISK, CLIENT_VERSION);
- ssPeers << FLATDATA(Params().MessageStart());
- ssPeers << addr;
- uint256 hash = Hash(ssPeers.begin(), ssPeers.end());
- ssPeers << hash;
-
- // open temp output file, and associate with CAutoFile
- boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
- FILE *file = fopen(pathTmp.string().c_str(), "wb");
- CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
- if (fileout.IsNull())
- return error("%s: Failed to open file %s", __func__, pathTmp.string());
-
- // Write and commit header, data
- try {
- fileout << ssPeers;
- }
- catch (const std::exception& e) {
- return error("%s: Serialize or I/O error - %s", __func__, e.what());
- }
- FileCommit(fileout.Get());
- fileout.fclose();
-
- // replace existing peers.dat, if any, with new peers.dat.XXXX
- if (!RenameOver(pathTmp, pathAddr))
- return error("%s: Rename-into-place failed", __func__);
+unsigned int CConnman::GetReceiveFloodSize() const { return nReceiveFloodSize; }
+unsigned int CConnman::GetSendBufferSize() const{ return nSendBufferMaxSize; }
- return true;
-}
-
-bool CAddrDB::Read(CAddrMan& addr)
-{
- // open input file, and associate with CAutoFile
- FILE *file = fopen(pathAddr.string().c_str(), "rb");
- CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
- if (filein.IsNull())
- return error("%s: Failed to open file %s", __func__, pathAddr.string());
-
- // use file size to size memory buffer
- uint64_t fileSize = boost::filesystem::file_size(pathAddr);
- uint64_t dataSize = 0;
- // Don't try to resize to a negative number if file is small
- if (fileSize >= sizeof(uint256))
- dataSize = fileSize - sizeof(uint256);
- vector<unsigned char> vchData;
- vchData.resize(dataSize);
- uint256 hashIn;
-
- // read data and checksum from file
- try {
- filein.read((char *)&vchData[0], dataSize);
- filein >> hashIn;
- }
- catch (const std::exception& e) {
- return error("%s: Deserialize or I/O error - %s", __func__, e.what());
- }
- filein.fclose();
-
- CDataStream ssPeers(vchData, SER_DISK, CLIENT_VERSION);
-
- // verify stored checksum matches input data
- uint256 hashTmp = Hash(ssPeers.begin(), ssPeers.end());
- if (hashIn != hashTmp)
- return error("%s: Checksum mismatch, data corrupted", __func__);
-
- unsigned char pchMsgTmp[4];
- try {
- // de-serialize file header (network specific magic number) and ..
- ssPeers >> FLATDATA(pchMsgTmp);
-
- // ... verify the network matches ours
- if (memcmp(pchMsgTmp, Params().MessageStart(), sizeof(pchMsgTmp)))
- return error("%s: Invalid network magic number", __func__);
-
- // de-serialize address data into one CAddrMan object
- ssPeers >> addr;
- }
- catch (const std::exception& e) {
- return error("%s: Deserialize or I/O error - %s", __func__, e.what());
- }
-
- return true;
-}
-
-unsigned int ReceiveFloodSize() { return 1000*GetArg("-maxreceivebuffer", DEFAULT_MAXRECEIVEBUFFER); }
-unsigned int SendBufferSize() { return 1000*GetArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER); }
-
-CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNameIn, bool fInboundIn) :
+CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn, SOCKET hSocketIn, const CAddress& addrIn, uint64_t nKeyedNetGroupIn, const std::string& addrNameIn, bool fInboundIn) :
ssSend(SER_NETWORK, INIT_PROTO_VERSION),
+ addr(addrIn),
+ nKeyedNetGroup(nKeyedNetGroupIn),
addrKnown(5000, 0.001),
- setInventoryKnown(SendBufferSize() / 1000)
+ filterInventoryKnown(50000, 0.000001)
{
- nServices = 0;
+ nServices = NODE_NONE;
+ nServicesExpected = NODE_NONE;
hSocket = hSocketIn;
nRecvVersion = INIT_PROTO_VERSION;
nLastSend = 0;
@@ -2353,13 +2519,13 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
nRecvBytes = 0;
nTimeConnected = GetTime();
nTimeOffset = 0;
- addr = addrIn;
addrName = addrNameIn == "" ? addr.ToStringIPPort() : addrNameIn;
nVersion = 0;
strSubVer = "";
fWhitelisted = false;
fOneShot = false;
fClient = false; // set by version message
+ fFeeler = false;
fInbound = fInboundIn;
fNetworkNode = false;
fSuccessfullyConnected = false;
@@ -2369,19 +2535,36 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
nSendOffset = 0;
hashContinue = uint256();
nStartingHeight = -1;
+ filterInventoryKnown.reset();
+ fSendMempool = false;
fGetAddr = false;
+ nNextLocalAddrSend = 0;
+ nNextAddrSend = 0;
+ nNextInvSend = 0;
fRelayTxes = false;
+ fSentAddr = false;
pfilter = new CBloomFilter();
+ timeLastMempoolReq = 0;
+ nLastBlockTime = 0;
+ nLastTXTime = 0;
nPingNonceSent = 0;
nPingUsecStart = 0;
nPingUsecTime = 0;
fPingQueued = false;
nMinPingUsecTime = std::numeric_limits<int64_t>::max();
+ minFeeFilter = 0;
+ lastSentFeeFilter = 0;
+ nextSendTimeFeeFilter = 0;
+ id = idIn;
+ nOptimisticBytesWritten = 0;
+ nLocalServices = nLocalServicesIn;
- {
- LOCK(cs_nLastNodeId);
- id = nLastNodeId++;
- }
+ GetRandBytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce));
+ nMyStartingHeight = nMyStartingHeightIn;
+
+ BOOST_FOREACH(const std::string &msg, getAllNetMessageTypes())
+ mapRecvBytesPerMsgCmd[msg] = 0;
+ mapRecvBytesPerMsgCmd[NET_MESSAGE_COMMAND_OTHER] = 0;
if (fLogIPs)
LogPrint("net", "Added connection to %s peer=%d\n", addrName, id);
@@ -2391,8 +2574,6 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
// Be shy and don't send version until we hear
if (hSocket != INVALID_SOCKET && !fInbound)
PushVersion();
-
- GetNodeSignals().InitializeNode(GetId(), this);
}
CNode::~CNode()
@@ -2401,8 +2582,6 @@ CNode::~CNode()
if (pfilter)
delete pfilter;
-
- GetNodeSignals().FinalizeNode(GetId());
}
void CNode::AskFor(const CInv& inv)
@@ -2416,7 +2595,7 @@ void CNode::AskFor(const CInv& inv)
// We're using mapAskFor as a priority queue,
// the key is the earliest time the request can be sent
int64_t nRequestTime;
- limitedmap<CInv, int64_t>::const_iterator it = mapAlreadyAskedFor.find(inv);
+ limitedmap<uint256, int64_t>::const_iterator it = mapAlreadyAskedFor.find(inv.hash);
if (it != mapAlreadyAskedFor.end())
nRequestTime = it->second;
else
@@ -2435,7 +2614,7 @@ void CNode::AskFor(const CInv& inv)
if (it != mapAlreadyAskedFor.end())
mapAlreadyAskedFor.update(it, nRequestTime);
else
- mapAlreadyAskedFor.insert(std::make_pair(inv, nRequestTime));
+ mapAlreadyAskedFor.insert(std::make_pair(inv.hash, nRequestTime));
mapAskFor.insert(std::make_pair(nRequestTime, inv));
}
@@ -2456,7 +2635,7 @@ void CNode::AbortMessage() UNLOCK_FUNCTION(cs_vSend)
LogPrint("net", "(aborted)\n");
}
-void CNode::EndMessage() UNLOCK_FUNCTION(cs_vSend)
+void CNode::EndMessage(const char* pszCommand) UNLOCK_FUNCTION(cs_vSend)
{
// The -*messagestest options are intentionally not documented in the help message,
// since they are only used during development to debug the networking code and are
@@ -2479,12 +2658,13 @@ void CNode::EndMessage() UNLOCK_FUNCTION(cs_vSend)
unsigned int nSize = ssSend.size() - CMessageHeader::HEADER_SIZE;
WriteLE32((uint8_t*)&ssSend[CMessageHeader::MESSAGE_SIZE_OFFSET], nSize);
+ //log total amount of bytes per command
+ mapSendBytesPerMsgCmd[std::string(pszCommand)] += nSize + CMessageHeader::HEADER_SIZE;
+
// Set the checksum
uint256 hash = Hash(ssSend.begin() + CMessageHeader::HEADER_SIZE, ssSend.end());
- unsigned int nChecksum = 0;
- memcpy(&nChecksum, &hash, sizeof(nChecksum));
- assert(ssSend.size () >= CMessageHeader::CHECKSUM_OFFSET + sizeof(nChecksum));
- memcpy((char*)&ssSend[CMessageHeader::CHECKSUM_OFFSET], &nChecksum, sizeof(nChecksum));
+ assert(ssSend.size () >= CMessageHeader::CHECKSUM_OFFSET + CMessageHeader::CHECKSUM_SIZE);
+ memcpy((char*)&ssSend[CMessageHeader::CHECKSUM_OFFSET], hash.begin(), CMessageHeader::CHECKSUM_SIZE);
LogPrint("net", "(%d bytes) peer=%d\n", nSize, id);
@@ -2494,123 +2674,36 @@ void CNode::EndMessage() UNLOCK_FUNCTION(cs_vSend)
// If write queue empty, attempt "optimistic write"
if (it == vSendMsg.begin())
- SocketSendData(this);
+ nOptimisticBytesWritten += SocketSendData(this);
LEAVE_CRITICAL_SECTION(cs_vSend);
}
-//
-// CBanDB
-//
-
-CBanDB::CBanDB()
+bool CConnman::ForNode(NodeId id, std::function<bool(CNode* pnode)> func)
{
- pathBanlist = GetDataDir() / "banlist.dat";
-}
-
-bool CBanDB::Write(const banmap_t& banSet)
-{
- // Generate random temporary filename
- unsigned short randv = 0;
- GetRandBytes((unsigned char*)&randv, sizeof(randv));
- std::string tmpfn = strprintf("banlist.dat.%04x", randv);
-
- // serialize banlist, checksum data up to that point, then append csum
- CDataStream ssBanlist(SER_DISK, CLIENT_VERSION);
- ssBanlist << FLATDATA(Params().MessageStart());
- ssBanlist << banSet;
- uint256 hash = Hash(ssBanlist.begin(), ssBanlist.end());
- ssBanlist << hash;
-
- // open temp output file, and associate with CAutoFile
- boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
- FILE *file = fopen(pathTmp.string().c_str(), "wb");
- CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
- if (fileout.IsNull())
- return error("%s: Failed to open file %s", __func__, pathTmp.string());
-
- // Write and commit header, data
- try {
- fileout << ssBanlist;
- }
- catch (const std::exception& e) {
- return error("%s: Serialize or I/O error - %s", __func__, e.what());
+ CNode* found = nullptr;
+ LOCK(cs_vNodes);
+ for (auto&& pnode : vNodes) {
+ if(pnode->id == id) {
+ found = pnode;
+ break;
+ }
}
- FileCommit(fileout.Get());
- fileout.fclose();
-
- // replace existing banlist.dat, if any, with new banlist.dat.XXXX
- if (!RenameOver(pathTmp, pathBanlist))
- return error("%s: Rename-into-place failed", __func__);
+ return found != nullptr && func(found);
+}
- return true;
+int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) {
+ return nNow + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5);
}
-bool CBanDB::Read(banmap_t& banSet)
+CSipHasher CConnman::GetDeterministicRandomizer(uint64_t id)
{
- // open input file, and associate with CAutoFile
- FILE *file = fopen(pathBanlist.string().c_str(), "rb");
- CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
- if (filein.IsNull())
- return error("%s: Failed to open file %s", __func__, pathBanlist.string());
-
- // use file size to size memory buffer
- uint64_t fileSize = boost::filesystem::file_size(pathBanlist);
- uint64_t dataSize = 0;
- // Don't try to resize to a negative number if file is small
- if (fileSize >= sizeof(uint256))
- dataSize = fileSize - sizeof(uint256);
- vector<unsigned char> vchData;
- vchData.resize(dataSize);
- uint256 hashIn;
-
- // read data and checksum from file
- try {
- filein.read((char *)&vchData[0], dataSize);
- filein >> hashIn;
- }
- catch (const std::exception& e) {
- return error("%s: Deserialize or I/O error - %s", __func__, e.what());
- }
- filein.fclose();
-
- CDataStream ssBanlist(vchData, SER_DISK, CLIENT_VERSION);
-
- // verify stored checksum matches input data
- uint256 hashTmp = Hash(ssBanlist.begin(), ssBanlist.end());
- if (hashIn != hashTmp)
- return error("%s: Checksum mismatch, data corrupted", __func__);
-
- unsigned char pchMsgTmp[4];
- try {
- // de-serialize file header (network specific magic number) and ..
- ssBanlist >> FLATDATA(pchMsgTmp);
-
- // ... verify the network matches ours
- if (memcmp(pchMsgTmp, Params().MessageStart(), sizeof(pchMsgTmp)))
- return error("%s: Invalid network magic number", __func__);
-
- // de-serialize address data into one CAddrMan object
- ssBanlist >> banSet;
- }
- catch (const std::exception& e) {
- return error("%s: Deserialize or I/O error - %s", __func__, e.what());
- }
-
- return true;
+ return CSipHasher(nSeed0, nSeed1).Write(id);
}
-void DumpBanlist()
+uint64_t CConnman::CalculateKeyedNetGroup(const CAddress& ad)
{
- int64_t nStart = GetTimeMillis();
-
- CNode::SweepBanned(); //clean unused entries (if bantime has expired)
-
- CBanDB bandb;
- banmap_t banmap;
- CNode::GetBanned(banmap);
- bandb.Write(banmap);
+ std::vector<unsigned char> vchNetGroup(ad.GetGroup());
- LogPrint("net", "Flushed %d banned node ips/subnets to banlist.dat %dms\n",
- banmap.size(), GetTimeMillis() - nStart);
+ return GetDeterministicRandomizer(RANDOMIZER_ID_NETGROUP).Write(&vchNetGroup[0], vchNetGroup.size()).Finalize();
}
diff --git a/src/net.h b/src/net.h
index a5a5c770d6..67f0abe4be 100644
--- a/src/net.h
+++ b/src/net.h
@@ -1,24 +1,29 @@
// Copyright (c) 2009-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.
#ifndef BITCOIN_NET_H
#define BITCOIN_NET_H
+#include "addrdb.h"
+#include "addrman.h"
+#include "amount.h"
#include "bloom.h"
#include "compat.h"
+#include "hash.h"
#include "limitedmap.h"
-#include "mruset.h"
-#include "netbase.h"
+#include "netaddress.h"
#include "protocol.h"
#include "random.h"
#include "streams.h"
#include "sync.h"
#include "uint256.h"
+#include <atomic>
#include <deque>
#include <stdint.h>
+#include <memory>
#ifndef WIN32
#include <arpa/inet.h>
@@ -40,14 +45,18 @@ namespace boost {
static const int PING_INTERVAL = 2 * 60;
/** Time after which to disconnect, after waiting for a ping response (or inactivity). */
static const int TIMEOUT_INTERVAL = 20 * 60;
+/** Run the feeler connection loop once every 2 minutes or 120 seconds. **/
+static const int FEELER_INTERVAL = 120;
/** The maximum number of entries in an 'inv' protocol message */
static const unsigned int MAX_INV_SZ = 50000;
/** The maximum number of new addresses to accumulate before announcing. */
static const unsigned int MAX_ADDR_TO_SEND = 1000;
-/** Maximum length of incoming protocol messages (no message over 2 MiB is currently acceptable). */
-static const unsigned int MAX_PROTOCOL_MESSAGE_LENGTH = 2 * 1024 * 1024;
+/** Maximum length of incoming protocol messages (no message over 4 MB is currently acceptable). */
+static const unsigned int MAX_PROTOCOL_MESSAGE_LENGTH = 4 * 1000 * 1000;
/** Maximum length of strSubVer in `version` message */
static const unsigned int MAX_SUBVERSION_LENGTH = 256;
+/** Maximum number of outgoing nodes */
+static const int MAX_OUTBOUND_CONNECTIONS = 8;
/** -listen default */
static const bool DEFAULT_LISTEN = true;
/** -upnp default */
@@ -64,6 +73,8 @@ static const size_t SETASKFOR_MAX_SZ = 2 * MAX_INV_SZ;
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125;
/** The default for -maxuploadtarget. 0 = Unlimited */
static const uint64_t DEFAULT_MAX_UPLOAD_TARGET = 0;
+/** The default timeframe for -maxuploadtarget. 1 day. */
+static const uint64_t MAX_UPLOAD_TIMEFRAME = 60 * 60 * 24;
/** Default for blocks only*/
static const bool DEFAULT_BLOCKSONLY = false;
@@ -71,28 +82,331 @@ static const bool DEFAULT_FORCEDNSSEED = false;
static const size_t DEFAULT_MAXRECEIVEBUFFER = 5 * 1000;
static const size_t DEFAULT_MAXSENDBUFFER = 1 * 1000;
+static const ServiceFlags REQUIRED_SERVICES = NODE_NETWORK;
+
// NOTE: When adjusting this, update rpcnet:setban's help ("24h")
static const unsigned int DEFAULT_MISBEHAVING_BANTIME = 60 * 60 * 24; // Default 24-hour ban
-unsigned int ReceiveFloodSize();
-unsigned int SendBufferSize();
-
-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);
-bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false);
+typedef int NodeId;
+
+struct AddedNodeInfo
+{
+ std::string strAddedNode;
+ CService resolvedAddress;
+ bool fConnected;
+ bool fInbound;
+};
+
+class CTransaction;
+class CNodeStats;
+class CClientUIInterface;
+
+class CConnman
+{
+public:
+
+ enum NumConnections {
+ CONNECTIONS_NONE = 0,
+ CONNECTIONS_IN = (1U << 0),
+ CONNECTIONS_OUT = (1U << 1),
+ CONNECTIONS_ALL = (CONNECTIONS_IN | CONNECTIONS_OUT),
+ };
+
+ struct Options
+ {
+ ServiceFlags nLocalServices = NODE_NONE;
+ ServiceFlags nRelevantServices = NODE_NONE;
+ int nMaxConnections = 0;
+ int nMaxOutbound = 0;
+ int nMaxFeeler = 0;
+ int nBestHeight = 0;
+ CClientUIInterface* uiInterface = nullptr;
+ unsigned int nSendBufferMaxSize = 0;
+ unsigned int nReceiveFloodSize = 0;
+ uint64_t nMaxOutboundTimeframe = 0;
+ uint64_t nMaxOutboundLimit = 0;
+ };
+ CConnman(uint64_t seed0, uint64_t seed1);
+ ~CConnman();
+ bool Start(boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError, Options options);
+ void Stop();
+ bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
+ bool OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false, bool fFeeler = false);
+ bool CheckIncomingNonce(uint64_t nonce);
+
+ bool ForNode(NodeId id, std::function<bool(CNode* pnode)> func);
+
+ template<typename Callable>
+ bool ForEachNodeContinueIf(Callable&& func)
+ {
+ LOCK(cs_vNodes);
+ for (auto&& node : vNodes)
+ if(!func(node))
+ return false;
+ return true;
+ };
+
+ template<typename Callable>
+ bool ForEachNodeContinueIf(Callable&& func) const
+ {
+ LOCK(cs_vNodes);
+ for (const auto& node : vNodes)
+ if(!func(node))
+ return false;
+ return true;
+ };
+
+ template<typename Callable, typename CallableAfter>
+ bool ForEachNodeContinueIfThen(Callable&& pre, CallableAfter&& post)
+ {
+ bool ret = true;
+ LOCK(cs_vNodes);
+ for (auto&& node : vNodes)
+ if(!pre(node)) {
+ ret = false;
+ break;
+ }
+ post();
+ return ret;
+ };
+
+ template<typename Callable, typename CallableAfter>
+ bool ForEachNodeContinueIfThen(Callable&& pre, CallableAfter&& post) const
+ {
+ bool ret = true;
+ LOCK(cs_vNodes);
+ for (const auto& node : vNodes)
+ if(!pre(node)) {
+ ret = false;
+ break;
+ }
+ post();
+ return ret;
+ };
+
+ template<typename Callable>
+ void ForEachNode(Callable&& func)
+ {
+ LOCK(cs_vNodes);
+ for (auto&& node : vNodes)
+ func(node);
+ };
+
+ template<typename Callable>
+ void ForEachNode(Callable&& func) const
+ {
+ LOCK(cs_vNodes);
+ for (const auto& node : vNodes)
+ func(node);
+ };
+
+ template<typename Callable, typename CallableAfter>
+ void ForEachNodeThen(Callable&& pre, CallableAfter&& post)
+ {
+ LOCK(cs_vNodes);
+ for (auto&& node : vNodes)
+ pre(node);
+ post();
+ };
+
+ template<typename Callable, typename CallableAfter>
+ void ForEachNodeThen(Callable&& pre, CallableAfter&& post) const
+ {
+ LOCK(cs_vNodes);
+ for (const auto& node : vNodes)
+ pre(node);
+ post();
+ };
+
+ void RelayTransaction(const CTransaction& tx);
+
+ // Addrman functions
+ size_t GetAddressCount() const;
+ void SetServices(const CService &addr, ServiceFlags nServices);
+ void MarkAddressGood(const CAddress& addr);
+ void AddNewAddress(const CAddress& addr, const CAddress& addrFrom, int64_t nTimePenalty = 0);
+ void AddNewAddresses(const std::vector<CAddress>& vAddr, const CAddress& addrFrom, int64_t nTimePenalty = 0);
+ std::vector<CAddress> GetAddresses();
+ void AddressCurrentlyConnected(const CService& addr);
+
+ // Denial-of-service detection/prevention
+ // The idea is to detect peers that are behaving
+ // badly and disconnect/ban them, but do it in a
+ // one-coding-mistake-won't-shatter-the-entire-network
+ // way.
+ // IMPORTANT: There should be nothing I can give a
+ // node that it will forward on that will make that
+ // node's peers drop it. If there is, an attacker
+ // can isolate a node and/or try to split the network.
+ // Dropping a node for sending stuff that is invalid
+ // now but might be valid in a later version is also
+ // dangerous, because it can cause a network split
+ // between nodes running old code and nodes running
+ // new code.
+ void Ban(const CNetAddr& netAddr, const BanReason& reason, int64_t bantimeoffset = 0, bool sinceUnixEpoch = false);
+ void Ban(const CSubNet& subNet, const BanReason& reason, int64_t bantimeoffset = 0, bool sinceUnixEpoch = false);
+ void ClearBanned(); // needed for unit testing
+ bool IsBanned(CNetAddr ip);
+ bool IsBanned(CSubNet subnet);
+ bool Unban(const CNetAddr &ip);
+ bool Unban(const CSubNet &ip);
+ void GetBanned(banmap_t &banmap);
+ void SetBanned(const banmap_t &banmap);
+
+ void AddOneShot(const std::string& strDest);
+
+ bool AddNode(const std::string& node);
+ bool RemoveAddedNode(const std::string& node);
+ std::vector<AddedNodeInfo> GetAddedNodeInfo();
+
+ size_t GetNodeCount(NumConnections num);
+ void GetNodeStats(std::vector<CNodeStats>& vstats);
+ bool DisconnectAddress(const CNetAddr& addr);
+ bool DisconnectNode(const std::string& node);
+ bool DisconnectNode(NodeId id);
+ bool DisconnectSubnet(const CSubNet& subnet);
+
+ unsigned int GetSendBufferSize() const;
+
+ void AddWhitelistedRange(const CSubNet &subnet);
+
+ ServiceFlags GetLocalServices() const;
+
+ //!set the max outbound target in bytes
+ void SetMaxOutboundTarget(uint64_t limit);
+ uint64_t GetMaxOutboundTarget();
+
+ //!set the timeframe for the max outbound target
+ void SetMaxOutboundTimeframe(uint64_t timeframe);
+ uint64_t GetMaxOutboundTimeframe();
+
+ //!check if the outbound target is reached
+ // if param historicalBlockServingLimit is set true, the function will
+ // response true if the limit for serving historical blocks has been reached
+ bool OutboundTargetReached(bool historicalBlockServingLimit);
+
+ //!response the bytes left in the current max outbound cycle
+ // in case of no limit, it will always response 0
+ uint64_t GetOutboundTargetBytesLeft();
+
+ //!response the time in second left in the current max outbound cycle
+ // in case of no limit, it will always response 0
+ uint64_t GetMaxOutboundTimeLeftInCycle();
+
+ uint64_t GetTotalBytesRecv();
+ uint64_t GetTotalBytesSent();
+
+ void SetBestHeight(int height);
+ int GetBestHeight() const;
+
+ /** Get a unique deterministic randomizer. */
+ CSipHasher GetDeterministicRandomizer(uint64_t id);
+
+private:
+ struct ListenSocket {
+ SOCKET socket;
+ bool whitelisted;
+
+ ListenSocket(SOCKET socket_, bool whitelisted_) : socket(socket_), whitelisted(whitelisted_) {}
+ };
+
+ void ThreadOpenAddedConnections();
+ void ProcessOneShot();
+ void ThreadOpenConnections();
+ void ThreadMessageHandler();
+ void AcceptConnection(const ListenSocket& hListenSocket);
+ void ThreadSocketHandler();
+ void ThreadDNSAddressSeed();
+
+ uint64_t CalculateKeyedNetGroup(const CAddress& ad);
+
+ CNode* FindNode(const CNetAddr& ip);
+ CNode* FindNode(const CSubNet& subNet);
+ CNode* FindNode(const std::string& addrName);
+ CNode* FindNode(const CService& addr);
+
+ bool AttemptToEvictConnection();
+ CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure);
+ bool IsWhitelistedRange(const CNetAddr &addr);
+
+ void DeleteNode(CNode* pnode);
+
+ NodeId GetNewNodeId();
+
+ //!check is the banlist has unwritten changes
+ bool BannedSetIsDirty();
+ //!set the "dirty" flag for the banlist
+ void SetBannedSetDirty(bool dirty=true);
+ //!clean unused entries (if bantime has expired)
+ void SweepBanned();
+ void DumpAddresses();
+ void DumpData();
+ void DumpBanlist();
+
+ unsigned int GetReceiveFloodSize() const;
+
+ // Network stats
+ void RecordBytesRecv(uint64_t bytes);
+ void RecordBytesSent(uint64_t bytes);
+
+ // Network usage totals
+ CCriticalSection cs_totalBytesRecv;
+ CCriticalSection cs_totalBytesSent;
+ uint64_t nTotalBytesRecv;
+ uint64_t nTotalBytesSent;
+
+ // outbound limit & stats
+ uint64_t nMaxOutboundTotalBytesSentInCycle;
+ uint64_t nMaxOutboundCycleStartTime;
+ uint64_t nMaxOutboundLimit;
+ uint64_t nMaxOutboundTimeframe;
+
+ // Whitelisted ranges. Any node connecting from these is automatically
+ // whitelisted (as well as those connecting to whitelisted binds).
+ std::vector<CSubNet> vWhitelistedRange;
+ CCriticalSection cs_vWhitelistedRange;
+
+ unsigned int nSendBufferMaxSize;
+ unsigned int nReceiveFloodSize;
+
+ std::vector<ListenSocket> vhListenSocket;
+ banmap_t setBanned;
+ CCriticalSection cs_setBanned;
+ bool setBannedIsDirty;
+ bool fAddressesInitialized;
+ CAddrMan addrman;
+ std::deque<std::string> vOneShots;
+ CCriticalSection cs_vOneShots;
+ std::vector<std::string> vAddedNodes;
+ CCriticalSection cs_vAddedNodes;
+ std::vector<CNode*> vNodes;
+ std::list<CNode*> vNodesDisconnected;
+ mutable CCriticalSection cs_vNodes;
+ std::atomic<NodeId> nLastNodeId;
+ boost::condition_variable messageHandlerCondition;
+
+ /** Services this instance offers */
+ ServiceFlags nLocalServices;
+
+ /** Services this instance cares about */
+ ServiceFlags nRelevantServices;
+
+ CSemaphore *semOutbound;
+ int nMaxConnections;
+ int nMaxOutbound;
+ int nMaxFeeler;
+ std::atomic<int> nBestHeight;
+ CClientUIInterface* clientInterface;
+
+ /** SipHasher seeds for deterministic randomness */
+ const uint64_t nSeed0, nSeed1;
+};
+extern std::unique_ptr<CConnman> g_connman;
+void Discover(boost::thread_group& threadGroup);
void MapPort(bool fUseUPnP);
unsigned short GetListenPort();
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
-void StartNode(boost::thread_group& threadGroup, CScheduler& scheduler);
-bool StopNode();
-void SocketSendData(CNode *pnode);
-
-typedef int NodeId;
+size_t SocketSendData(CNode *pnode);
struct CombinerAll
{
@@ -112,11 +426,10 @@ struct CombinerAll
// Signals for message handling
struct CNodeSignals
{
- boost::signals2::signal<int ()> GetHeight;
- boost::signals2::signal<bool (CNode*), CombinerAll> ProcessMessages;
- boost::signals2::signal<bool (CNode*, bool), CombinerAll> SendMessages;
+ boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> ProcessMessages;
+ boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> SendMessages;
boost::signals2::signal<void (NodeId, const CNode*)> InitializeNode;
- boost::signals2::signal<void (NodeId)> FinalizeNode;
+ boost::signals2::signal<void (NodeId, bool&)> FinalizeNode;
};
@@ -135,7 +448,7 @@ enum
};
bool IsPeerAddrLocalGood(CNode *pnode);
-void AdvertizeLocal(CNode *pnode);
+void AdvertiseLocal(CNode *pnode);
void SetLimited(enum Network net, bool fLimited = true);
bool IsLimited(enum Network net);
bool IsLimited(const CNetAddr& addr);
@@ -147,31 +460,14 @@ bool IsLocal(const CService& addr);
bool GetLocal(CService &addr, const CNetAddr *paddrPeer = NULL);
bool IsReachable(enum Network net);
bool IsReachable(const CNetAddr &addr);
-void SetReachable(enum Network net, bool fFlag = true);
-CAddress GetLocalAddress(const CNetAddr *paddrPeer = NULL);
+CAddress GetLocalAddress(const CNetAddr *paddrPeer, ServiceFlags nLocalServices);
extern bool fDiscover;
extern bool fListen;
-extern uint64_t nLocalServices;
-extern uint64_t nLocalHostNonce;
-extern CAddrMan addrman;
-
-/** Maximum number of connections to simultaneously allow (aka connection slots) */
-extern int nMaxConnections;
+extern bool fRelayTxes;
-extern std::vector<CNode*> vNodes;
-extern CCriticalSection cs_vNodes;
-extern std::map<CInv, CDataStream> mapRelay;
-extern std::deque<std::pair<int64_t, CInv> > vRelayExpiration;
-extern CCriticalSection cs_mapRelay;
-extern limitedmap<CInv, int64_t> mapAlreadyAskedFor;
-
-extern std::vector<std::string> vAddedNodes;
-extern CCriticalSection cs_vAddedNodes;
-
-extern NodeId nLastNodeId;
-extern CCriticalSection cs_nLastNodeId;
+extern limitedmap<uint256, int64_t> mapAlreadyAskedFor;
/** Subversion as sent to the P2P network in `version` messages */
extern std::string strSubVersion;
@@ -183,12 +479,13 @@ struct LocalServiceInfo {
extern CCriticalSection cs_mapLocalHost;
extern std::map<CNetAddr, LocalServiceInfo> mapLocalHost;
+typedef std::map<std::string, uint64_t> mapMsgCmdSize; //command, total bytes
class CNodeStats
{
public:
NodeId nodeid;
- uint64_t nServices;
+ ServiceFlags nServices;
bool fRelayTxes;
int64_t nLastSend;
int64_t nLastRecv;
@@ -200,12 +497,15 @@ public:
bool fInbound;
int nStartingHeight;
uint64_t nSendBytes;
+ mapMsgCmdSize mapSendBytesPerMsgCmd;
uint64_t nRecvBytes;
+ mapMsgCmdSize mapRecvBytesPerMsgCmd;
bool fWhitelisted;
double dPingTime;
double dPingWait;
double dPingMin;
std::string addrLocal;
+ CAddress addr;
};
@@ -250,77 +550,18 @@ public:
};
-typedef enum BanReason
-{
- BanReasonUnknown = 0,
- BanReasonNodeMisbehaving = 1,
- BanReasonManuallyAdded = 2
-} BanReason;
-
-class CBanEntry
-{
-public:
- static const int CURRENT_VERSION=1;
- int nVersion;
- int64_t nCreateTime;
- int64_t nBanUntil;
- uint8_t banReason;
-
- CBanEntry()
- {
- SetNull();
- }
-
- CBanEntry(int64_t nCreateTimeIn)
- {
- SetNull();
- nCreateTime = nCreateTimeIn;
- }
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(this->nVersion);
- nVersion = this->nVersion;
- READWRITE(nCreateTime);
- READWRITE(nBanUntil);
- READWRITE(banReason);
- }
-
- void SetNull()
- {
- nVersion = CBanEntry::CURRENT_VERSION;
- nCreateTime = 0;
- nBanUntil = 0;
- banReason = BanReasonUnknown;
- }
-
- std::string banReasonToString()
- {
- switch (banReason) {
- case BanReasonNodeMisbehaving:
- return "node misbehabing";
- case BanReasonManuallyAdded:
- return "manually added";
- default:
- return "unknown";
- }
- }
-};
-
-typedef std::map<CSubNet, CBanEntry> banmap_t;
-
/** Information about a peer */
class CNode
{
public:
// socket
- uint64_t nServices;
+ ServiceFlags nServices;
+ ServiceFlags nServicesExpected;
SOCKET hSocket;
CDataStream ssSend;
size_t nSendSize; // total size of all vSendMsg entries
size_t nSendOffset; // offset inside the first vSendMsg already sent
+ uint64_t nOptimisticBytesWritten;
uint64_t nSendBytes;
std::deque<CSerializeData> vSendMsg;
CCriticalSection cs_vSend;
@@ -335,7 +576,7 @@ public:
int64_t nLastRecv;
int64_t nTimeConnected;
int64_t nTimeOffset;
- CAddress addr;
+ const CAddress addr;
std::string addrName;
CService addrLocal;
int nVersion;
@@ -345,6 +586,7 @@ public:
// the network or wire types and the cleaned string used when displayed or logged.
std::string strSubVer, cleanSubVer;
bool fWhitelisted; // This peer can bypass DoS banning.
+ bool fFeeler; // If true this node is being used as a short lived feeler.
bool fOneShot;
bool fClient;
bool fInbound;
@@ -355,24 +597,19 @@ public:
// a) it allows us to not relay tx invs before receiving the peer's version message
// b) the peer may tell us in its version message that we should not relay tx invs
// unless it loads a bloom filter.
- bool fRelayTxes;
+ bool fRelayTxes; //protected by cs_filter
+ bool fSentAddr;
CSemaphoreGrant grantOutbound;
CCriticalSection cs_filter;
CBloomFilter* pfilter;
int nRefCount;
NodeId id;
+
+ const uint64_t nKeyedNetGroup;
protected:
- // Denial-of-service detection/prevention
- // Key is IP address, value is banned-until-time
- static banmap_t setBanned;
- static CCriticalSection cs_setBanned;
- static bool setBannedIsDirty;
-
- // Whitelisted ranges. Any node connecting from these is automatically
- // whitelisted (as well as those connecting to whitelisted binds).
- static std::vector<CSubNet> vWhitelistedRange;
- static CCriticalSection cs_vWhitelistedRange;
+ mapMsgCmdSize mapSendBytesPerMsgCmd;
+ mapMsgCmdSize mapRecvBytesPerMsgCmd;
// Basic fuzz-testing
void Fuzz(int nChance); // modifies ssSend
@@ -386,16 +623,34 @@ public:
CRollingBloomFilter addrKnown;
bool fGetAddr;
std::set<uint256> setKnown;
+ int64_t nNextAddrSend;
+ int64_t nNextLocalAddrSend;
// inventory based relay
- mruset<CInv> setInventoryKnown;
- std::vector<CInv> vInventoryToSend;
+ CRollingBloomFilter filterInventoryKnown;
+ // Set of transaction ids we still have to announce.
+ // They are sorted by the mempool before relay, so the order is not important.
+ std::set<uint256> setInventoryTxToSend;
+ // List of block ids we still have announce.
+ // There is no final sorting before sending, as they are always sent immediately
+ // and in the order requested.
+ std::vector<uint256> vInventoryBlockToSend;
CCriticalSection cs_inventory;
std::set<uint256> setAskFor;
std::multimap<int64_t, CInv> mapAskFor;
+ int64_t nNextInvSend;
// Used for headers announcements - unfiltered blocks to relay
// Also protected by cs_inventory
std::vector<uint256> vBlockHashesToAnnounce;
+ // Used for BIP35 mempool sending, also protected by cs_inventory
+ bool fSendMempool;
+
+ // Last time a "MEMPOOL" request was serviced.
+ std::atomic<int64_t> timeLastMempoolReq;
+
+ // Block and TXN accept times
+ std::atomic<int64_t> nLastBlockTime;
+ std::atomic<int64_t> nLastTXTime;
// Ping time measurement:
// The pong reply we're expecting, or 0 if no pong expected.
@@ -408,32 +663,34 @@ public:
int64_t nMinPingUsecTime;
// Whether a ping is requested.
bool fPingQueued;
+ // Minimum fee rate with which to filter inv's to this node
+ CAmount minFeeFilter;
+ CCriticalSection cs_feeFilter;
+ CAmount lastSentFeeFilter;
+ int64_t nextSendTimeFeeFilter;
- CNode(SOCKET hSocketIn, const CAddress &addrIn, const std::string &addrNameIn = "", bool fInboundIn = false);
+ CNode(NodeId id, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn, SOCKET hSocketIn, const CAddress &addrIn, uint64_t nKeyedNetGroupIn, const std::string &addrNameIn = "", bool fInboundIn = false);
~CNode();
private:
- // Network usage totals
- static CCriticalSection cs_totalBytesRecv;
- static CCriticalSection cs_totalBytesSent;
- static uint64_t nTotalBytesRecv;
- static uint64_t nTotalBytesSent;
-
- // outbound limit & stats
- static uint64_t nMaxOutboundTotalBytesSentInCycle;
- static uint64_t nMaxOutboundCycleStartTime;
- static uint64_t nMaxOutboundLimit;
- static uint64_t nMaxOutboundTimeframe;
-
CNode(const CNode&);
void operator=(const CNode&);
+
+ uint64_t nLocalHostNonce;
+ // Services offered to this peer
+ ServiceFlags nLocalServices;
+ int nMyStartingHeight;
public:
NodeId GetId() const {
return id;
}
+ uint64_t GetLocalNonce() const {
+ return nLocalHostNonce;
+ }
+
int GetRefCount()
{
assert(nRefCount >= 0);
@@ -450,7 +707,7 @@ public:
}
// requires LOCK(cs_vRecvMsg)
- bool ReceiveMsgBytes(const char *pch, unsigned int nBytes);
+ bool ReceiveMsgBytes(const char *pch, unsigned int nBytes, bool& complete);
// requires LOCK(cs_vRecvMsg)
void SetRecvVersion(int nVersionIn)
@@ -473,21 +730,21 @@ public:
- void AddAddressKnown(const CAddress& addr)
+ void AddAddressKnown(const CAddress& _addr)
{
- addrKnown.insert(addr.GetKey());
+ addrKnown.insert(_addr.GetKey());
}
- void PushAddress(const CAddress& addr)
+ void PushAddress(const CAddress& _addr)
{
// 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() && !addrKnown.contains(addr.GetKey())) {
+ if (_addr.IsValid() && !addrKnown.contains(_addr.GetKey())) {
if (vAddrToSend.size() >= MAX_ADDR_TO_SEND) {
- vAddrToSend[insecure_rand() % vAddrToSend.size()] = addr;
+ vAddrToSend[insecure_rand() % vAddrToSend.size()] = _addr;
} else {
- vAddrToSend.push_back(addr);
+ vAddrToSend.push_back(_addr);
}
}
}
@@ -497,16 +754,19 @@ public:
{
{
LOCK(cs_inventory);
- setInventoryKnown.insert(inv);
+ filterInventoryKnown.insert(inv.hash);
}
}
void PushInventory(const CInv& inv)
{
- {
- LOCK(cs_inventory);
- if (!setInventoryKnown.count(inv))
- vInventoryToSend.push_back(inv);
+ LOCK(cs_inventory);
+ if (inv.type == MSG_TX) {
+ if (!filterInventoryKnown.contains(inv.hash)) {
+ setInventoryTxToSend.insert(inv.hash);
+ }
+ } else if (inv.type == MSG_BLOCK) {
+ vInventoryBlockToSend.push_back(inv.hash);
}
}
@@ -525,7 +785,7 @@ public:
void AbortMessage() UNLOCK_FUNCTION(cs_vSend);
// TODO: Document the precondition of this function. Is cs_vSend locked?
- void EndMessage() UNLOCK_FUNCTION(cs_vSend);
+ void EndMessage(const char* pszCommand) UNLOCK_FUNCTION(cs_vSend);
void PushVersion();
@@ -535,7 +795,7 @@ public:
try
{
BeginMessage(pszCommand);
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -551,7 +811,24 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1;
- EndMessage();
+ EndMessage(pszCommand);
+ }
+ catch (...)
+ {
+ AbortMessage();
+ throw;
+ }
+ }
+
+ /** Send a message containing a1, serialized with flag flag. */
+ template<typename T1>
+ void PushMessageWithFlag(int flag, const char* pszCommand, const T1& a1)
+ {
+ try
+ {
+ BeginMessage(pszCommand);
+ WithOrVersion(&ssSend, flag) << a1;
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -567,7 +844,7 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1 << a2;
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -583,7 +860,7 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1 << a2 << a3;
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -599,7 +876,7 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1 << a2 << a3 << a4;
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -615,7 +892,7 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1 << a2 << a3 << a4 << a5;
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -631,7 +908,7 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1 << a2 << a3 << a4 << a5 << a6;
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -647,7 +924,7 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1 << a2 << a3 << a4 << a5 << a6 << a7;
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -663,7 +940,7 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8;
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -679,7 +956,7 @@ public:
{
BeginMessage(pszCommand);
ssSend << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9;
- EndMessage();
+ EndMessage(pszCommand);
}
catch (...)
{
@@ -690,99 +967,19 @@ public:
void CloseSocketDisconnect();
- // Denial-of-service detection/prevention
- // The idea is to detect peers that are behaving
- // badly and disconnect/ban them, but do it in a
- // one-coding-mistake-won't-shatter-the-entire-network
- // way.
- // IMPORTANT: There should be nothing I can give a
- // node that it will forward on that will make that
- // node's peers drop it. If there is, an attacker
- // can isolate a node and/or try to split the network.
- // Dropping a node for sending stuff that is invalid
- // now but might be valid in a later version is also
- // dangerous, because it can cause a network split
- // between nodes running old code and nodes running
- // new code.
- static void ClearBanned(); // needed for unit testing
- static bool IsBanned(CNetAddr ip);
- static bool IsBanned(CSubNet subnet);
- static void Ban(const CNetAddr &ip, const BanReason &banReason, int64_t bantimeoffset = 0, bool sinceUnixEpoch = false);
- static void Ban(const CSubNet &subNet, const BanReason &banReason, int64_t bantimeoffset = 0, bool sinceUnixEpoch = false);
- static bool Unban(const CNetAddr &ip);
- static bool Unban(const CSubNet &ip);
- static void GetBanned(banmap_t &banmap);
- static void SetBanned(const banmap_t &banmap);
-
- //!check is the banlist has unwritten changes
- static bool BannedSetIsDirty();
- //!set the "dirty" flag for the banlist
- static void SetBannedSetDirty(bool dirty=true);
- //!clean unused entries (if bantime has expired)
- static void SweepBanned();
-
void copyStats(CNodeStats &stats);
- static bool IsWhitelistedRange(const CNetAddr &ip);
- static void AddWhitelistedRange(const CSubNet &subnet);
-
- // Network stats
- static void RecordBytesRecv(uint64_t bytes);
- static void RecordBytesSent(uint64_t bytes);
-
- static uint64_t GetTotalBytesRecv();
- static uint64_t GetTotalBytesSent();
-
- //!set the max outbound target in bytes
- static void SetMaxOutboundTarget(uint64_t limit);
- static uint64_t GetMaxOutboundTarget();
-
- //!set the timeframe for the max outbound target
- static void SetMaxOutboundTimeframe(uint64_t timeframe);
- static uint64_t GetMaxOutboundTimeframe();
-
- //!check if the outbound target is reached
- // if param historicalBlockServingLimit is set true, the function will
- // response true if the limit for serving historical blocks has been reached
- static bool OutboundTargetReached(bool historicalBlockServingLimit);
-
- //!response the bytes left in the current max outbound cycle
- // in case of no limit, it will always response 0
- static uint64_t GetOutboundTargetBytesLeft();
-
- //!response the time in second left in the current max outbound cycle
- // in case of no limit, it will always response 0
- static uint64_t GetMaxOutboundTimeLeftInCycle();
+ ServiceFlags GetLocalServices() const
+ {
+ return nLocalServices;
+ }
};
-class CTransaction;
-void RelayTransaction(const CTransaction& tx);
-void RelayTransaction(const CTransaction& tx, const CDataStream& ss);
-
-/** Access to the (IP) address database (peers.dat) */
-class CAddrDB
-{
-private:
- boost::filesystem::path pathAddr;
-public:
- CAddrDB();
- bool Write(const CAddrMan& addr);
- bool Read(CAddrMan& addr);
-};
-/** Access to the banlist database (banlist.dat) */
-class CBanDB
-{
-private:
- boost::filesystem::path pathBanlist;
-public:
- CBanDB();
- bool Write(const banmap_t& banSet);
- bool Read(banmap_t& banSet);
-};
-void DumpBanlist();
+/** Return a timestamp in the future (in microseconds) for exponentially distributed events. */
+int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds);
#endif // BITCOIN_NET_H
diff --git a/src/netaddress.cpp b/src/netaddress.cpp
new file mode 100644
index 0000000000..db5cc3bc20
--- /dev/null
+++ b/src/netaddress.cpp
@@ -0,0 +1,716 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// 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.
+
+#ifdef HAVE_CONFIG_H
+#include "config/bitcoin-config.h"
+#endif
+
+#include "netaddress.h"
+#include "hash.h"
+#include "utilstrencodings.h"
+#include "tinyformat.h"
+
+static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff };
+static const unsigned char pchOnionCat[] = {0xFD,0x87,0xD8,0x7E,0xEB,0x43};
+
+void CNetAddr::Init()
+{
+ memset(ip, 0, sizeof(ip));
+ scopeId = 0;
+}
+
+void CNetAddr::SetIP(const CNetAddr& ipIn)
+{
+ memcpy(ip, ipIn.ip, sizeof(ip));
+}
+
+void CNetAddr::SetRaw(Network network, const uint8_t *ip_in)
+{
+ switch(network)
+ {
+ case NET_IPV4:
+ memcpy(ip, pchIPv4, 12);
+ memcpy(ip+12, ip_in, 4);
+ break;
+ case NET_IPV6:
+ memcpy(ip, ip_in, 16);
+ break;
+ default:
+ assert(!"invalid network");
+ }
+}
+
+bool CNetAddr::SetSpecial(const std::string &strName)
+{
+ if (strName.size()>6 && strName.substr(strName.size() - 6, 6) == ".onion") {
+ std::vector<unsigned char> vchAddr = DecodeBase32(strName.substr(0, strName.size() - 6).c_str());
+ if (vchAddr.size() != 16-sizeof(pchOnionCat))
+ return false;
+ memcpy(ip, pchOnionCat, sizeof(pchOnionCat));
+ for (unsigned int i=0; i<16-sizeof(pchOnionCat); i++)
+ ip[i + sizeof(pchOnionCat)] = vchAddr[i];
+ return true;
+ }
+ return false;
+}
+
+CNetAddr::CNetAddr()
+{
+ Init();
+}
+
+CNetAddr::CNetAddr(const struct in_addr& ipv4Addr)
+{
+ SetRaw(NET_IPV4, (const uint8_t*)&ipv4Addr);
+}
+
+CNetAddr::CNetAddr(const struct in6_addr& ipv6Addr, const uint32_t scope)
+{
+ SetRaw(NET_IPV6, (const uint8_t*)&ipv6Addr);
+ scopeId = scope;
+}
+
+unsigned int CNetAddr::GetByte(int n) const
+{
+ return ip[15-n];
+}
+
+bool CNetAddr::IsIPv4() const
+{
+ return (memcmp(ip, pchIPv4, sizeof(pchIPv4)) == 0);
+}
+
+bool CNetAddr::IsIPv6() const
+{
+ return (!IsIPv4() && !IsTor());
+}
+
+bool CNetAddr::IsRFC1918() const
+{
+ return IsIPv4() && (
+ GetByte(3) == 10 ||
+ (GetByte(3) == 192 && GetByte(2) == 168) ||
+ (GetByte(3) == 172 && (GetByte(2) >= 16 && GetByte(2) <= 31)));
+}
+
+bool CNetAddr::IsRFC2544() const
+{
+ return IsIPv4() && GetByte(3) == 198 && (GetByte(2) == 18 || GetByte(2) == 19);
+}
+
+bool CNetAddr::IsRFC3927() const
+{
+ return IsIPv4() && (GetByte(3) == 169 && GetByte(2) == 254);
+}
+
+bool CNetAddr::IsRFC6598() const
+{
+ return IsIPv4() && GetByte(3) == 100 && GetByte(2) >= 64 && GetByte(2) <= 127;
+}
+
+bool CNetAddr::IsRFC5737() const
+{
+ return IsIPv4() && ((GetByte(3) == 192 && GetByte(2) == 0 && GetByte(1) == 2) ||
+ (GetByte(3) == 198 && GetByte(2) == 51 && GetByte(1) == 100) ||
+ (GetByte(3) == 203 && GetByte(2) == 0 && GetByte(1) == 113));
+}
+
+bool CNetAddr::IsRFC3849() const
+{
+ return GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x0D && GetByte(12) == 0xB8;
+}
+
+bool CNetAddr::IsRFC3964() const
+{
+ return (GetByte(15) == 0x20 && GetByte(14) == 0x02);
+}
+
+bool CNetAddr::IsRFC6052() const
+{
+ static const unsigned char pchRFC6052[] = {0,0x64,0xFF,0x9B,0,0,0,0,0,0,0,0};
+ return (memcmp(ip, pchRFC6052, sizeof(pchRFC6052)) == 0);
+}
+
+bool CNetAddr::IsRFC4380() const
+{
+ return (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0 && GetByte(12) == 0);
+}
+
+bool CNetAddr::IsRFC4862() const
+{
+ static const unsigned char pchRFC4862[] = {0xFE,0x80,0,0,0,0,0,0};
+ return (memcmp(ip, pchRFC4862, sizeof(pchRFC4862)) == 0);
+}
+
+bool CNetAddr::IsRFC4193() const
+{
+ return ((GetByte(15) & 0xFE) == 0xFC);
+}
+
+bool CNetAddr::IsRFC6145() const
+{
+ static const unsigned char pchRFC6145[] = {0,0,0,0,0,0,0,0,0xFF,0xFF,0,0};
+ return (memcmp(ip, pchRFC6145, sizeof(pchRFC6145)) == 0);
+}
+
+bool CNetAddr::IsRFC4843() const
+{
+ return (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x00 && (GetByte(12) & 0xF0) == 0x10);
+}
+
+bool CNetAddr::IsTor() const
+{
+ return (memcmp(ip, pchOnionCat, sizeof(pchOnionCat)) == 0);
+}
+
+bool CNetAddr::IsLocal() const
+{
+ // IPv4 loopback
+ if (IsIPv4() && (GetByte(3) == 127 || GetByte(3) == 0))
+ return true;
+
+ // IPv6 loopback (::1/128)
+ static const unsigned char pchLocal[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
+ if (memcmp(ip, pchLocal, 16) == 0)
+ return true;
+
+ return false;
+}
+
+bool CNetAddr::IsMulticast() const
+{
+ return (IsIPv4() && (GetByte(3) & 0xF0) == 0xE0)
+ || (GetByte(15) == 0xFF);
+}
+
+bool CNetAddr::IsValid() const
+{
+ // Cleanup 3-byte shifted addresses caused by garbage in size field
+ // of addr messages from versions before 0.2.9 checksum.
+ // Two consecutive addr messages look like this:
+ // header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26...
+ // so if the first length field is garbled, it reads the second batch
+ // of addr misaligned by 3 bytes.
+ if (memcmp(ip, pchIPv4+3, sizeof(pchIPv4)-3) == 0)
+ return false;
+
+ // unspecified IPv6 address (::/128)
+ unsigned char ipNone6[16] = {};
+ if (memcmp(ip, ipNone6, 16) == 0)
+ return false;
+
+ // documentation IPv6 address
+ if (IsRFC3849())
+ return false;
+
+ if (IsIPv4())
+ {
+ // INADDR_NONE
+ uint32_t ipNone = INADDR_NONE;
+ if (memcmp(ip+12, &ipNone, 4) == 0)
+ return false;
+
+ // 0
+ ipNone = 0;
+ if (memcmp(ip+12, &ipNone, 4) == 0)
+ return false;
+ }
+
+ return true;
+}
+
+bool CNetAddr::IsRoutable() const
+{
+ return IsValid() && !(IsRFC1918() || IsRFC2544() || IsRFC3927() || IsRFC4862() || IsRFC6598() || IsRFC5737() || (IsRFC4193() && !IsTor()) || IsRFC4843() || IsLocal());
+}
+
+enum Network CNetAddr::GetNetwork() const
+{
+ if (!IsRoutable())
+ return NET_UNROUTABLE;
+
+ if (IsIPv4())
+ return NET_IPV4;
+
+ if (IsTor())
+ return NET_TOR;
+
+ return NET_IPV6;
+}
+
+std::string CNetAddr::ToStringIP() const
+{
+ if (IsTor())
+ return EncodeBase32(&ip[6], 10) + ".onion";
+ CService serv(*this, 0);
+ struct sockaddr_storage sockaddr;
+ socklen_t socklen = sizeof(sockaddr);
+ if (serv.GetSockAddr((struct sockaddr*)&sockaddr, &socklen)) {
+ char name[1025] = "";
+ if (!getnameinfo((const struct sockaddr*)&sockaddr, socklen, name, sizeof(name), NULL, 0, NI_NUMERICHOST))
+ return std::string(name);
+ }
+ if (IsIPv4())
+ return strprintf("%u.%u.%u.%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0));
+ else
+ return strprintf("%x:%x:%x:%x:%x:%x:%x:%x",
+ GetByte(15) << 8 | GetByte(14), GetByte(13) << 8 | GetByte(12),
+ GetByte(11) << 8 | GetByte(10), GetByte(9) << 8 | GetByte(8),
+ GetByte(7) << 8 | GetByte(6), GetByte(5) << 8 | GetByte(4),
+ GetByte(3) << 8 | GetByte(2), GetByte(1) << 8 | GetByte(0));
+}
+
+std::string CNetAddr::ToString() const
+{
+ return ToStringIP();
+}
+
+bool operator==(const CNetAddr& a, const CNetAddr& b)
+{
+ return (memcmp(a.ip, b.ip, 16) == 0);
+}
+
+bool operator!=(const CNetAddr& a, const CNetAddr& b)
+{
+ return (memcmp(a.ip, b.ip, 16) != 0);
+}
+
+bool operator<(const CNetAddr& a, const CNetAddr& b)
+{
+ return (memcmp(a.ip, b.ip, 16) < 0);
+}
+
+bool CNetAddr::GetInAddr(struct in_addr* pipv4Addr) const
+{
+ if (!IsIPv4())
+ return false;
+ memcpy(pipv4Addr, ip+12, 4);
+ return true;
+}
+
+bool CNetAddr::GetIn6Addr(struct in6_addr* pipv6Addr) const
+{
+ memcpy(pipv6Addr, ip, 16);
+ return true;
+}
+
+// get canonical identifier of an address' group
+// no two connections will be attempted to addresses with the same group
+std::vector<unsigned char> CNetAddr::GetGroup() const
+{
+ std::vector<unsigned char> vchRet;
+ int nClass = NET_IPV6;
+ int nStartByte = 0;
+ int nBits = 16;
+
+ // all local addresses belong to the same group
+ if (IsLocal())
+ {
+ nClass = 255;
+ nBits = 0;
+ }
+
+ // all unroutable addresses belong to the same group
+ if (!IsRoutable())
+ {
+ nClass = NET_UNROUTABLE;
+ nBits = 0;
+ }
+ // for IPv4 addresses, '1' + the 16 higher-order bits of the IP
+ // includes mapped IPv4, SIIT translated IPv4, and the well-known prefix
+ else if (IsIPv4() || IsRFC6145() || IsRFC6052())
+ {
+ nClass = NET_IPV4;
+ nStartByte = 12;
+ }
+ // for 6to4 tunnelled addresses, use the encapsulated IPv4 address
+ else if (IsRFC3964())
+ {
+ nClass = NET_IPV4;
+ nStartByte = 2;
+ }
+ // for Teredo-tunnelled IPv6 addresses, use the encapsulated IPv4 address
+ else if (IsRFC4380())
+ {
+ vchRet.push_back(NET_IPV4);
+ vchRet.push_back(GetByte(3) ^ 0xFF);
+ vchRet.push_back(GetByte(2) ^ 0xFF);
+ return vchRet;
+ }
+ else if (IsTor())
+ {
+ nClass = NET_TOR;
+ nStartByte = 6;
+ nBits = 4;
+ }
+ // for he.net, use /36 groups
+ else if (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x04 && GetByte(12) == 0x70)
+ nBits = 36;
+ // for the rest of the IPv6 network, use /32 groups
+ else
+ nBits = 32;
+
+ vchRet.push_back(nClass);
+ while (nBits >= 8)
+ {
+ vchRet.push_back(GetByte(15 - nStartByte));
+ nStartByte++;
+ nBits -= 8;
+ }
+ if (nBits > 0)
+ vchRet.push_back(GetByte(15 - nStartByte) | ((1 << (8 - nBits)) - 1));
+
+ return vchRet;
+}
+
+uint64_t CNetAddr::GetHash() const
+{
+ uint256 hash = Hash(&ip[0], &ip[16]);
+ uint64_t nRet;
+ memcpy(&nRet, &hash, sizeof(nRet));
+ return nRet;
+}
+
+// private extensions to enum Network, only returned by GetExtNetwork,
+// and only used in GetReachabilityFrom
+static const int NET_UNKNOWN = NET_MAX + 0;
+static const int NET_TEREDO = NET_MAX + 1;
+int static GetExtNetwork(const CNetAddr *addr)
+{
+ if (addr == NULL)
+ return NET_UNKNOWN;
+ if (addr->IsRFC4380())
+ return NET_TEREDO;
+ return addr->GetNetwork();
+}
+
+/** Calculates a metric for how reachable (*this) is from a given partner */
+int CNetAddr::GetReachabilityFrom(const CNetAddr *paddrPartner) const
+{
+ enum Reachability {
+ REACH_UNREACHABLE,
+ REACH_DEFAULT,
+ REACH_TEREDO,
+ REACH_IPV6_WEAK,
+ REACH_IPV4,
+ REACH_IPV6_STRONG,
+ REACH_PRIVATE
+ };
+
+ if (!IsRoutable())
+ return REACH_UNREACHABLE;
+
+ int ourNet = GetExtNetwork(this);
+ int theirNet = GetExtNetwork(paddrPartner);
+ bool fTunnel = IsRFC3964() || IsRFC6052() || IsRFC6145();
+
+ switch(theirNet) {
+ case NET_IPV4:
+ switch(ourNet) {
+ default: return REACH_DEFAULT;
+ case NET_IPV4: return REACH_IPV4;
+ }
+ case NET_IPV6:
+ switch(ourNet) {
+ default: return REACH_DEFAULT;
+ case NET_TEREDO: return REACH_TEREDO;
+ case NET_IPV4: return REACH_IPV4;
+ case NET_IPV6: return fTunnel ? REACH_IPV6_WEAK : REACH_IPV6_STRONG; // only prefer giving our IPv6 address if it's not tunnelled
+ }
+ case NET_TOR:
+ switch(ourNet) {
+ default: return REACH_DEFAULT;
+ case NET_IPV4: return REACH_IPV4; // Tor users can connect to IPv4 as well
+ case NET_TOR: return REACH_PRIVATE;
+ }
+ case NET_TEREDO:
+ switch(ourNet) {
+ default: return REACH_DEFAULT;
+ case NET_TEREDO: return REACH_TEREDO;
+ case NET_IPV6: return REACH_IPV6_WEAK;
+ case NET_IPV4: return REACH_IPV4;
+ }
+ case NET_UNKNOWN:
+ case NET_UNROUTABLE:
+ default:
+ switch(ourNet) {
+ default: return REACH_DEFAULT;
+ case NET_TEREDO: return REACH_TEREDO;
+ case NET_IPV6: return REACH_IPV6_WEAK;
+ case NET_IPV4: return REACH_IPV4;
+ case NET_TOR: return REACH_PRIVATE; // either from Tor, or don't care about our address
+ }
+ }
+}
+
+void CService::Init()
+{
+ port = 0;
+}
+
+CService::CService()
+{
+ Init();
+}
+
+CService::CService(const CNetAddr& cip, unsigned short portIn) : CNetAddr(cip), port(portIn)
+{
+}
+
+CService::CService(const struct in_addr& ipv4Addr, unsigned short portIn) : CNetAddr(ipv4Addr), port(portIn)
+{
+}
+
+CService::CService(const struct in6_addr& ipv6Addr, unsigned short portIn) : CNetAddr(ipv6Addr), port(portIn)
+{
+}
+
+CService::CService(const struct sockaddr_in& addr) : CNetAddr(addr.sin_addr), port(ntohs(addr.sin_port))
+{
+ assert(addr.sin_family == AF_INET);
+}
+
+CService::CService(const struct sockaddr_in6 &addr) : CNetAddr(addr.sin6_addr, addr.sin6_scope_id), port(ntohs(addr.sin6_port))
+{
+ assert(addr.sin6_family == AF_INET6);
+}
+
+bool CService::SetSockAddr(const struct sockaddr *paddr)
+{
+ switch (paddr->sa_family) {
+ case AF_INET:
+ *this = CService(*(const struct sockaddr_in*)paddr);
+ return true;
+ case AF_INET6:
+ *this = CService(*(const struct sockaddr_in6*)paddr);
+ return true;
+ default:
+ return false;
+ }
+}
+
+unsigned short CService::GetPort() const
+{
+ return port;
+}
+
+bool operator==(const CService& a, const CService& b)
+{
+ return (CNetAddr)a == (CNetAddr)b && a.port == b.port;
+}
+
+bool operator!=(const CService& a, const CService& b)
+{
+ return (CNetAddr)a != (CNetAddr)b || a.port != b.port;
+}
+
+bool operator<(const CService& a, const CService& b)
+{
+ return (CNetAddr)a < (CNetAddr)b || ((CNetAddr)a == (CNetAddr)b && a.port < b.port);
+}
+
+bool CService::GetSockAddr(struct sockaddr* paddr, socklen_t *addrlen) const
+{
+ if (IsIPv4()) {
+ if (*addrlen < (socklen_t)sizeof(struct sockaddr_in))
+ return false;
+ *addrlen = sizeof(struct sockaddr_in);
+ struct sockaddr_in *paddrin = (struct sockaddr_in*)paddr;
+ memset(paddrin, 0, *addrlen);
+ if (!GetInAddr(&paddrin->sin_addr))
+ return false;
+ paddrin->sin_family = AF_INET;
+ paddrin->sin_port = htons(port);
+ return true;
+ }
+ if (IsIPv6()) {
+ if (*addrlen < (socklen_t)sizeof(struct sockaddr_in6))
+ return false;
+ *addrlen = sizeof(struct sockaddr_in6);
+ struct sockaddr_in6 *paddrin6 = (struct sockaddr_in6*)paddr;
+ memset(paddrin6, 0, *addrlen);
+ if (!GetIn6Addr(&paddrin6->sin6_addr))
+ return false;
+ paddrin6->sin6_scope_id = scopeId;
+ paddrin6->sin6_family = AF_INET6;
+ paddrin6->sin6_port = htons(port);
+ return true;
+ }
+ return false;
+}
+
+std::vector<unsigned char> CService::GetKey() const
+{
+ std::vector<unsigned char> vKey;
+ vKey.resize(18);
+ memcpy(&vKey[0], ip, 16);
+ vKey[16] = port / 0x100;
+ vKey[17] = port & 0x0FF;
+ return vKey;
+}
+
+std::string CService::ToStringPort() const
+{
+ return strprintf("%u", port);
+}
+
+std::string CService::ToStringIPPort() const
+{
+ if (IsIPv4() || IsTor()) {
+ return ToStringIP() + ":" + ToStringPort();
+ } else {
+ return "[" + ToStringIP() + "]:" + ToStringPort();
+ }
+}
+
+std::string CService::ToString() const
+{
+ return ToStringIPPort();
+}
+
+void CService::SetPort(unsigned short portIn)
+{
+ port = portIn;
+}
+
+CSubNet::CSubNet():
+ valid(false)
+{
+ memset(netmask, 0, sizeof(netmask));
+}
+
+CSubNet::CSubNet(const CNetAddr &addr, int32_t mask)
+{
+ valid = true;
+ network = addr;
+ // Default to /32 (IPv4) or /128 (IPv6), i.e. match single address
+ memset(netmask, 255, sizeof(netmask));
+
+ // IPv4 addresses start at offset 12, and first 12 bytes must match, so just offset n
+ const int astartofs = network.IsIPv4() ? 12 : 0;
+
+ int32_t n = mask;
+ if(n >= 0 && n <= (128 - astartofs*8)) // Only valid if in range of bits of address
+ {
+ n += astartofs*8;
+ // Clear bits [n..127]
+ for (; n < 128; ++n)
+ netmask[n>>3] &= ~(1<<(7-(n&7)));
+ } else
+ valid = false;
+
+ // Normalize network according to netmask
+ for(int x=0; x<16; ++x)
+ network.ip[x] &= netmask[x];
+}
+
+CSubNet::CSubNet(const CNetAddr &addr, const CNetAddr &mask)
+{
+ valid = true;
+ network = addr;
+ // Default to /32 (IPv4) or /128 (IPv6), i.e. match single address
+ memset(netmask, 255, sizeof(netmask));
+
+ // IPv4 addresses start at offset 12, and first 12 bytes must match, so just offset n
+ const int astartofs = network.IsIPv4() ? 12 : 0;
+
+ for(int x=astartofs; x<16; ++x)
+ netmask[x] = mask.ip[x];
+
+ // Normalize network according to netmask
+ for(int x=0; x<16; ++x)
+ network.ip[x] &= netmask[x];
+}
+
+CSubNet::CSubNet(const CNetAddr &addr):
+ valid(addr.IsValid())
+{
+ memset(netmask, 255, sizeof(netmask));
+ network = addr;
+}
+
+bool CSubNet::Match(const CNetAddr &addr) const
+{
+ if (!valid || !addr.IsValid())
+ return false;
+ for(int x=0; x<16; ++x)
+ if ((addr.ip[x] & netmask[x]) != network.ip[x])
+ return false;
+ return true;
+}
+
+static inline int NetmaskBits(uint8_t x)
+{
+ switch(x) {
+ case 0x00: return 0; break;
+ case 0x80: return 1; break;
+ case 0xc0: return 2; break;
+ case 0xe0: return 3; break;
+ case 0xf0: return 4; break;
+ case 0xf8: return 5; break;
+ case 0xfc: return 6; break;
+ case 0xfe: return 7; break;
+ case 0xff: return 8; break;
+ default: return -1; break;
+ }
+}
+
+std::string CSubNet::ToString() const
+{
+ /* Parse binary 1{n}0{N-n} to see if mask can be represented as /n */
+ int cidr = 0;
+ bool valid_cidr = true;
+ int n = network.IsIPv4() ? 12 : 0;
+ for (; n < 16 && netmask[n] == 0xff; ++n)
+ cidr += 8;
+ if (n < 16) {
+ int bits = NetmaskBits(netmask[n]);
+ if (bits < 0)
+ valid_cidr = false;
+ else
+ cidr += bits;
+ ++n;
+ }
+ for (; n < 16 && valid_cidr; ++n)
+ if (netmask[n] != 0x00)
+ valid_cidr = false;
+
+ /* Format output */
+ std::string strNetmask;
+ if (valid_cidr) {
+ strNetmask = strprintf("%u", cidr);
+ } else {
+ if (network.IsIPv4())
+ strNetmask = strprintf("%u.%u.%u.%u", netmask[12], netmask[13], netmask[14], netmask[15]);
+ else
+ strNetmask = strprintf("%x:%x:%x:%x:%x:%x:%x:%x",
+ netmask[0] << 8 | netmask[1], netmask[2] << 8 | netmask[3],
+ netmask[4] << 8 | netmask[5], netmask[6] << 8 | netmask[7],
+ netmask[8] << 8 | netmask[9], netmask[10] << 8 | netmask[11],
+ netmask[12] << 8 | netmask[13], netmask[14] << 8 | netmask[15]);
+ }
+
+ return network.ToString() + "/" + strNetmask;
+}
+
+bool CSubNet::IsValid() const
+{
+ return valid;
+}
+
+bool operator==(const CSubNet& a, const CSubNet& b)
+{
+ return a.valid == b.valid && a.network == b.network && !memcmp(a.netmask, b.netmask, 16);
+}
+
+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));
+}
diff --git a/src/netaddress.h b/src/netaddress.h
new file mode 100644
index 0000000000..9330fe3328
--- /dev/null
+++ b/src/netaddress.h
@@ -0,0 +1,171 @@
+// 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.
+
+#ifndef BITCOIN_NETADDRESS_H
+#define BITCOIN_NETADDRESS_H
+
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
+#include "compat.h"
+#include "serialize.h"
+
+#include <stdint.h>
+#include <string>
+#include <vector>
+
+enum Network
+{
+ NET_UNROUTABLE = 0,
+ NET_IPV4,
+ NET_IPV6,
+ NET_TOR,
+
+ NET_MAX,
+};
+
+/** IP address (IPv6, or IPv4 using mapped IPv6 range (::FFFF:0:0/96)) */
+class CNetAddr
+{
+ protected:
+ unsigned char ip[16]; // in network byte order
+ uint32_t scopeId; // for scoped/link-local ipv6 addresses
+
+ public:
+ CNetAddr();
+ CNetAddr(const struct in_addr& ipv4Addr);
+ void Init();
+ void SetIP(const CNetAddr& ip);
+
+ /**
+ * Set raw IPv4 or IPv6 address (in network byte order)
+ * @note Only NET_IPV4 and NET_IPV6 are allowed for network.
+ */
+ void SetRaw(Network network, const uint8_t *data);
+
+ bool SetSpecial(const std::string &strName); // for Tor addresses
+ bool IsIPv4() const; // IPv4 mapped address (::FFFF:0:0/96, 0.0.0.0/0)
+ bool IsIPv6() const; // IPv6 address (not mapped IPv4, not Tor)
+ bool IsRFC1918() const; // IPv4 private networks (10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12)
+ bool IsRFC2544() const; // IPv4 inter-network communcations (192.18.0.0/15)
+ bool IsRFC6598() const; // IPv4 ISP-level NAT (100.64.0.0/10)
+ bool IsRFC5737() const; // IPv4 documentation addresses (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24)
+ bool IsRFC3849() const; // IPv6 documentation address (2001:0DB8::/32)
+ bool IsRFC3927() const; // IPv4 autoconfig (169.254.0.0/16)
+ bool IsRFC3964() const; // IPv6 6to4 tunnelling (2002::/16)
+ bool IsRFC4193() const; // IPv6 unique local (FC00::/7)
+ bool IsRFC4380() const; // IPv6 Teredo tunnelling (2001::/32)
+ bool IsRFC4843() const; // IPv6 ORCHID (2001:10::/28)
+ bool IsRFC4862() const; // IPv6 autoconfig (FE80::/64)
+ bool IsRFC6052() const; // IPv6 well-known prefix (64:FF9B::/96)
+ bool IsRFC6145() const; // IPv6 IPv4-translated address (::FFFF:0:0:0/96)
+ bool IsTor() const;
+ bool IsLocal() const;
+ bool IsRoutable() const;
+ bool IsValid() const;
+ bool IsMulticast() const;
+ enum Network GetNetwork() const;
+ std::string ToString() const;
+ std::string ToStringIP() const;
+ unsigned int GetByte(int n) const;
+ uint64_t GetHash() const;
+ bool GetInAddr(struct in_addr* pipv4Addr) const;
+ std::vector<unsigned char> GetGroup() const;
+ int GetReachabilityFrom(const CNetAddr *paddrPartner = NULL) const;
+
+ CNetAddr(const struct in6_addr& pipv6Addr, const uint32_t scope = 0);
+ bool GetIn6Addr(struct in6_addr* pipv6Addr) const;
+
+ friend bool operator==(const CNetAddr& a, const CNetAddr& b);
+ friend bool operator!=(const CNetAddr& a, const CNetAddr& b);
+ friend bool operator<(const CNetAddr& a, const CNetAddr& b);
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(FLATDATA(ip));
+ }
+
+ friend class CSubNet;
+};
+
+class CSubNet
+{
+ protected:
+ /// Network (base) address
+ CNetAddr network;
+ /// Netmask, in network byte order
+ uint8_t netmask[16];
+ /// Is this value valid? (only used to signal parse errors)
+ bool valid;
+
+ public:
+ CSubNet();
+ CSubNet(const CNetAddr &addr, int32_t mask);
+ CSubNet(const CNetAddr &addr, const CNetAddr &mask);
+
+ //constructor for single ip subnet (<ipv4>/32 or <ipv6>/128)
+ explicit CSubNet(const CNetAddr &addr);
+
+ bool Match(const CNetAddr &addr) const;
+
+ std::string ToString() const;
+ bool IsValid() const;
+
+ 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);
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(network);
+ READWRITE(FLATDATA(netmask));
+ READWRITE(FLATDATA(valid));
+ }
+};
+
+/** A combination of a network address (CNetAddr) and a (TCP) port */
+class CService : public CNetAddr
+{
+ protected:
+ unsigned short port; // host order
+
+ public:
+ CService();
+ CService(const CNetAddr& ip, unsigned short port);
+ CService(const struct in_addr& ipv4Addr, unsigned short port);
+ CService(const struct sockaddr_in& addr);
+ void Init();
+ void SetPort(unsigned short portIn);
+ unsigned short GetPort() const;
+ bool GetSockAddr(struct sockaddr* paddr, socklen_t *addrlen) const;
+ bool SetSockAddr(const struct sockaddr* paddr);
+ friend bool operator==(const CService& a, const CService& b);
+ friend bool operator!=(const CService& a, const CService& b);
+ friend bool operator<(const CService& a, const CService& b);
+ std::vector<unsigned char> GetKey() const;
+ std::string ToString() const;
+ std::string ToStringPort() const;
+ std::string ToStringIPPort() const;
+
+ CService(const struct in6_addr& ipv6Addr, unsigned short port);
+ CService(const struct sockaddr_in6& addr);
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(FLATDATA(ip));
+ unsigned short portN = htons(port);
+ READWRITE(FLATDATA(portN));
+ if (ser_action.ForRead())
+ port = ntohs(portN);
+ }
+};
+
+#endif // BITCOIN_NETADDRESS_H
diff --git a/src/netbase.cpp b/src/netbase.cpp
index 05214cb026..7d7f1b6788 100644
--- a/src/netbase.cpp
+++ b/src/netbase.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -42,8 +42,6 @@ static CCriticalSection cs_proxyInfos;
int nConnectTimeout = DEFAULT_CONNECT_TIMEOUT;
bool fNameLookup = DEFAULT_NAME_LOOKUP;
-static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff };
-
// Need ample time for negotiation for very slow proxies such as Tor (milliseconds)
static const int SOCKS5_RECV_TIMEOUT = 20 * 1000;
@@ -140,7 +138,7 @@ bool static LookupIntern(const char *pszName, std::vector<CNetAddr>& vIP, unsign
return false;
do {
- // Should set the timeout limit to a resonable value to avoid
+ // Should set the timeout limit to a reasonable value to avoid
// generating unnecessary checking call during the polling loop,
// while it can still response to stop request quick enough.
// 2 seconds looks fine in our situation.
@@ -170,7 +168,8 @@ bool static LookupIntern(const char *pszName, std::vector<CNetAddr>& vIP, unsign
if (aiTrav->ai_family == AF_INET6)
{
assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in6));
- vIP.push_back(CNetAddr(((struct sockaddr_in6*)(aiTrav->ai_addr))->sin6_addr));
+ struct sockaddr_in6* s6 = (struct sockaddr_in6*) aiTrav->ai_addr;
+ vIP.push_back(CNetAddr(s6->sin6_addr, s6->sin6_scope_id));
}
aiTrav = aiTrav->ai_next;
@@ -194,6 +193,16 @@ bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nM
return LookupIntern(strHost.c_str(), vIP, nMaxSolutions, fAllowLookup);
}
+bool LookupHost(const char *pszName, CNetAddr& addr, bool fAllowLookup)
+{
+ std::vector<CNetAddr> vIP;
+ LookupHost(pszName, vIP, 1, fAllowLookup);
+ if(vIP.empty())
+ return false;
+ addr = vIP.front();
+ return true;
+}
+
bool Lookup(const char *pszName, std::vector<CService>& vAddr, int portDefault, bool fAllowLookup, unsigned int nMaxSolutions)
{
if (pszName[0] == 0)
@@ -222,9 +231,14 @@ bool Lookup(const char *pszName, CService& addr, int portDefault, bool fAllowLoo
return true;
}
-bool LookupNumeric(const char *pszName, CService& addr, int portDefault)
+CService LookupNumeric(const char *pszName, int portDefault)
{
- return Lookup(pszName, addr, portDefault, false);
+ CService addr;
+ // "1.2:345" will fail to resolve the ip, but will still set the port.
+ // If the ip fails to resolve, re-init the result.
+ if(!Lookup(pszName, addr, portDefault, false))
+ addr = CService();
+ return addr;
}
struct timeval MillisToTimeval(int64_t nTimeout)
@@ -290,10 +304,25 @@ struct ProxyCredentials
std::string password;
};
+std::string Socks5ErrorString(int err)
+{
+ switch(err) {
+ case 0x01: return "general failure";
+ case 0x02: return "connection not allowed";
+ case 0x03: return "network unreachable";
+ case 0x04: return "host unreachable";
+ case 0x05: return "connection refused";
+ case 0x06: return "TTL expired";
+ case 0x07: return "protocol error";
+ case 0x08: return "address type not supported";
+ default: return "unknown";
+ }
+}
+
/** 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);
+ LogPrint("net", "SOCKS5 connecting %s\n", strDest);
if (strDest.size() > 255) {
CloseSocket(hSocket);
return error("Hostname too long");
@@ -317,7 +346,8 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
char pchRet1[2];
if (!InterruptibleRecv(pchRet1, 2, SOCKS5_RECV_TIMEOUT, hSocket)) {
CloseSocket(hSocket);
- return error("Error reading proxy response");
+ LogPrintf("Socks5() connect to %s:%d failed: InterruptibleRecv() timeout or other failure\n", strDest, port);
+ return false;
}
if (pchRet1[0] != 0x05) {
CloseSocket(hSocket);
@@ -378,19 +408,10 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
return error("Proxy failed to accept request");
}
if (pchRet2[1] != 0x00) {
+ // Failures to connect to a peer that are not proxy errors
CloseSocket(hSocket);
- switch (pchRet2[1])
- {
- case 0x01: return error("Proxy error: general failure");
- case 0x02: return error("Proxy error: connection not allowed");
- case 0x03: return error("Proxy error: network unreachable");
- case 0x04: return error("Proxy error: host unreachable");
- case 0x05: return error("Proxy error: connection refused");
- case 0x06: return error("Proxy error: TTL expired");
- case 0x07: return error("Proxy error: protocol error");
- case 0x08: return error("Proxy error: address type not supported");
- default: return error("Proxy error: unknown");
- }
+ LogPrintf("Socks5() connect to %s:%d failed: %s\n", strDest, port, Socks5ErrorString(pchRet2[1]));
+ return false;
}
if (pchRet2[2] != 0x00) {
CloseSocket(hSocket);
@@ -422,7 +443,7 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
CloseSocket(hSocket);
return error("Error reading from proxy");
}
- LogPrintf("SOCKS5 connected %s\n", strDest);
+ LogPrint("net", "SOCKS5 connected %s\n", strDest);
return true;
}
@@ -610,783 +631,59 @@ bool ConnectSocketByName(CService &addr, SOCKET& hSocketRet, const char *pszDest
SplitHostPort(std::string(pszDest), port, strDest);
- proxyType nameProxy;
- GetNameProxy(nameProxy);
-
- CService addrResolved(CNetAddr(strDest, fNameLookup && !HaveNameProxy()), port);
- if (addrResolved.IsValid()) {
- addr = addrResolved;
- return ConnectSocket(addr, hSocketRet, nTimeout);
- }
-
- addr = CService("0.0.0.0:0");
-
- if (!HaveNameProxy())
- return false;
- return ConnectThroughProxy(nameProxy, strDest, port, hSocketRet, nTimeout, outProxyConnectionFailed);
-}
-
-void CNetAddr::Init()
-{
- memset(ip, 0, sizeof(ip));
-}
-
-void CNetAddr::SetIP(const CNetAddr& ipIn)
-{
- memcpy(ip, ipIn.ip, sizeof(ip));
-}
-
-void CNetAddr::SetRaw(Network network, const uint8_t *ip_in)
-{
- switch(network)
- {
- case NET_IPV4:
- memcpy(ip, pchIPv4, 12);
- memcpy(ip+12, ip_in, 4);
- break;
- case NET_IPV6:
- memcpy(ip, ip_in, 16);
- break;
- default:
- assert(!"invalid network");
- }
-}
-
-static const unsigned char pchOnionCat[] = {0xFD,0x87,0xD8,0x7E,0xEB,0x43};
-
-bool CNetAddr::SetSpecial(const std::string &strName)
-{
- if (strName.size()>6 && strName.substr(strName.size() - 6, 6) == ".onion") {
- std::vector<unsigned char> vchAddr = DecodeBase32(strName.substr(0, strName.size() - 6).c_str());
- if (vchAddr.size() != 16-sizeof(pchOnionCat))
- return false;
- memcpy(ip, pchOnionCat, sizeof(pchOnionCat));
- for (unsigned int i=0; i<16-sizeof(pchOnionCat); i++)
- ip[i + sizeof(pchOnionCat)] = vchAddr[i];
- return true;
- }
- return false;
-}
-
-CNetAddr::CNetAddr()
-{
- Init();
-}
-
-CNetAddr::CNetAddr(const struct in_addr& ipv4Addr)
-{
- SetRaw(NET_IPV4, (const uint8_t*)&ipv4Addr);
-}
-
-CNetAddr::CNetAddr(const struct in6_addr& ipv6Addr)
-{
- SetRaw(NET_IPV6, (const uint8_t*)&ipv6Addr);
-}
-
-CNetAddr::CNetAddr(const char *pszIp, bool fAllowLookup)
-{
- Init();
- std::vector<CNetAddr> vIP;
- if (LookupHost(pszIp, vIP, 1, fAllowLookup))
- *this = vIP[0];
-}
-
-CNetAddr::CNetAddr(const std::string &strIp, bool fAllowLookup)
-{
- Init();
- std::vector<CNetAddr> vIP;
- if (LookupHost(strIp.c_str(), vIP, 1, fAllowLookup))
- *this = vIP[0];
-}
-
-unsigned int CNetAddr::GetByte(int n) const
-{
- return ip[15-n];
-}
-
-bool CNetAddr::IsIPv4() const
-{
- return (memcmp(ip, pchIPv4, sizeof(pchIPv4)) == 0);
-}
-
-bool CNetAddr::IsIPv6() const
-{
- return (!IsIPv4() && !IsTor());
-}
-
-bool CNetAddr::IsRFC1918() const
-{
- return IsIPv4() && (
- GetByte(3) == 10 ||
- (GetByte(3) == 192 && GetByte(2) == 168) ||
- (GetByte(3) == 172 && (GetByte(2) >= 16 && GetByte(2) <= 31)));
-}
-
-bool CNetAddr::IsRFC2544() const
-{
- return IsIPv4() && GetByte(3) == 198 && (GetByte(2) == 18 || GetByte(2) == 19);
-}
-
-bool CNetAddr::IsRFC3927() const
-{
- return IsIPv4() && (GetByte(3) == 169 && GetByte(2) == 254);
-}
-
-bool CNetAddr::IsRFC6598() const
-{
- return IsIPv4() && GetByte(3) == 100 && GetByte(2) >= 64 && GetByte(2) <= 127;
-}
-
-bool CNetAddr::IsRFC5737() const
-{
- return IsIPv4() && ((GetByte(3) == 192 && GetByte(2) == 0 && GetByte(1) == 2) ||
- (GetByte(3) == 198 && GetByte(2) == 51 && GetByte(1) == 100) ||
- (GetByte(3) == 203 && GetByte(2) == 0 && GetByte(1) == 113));
-}
-
-bool CNetAddr::IsRFC3849() const
-{
- return GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x0D && GetByte(12) == 0xB8;
-}
-
-bool CNetAddr::IsRFC3964() const
-{
- return (GetByte(15) == 0x20 && GetByte(14) == 0x02);
-}
-
-bool CNetAddr::IsRFC6052() const
-{
- static const unsigned char pchRFC6052[] = {0,0x64,0xFF,0x9B,0,0,0,0,0,0,0,0};
- return (memcmp(ip, pchRFC6052, sizeof(pchRFC6052)) == 0);
-}
-
-bool CNetAddr::IsRFC4380() const
-{
- return (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0 && GetByte(12) == 0);
-}
-
-bool CNetAddr::IsRFC4862() const
-{
- static const unsigned char pchRFC4862[] = {0xFE,0x80,0,0,0,0,0,0};
- return (memcmp(ip, pchRFC4862, sizeof(pchRFC4862)) == 0);
-}
-
-bool CNetAddr::IsRFC4193() const
-{
- return ((GetByte(15) & 0xFE) == 0xFC);
-}
-
-bool CNetAddr::IsRFC6145() const
-{
- static const unsigned char pchRFC6145[] = {0,0,0,0,0,0,0,0,0xFF,0xFF,0,0};
- return (memcmp(ip, pchRFC6145, sizeof(pchRFC6145)) == 0);
-}
-
-bool CNetAddr::IsRFC4843() const
-{
- return (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x00 && (GetByte(12) & 0xF0) == 0x10);
-}
-
-bool CNetAddr::IsTor() const
-{
- return (memcmp(ip, pchOnionCat, sizeof(pchOnionCat)) == 0);
-}
-
-bool CNetAddr::IsLocal() const
-{
- // IPv4 loopback
- if (IsIPv4() && (GetByte(3) == 127 || GetByte(3) == 0))
- return true;
-
- // IPv6 loopback (::1/128)
- static const unsigned char pchLocal[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
- if (memcmp(ip, pchLocal, 16) == 0)
- return true;
-
- return false;
-}
-
-bool CNetAddr::IsMulticast() const
-{
- return (IsIPv4() && (GetByte(3) & 0xF0) == 0xE0)
- || (GetByte(15) == 0xFF);
-}
-
-bool CNetAddr::IsValid() const
-{
- // Cleanup 3-byte shifted addresses caused by garbage in size field
- // of addr messages from versions before 0.2.9 checksum.
- // Two consecutive addr messages look like this:
- // header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26...
- // so if the first length field is garbled, it reads the second batch
- // of addr misaligned by 3 bytes.
- if (memcmp(ip, pchIPv4+3, sizeof(pchIPv4)-3) == 0)
- return false;
-
- // unspecified IPv6 address (::/128)
- unsigned char ipNone[16] = {};
- if (memcmp(ip, ipNone, 16) == 0)
- return false;
-
- // documentation IPv6 address
- if (IsRFC3849())
- return false;
-
- if (IsIPv4())
- {
- // INADDR_NONE
- uint32_t ipNone = INADDR_NONE;
- if (memcmp(ip+12, &ipNone, 4) == 0)
- return false;
-
- // 0
- ipNone = 0;
- if (memcmp(ip+12, &ipNone, 4) == 0)
- return false;
- }
-
- return true;
-}
-
-bool CNetAddr::IsRoutable() const
-{
- return IsValid() && !(IsRFC1918() || IsRFC2544() || IsRFC3927() || IsRFC4862() || IsRFC6598() || IsRFC5737() || (IsRFC4193() && !IsTor()) || IsRFC4843() || IsLocal());
-}
-
-enum Network CNetAddr::GetNetwork() const
-{
- if (!IsRoutable())
- return NET_UNROUTABLE;
-
- if (IsIPv4())
- return NET_IPV4;
-
- if (IsTor())
- return NET_TOR;
-
- return NET_IPV6;
-}
-
-std::string CNetAddr::ToStringIP() const
-{
- if (IsTor())
- return EncodeBase32(&ip[6], 10) + ".onion";
- CService serv(*this, 0);
- struct sockaddr_storage sockaddr;
- socklen_t socklen = sizeof(sockaddr);
- if (serv.GetSockAddr((struct sockaddr*)&sockaddr, &socklen)) {
- char name[1025] = "";
- if (!getnameinfo((const struct sockaddr*)&sockaddr, socklen, name, sizeof(name), NULL, 0, NI_NUMERICHOST))
- return std::string(name);
- }
- if (IsIPv4())
- return strprintf("%u.%u.%u.%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0));
- else
- return strprintf("%x:%x:%x:%x:%x:%x:%x:%x",
- GetByte(15) << 8 | GetByte(14), GetByte(13) << 8 | GetByte(12),
- GetByte(11) << 8 | GetByte(10), GetByte(9) << 8 | GetByte(8),
- GetByte(7) << 8 | GetByte(6), GetByte(5) << 8 | GetByte(4),
- GetByte(3) << 8 | GetByte(2), GetByte(1) << 8 | GetByte(0));
-}
-
-std::string CNetAddr::ToString() const
-{
- return ToStringIP();
-}
-
-bool operator==(const CNetAddr& a, const CNetAddr& b)
-{
- return (memcmp(a.ip, b.ip, 16) == 0);
-}
-
-bool operator!=(const CNetAddr& a, const CNetAddr& b)
-{
- return (memcmp(a.ip, b.ip, 16) != 0);
-}
-
-bool operator<(const CNetAddr& a, const CNetAddr& b)
-{
- return (memcmp(a.ip, b.ip, 16) < 0);
-}
-
-bool CNetAddr::GetInAddr(struct in_addr* pipv4Addr) const
-{
- if (!IsIPv4())
- return false;
- memcpy(pipv4Addr, ip+12, 4);
- return true;
-}
-
-bool CNetAddr::GetIn6Addr(struct in6_addr* pipv6Addr) const
-{
- memcpy(pipv6Addr, ip, 16);
- return true;
-}
-
-// get canonical identifier of an address' group
-// no two connections will be attempted to addresses with the same group
-std::vector<unsigned char> CNetAddr::GetGroup() const
-{
- std::vector<unsigned char> vchRet;
- int nClass = NET_IPV6;
- int nStartByte = 0;
- int nBits = 16;
-
- // all local addresses belong to the same group
- if (IsLocal())
- {
- nClass = 255;
- nBits = 0;
- }
-
- // all unroutable addresses belong to the same group
- if (!IsRoutable())
- {
- nClass = NET_UNROUTABLE;
- nBits = 0;
- }
- // for IPv4 addresses, '1' + the 16 higher-order bits of the IP
- // includes mapped IPv4, SIIT translated IPv4, and the well-known prefix
- else if (IsIPv4() || IsRFC6145() || IsRFC6052())
- {
- nClass = NET_IPV4;
- nStartByte = 12;
- }
- // for 6to4 tunnelled addresses, use the encapsulated IPv4 address
- else if (IsRFC3964())
- {
- nClass = NET_IPV4;
- nStartByte = 2;
- }
- // for Teredo-tunnelled IPv6 addresses, use the encapsulated IPv4 address
- else if (IsRFC4380())
- {
- vchRet.push_back(NET_IPV4);
- vchRet.push_back(GetByte(3) ^ 0xFF);
- vchRet.push_back(GetByte(2) ^ 0xFF);
- return vchRet;
- }
- else if (IsTor())
- {
- nClass = NET_TOR;
- nStartByte = 6;
- nBits = 4;
- }
- // for he.net, use /36 groups
- else if (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x04 && GetByte(12) == 0x70)
- nBits = 36;
- // for the rest of the IPv6 network, use /32 groups
- else
- nBits = 32;
-
- vchRet.push_back(nClass);
- while (nBits >= 8)
- {
- vchRet.push_back(GetByte(15 - nStartByte));
- nStartByte++;
- nBits -= 8;
- }
- if (nBits > 0)
- vchRet.push_back(GetByte(15 - nStartByte) | ((1 << (8 - nBits)) - 1));
-
- return vchRet;
-}
-
-uint64_t CNetAddr::GetHash() const
-{
- uint256 hash = Hash(&ip[0], &ip[16]);
- uint64_t nRet;
- memcpy(&nRet, &hash, sizeof(nRet));
- return nRet;
-}
-
-// private extensions to enum Network, only returned by GetExtNetwork,
-// and only used in GetReachabilityFrom
-static const int NET_UNKNOWN = NET_MAX + 0;
-static const int NET_TEREDO = NET_MAX + 1;
-int static GetExtNetwork(const CNetAddr *addr)
-{
- if (addr == NULL)
- return NET_UNKNOWN;
- if (addr->IsRFC4380())
- return NET_TEREDO;
- return addr->GetNetwork();
-}
+ proxyType proxy;
+ GetNameProxy(proxy);
-/** Calculates a metric for how reachable (*this) is from a given partner */
-int CNetAddr::GetReachabilityFrom(const CNetAddr *paddrPartner) const
-{
- enum Reachability {
- REACH_UNREACHABLE,
- REACH_DEFAULT,
- REACH_TEREDO,
- REACH_IPV6_WEAK,
- REACH_IPV4,
- REACH_IPV6_STRONG,
- REACH_PRIVATE
- };
-
- if (!IsRoutable())
- return REACH_UNREACHABLE;
-
- int ourNet = GetExtNetwork(this);
- int theirNet = GetExtNetwork(paddrPartner);
- bool fTunnel = IsRFC3964() || IsRFC6052() || IsRFC6145();
-
- switch(theirNet) {
- case NET_IPV4:
- switch(ourNet) {
- default: return REACH_DEFAULT;
- case NET_IPV4: return REACH_IPV4;
- }
- case NET_IPV6:
- switch(ourNet) {
- default: return REACH_DEFAULT;
- case NET_TEREDO: return REACH_TEREDO;
- case NET_IPV4: return REACH_IPV4;
- case NET_IPV6: return fTunnel ? REACH_IPV6_WEAK : REACH_IPV6_STRONG; // only prefer giving our IPv6 address if it's not tunnelled
- }
- case NET_TOR:
- switch(ourNet) {
- default: return REACH_DEFAULT;
- case NET_IPV4: return REACH_IPV4; // Tor users can connect to IPv4 as well
- case NET_TOR: return REACH_PRIVATE;
- }
- case NET_TEREDO:
- switch(ourNet) {
- default: return REACH_DEFAULT;
- case NET_TEREDO: return REACH_TEREDO;
- case NET_IPV6: return REACH_IPV6_WEAK;
- case NET_IPV4: return REACH_IPV4;
- }
- case NET_UNKNOWN:
- case NET_UNROUTABLE:
- default:
- switch(ourNet) {
- default: return REACH_DEFAULT;
- case NET_TEREDO: return REACH_TEREDO;
- case NET_IPV6: return REACH_IPV6_WEAK;
- case NET_IPV4: return REACH_IPV4;
- case NET_TOR: return REACH_PRIVATE; // either from Tor, or don't care about our address
+ std::vector<CService> addrResolved;
+ if (Lookup(strDest.c_str(), addrResolved, port, fNameLookup && !HaveNameProxy(), 256)) {
+ if (addrResolved.size() > 0) {
+ addr = addrResolved[GetRand(addrResolved.size())];
+ return ConnectSocket(addr, hSocketRet, nTimeout);
}
}
-}
-void CService::Init()
-{
- port = 0;
-}
+ addr = CService();
-CService::CService()
-{
- Init();
-}
-
-CService::CService(const CNetAddr& cip, unsigned short portIn) : CNetAddr(cip), port(portIn)
-{
-}
-
-CService::CService(const struct in_addr& ipv4Addr, unsigned short portIn) : CNetAddr(ipv4Addr), port(portIn)
-{
-}
-
-CService::CService(const struct in6_addr& ipv6Addr, unsigned short portIn) : CNetAddr(ipv6Addr), port(portIn)
-{
-}
-
-CService::CService(const struct sockaddr_in& addr) : CNetAddr(addr.sin_addr), port(ntohs(addr.sin_port))
-{
- assert(addr.sin_family == AF_INET);
-}
-
-CService::CService(const struct sockaddr_in6 &addr) : CNetAddr(addr.sin6_addr), port(ntohs(addr.sin6_port))
-{
- assert(addr.sin6_family == AF_INET6);
-}
-
-bool CService::SetSockAddr(const struct sockaddr *paddr)
-{
- switch (paddr->sa_family) {
- case AF_INET:
- *this = CService(*(const struct sockaddr_in*)paddr);
- return true;
- case AF_INET6:
- *this = CService(*(const struct sockaddr_in6*)paddr);
- return true;
- default:
+ if (!HaveNameProxy())
return false;
- }
-}
-
-CService::CService(const char *pszIpPort, bool fAllowLookup)
-{
- Init();
- CService ip;
- if (Lookup(pszIpPort, ip, 0, fAllowLookup))
- *this = ip;
-}
-
-CService::CService(const char *pszIpPort, int portDefault, bool fAllowLookup)
-{
- Init();
- CService ip;
- if (Lookup(pszIpPort, ip, portDefault, fAllowLookup))
- *this = ip;
-}
-
-CService::CService(const std::string &strIpPort, bool fAllowLookup)
-{
- Init();
- CService ip;
- if (Lookup(strIpPort.c_str(), ip, 0, fAllowLookup))
- *this = ip;
-}
-
-CService::CService(const std::string &strIpPort, int portDefault, bool fAllowLookup)
-{
- Init();
- CService ip;
- if (Lookup(strIpPort.c_str(), ip, portDefault, fAllowLookup))
- *this = ip;
-}
-
-unsigned short CService::GetPort() const
-{
- return port;
-}
-
-bool operator==(const CService& a, const CService& b)
-{
- return (CNetAddr)a == (CNetAddr)b && a.port == b.port;
+ return ConnectThroughProxy(proxy, strDest, port, hSocketRet, nTimeout, outProxyConnectionFailed);
}
-bool operator!=(const CService& a, const CService& b)
-{
- return (CNetAddr)a != (CNetAddr)b || a.port != b.port;
-}
-
-bool operator<(const CService& a, const CService& b)
-{
- return (CNetAddr)a < (CNetAddr)b || ((CNetAddr)a == (CNetAddr)b && a.port < b.port);
-}
-
-bool CService::GetSockAddr(struct sockaddr* paddr, socklen_t *addrlen) const
-{
- if (IsIPv4()) {
- if (*addrlen < (socklen_t)sizeof(struct sockaddr_in))
- return false;
- *addrlen = sizeof(struct sockaddr_in);
- struct sockaddr_in *paddrin = (struct sockaddr_in*)paddr;
- memset(paddrin, 0, *addrlen);
- if (!GetInAddr(&paddrin->sin_addr))
- return false;
- paddrin->sin_family = AF_INET;
- paddrin->sin_port = htons(port);
- return true;
- }
- if (IsIPv6()) {
- if (*addrlen < (socklen_t)sizeof(struct sockaddr_in6))
- return false;
- *addrlen = sizeof(struct sockaddr_in6);
- struct sockaddr_in6 *paddrin6 = (struct sockaddr_in6*)paddr;
- memset(paddrin6, 0, *addrlen);
- if (!GetIn6Addr(&paddrin6->sin6_addr))
- return false;
- paddrin6->sin6_family = AF_INET6;
- paddrin6->sin6_port = htons(port);
- return true;
- }
- return false;
-}
-
-std::vector<unsigned char> CService::GetKey() const
-{
- std::vector<unsigned char> vKey;
- vKey.resize(18);
- memcpy(&vKey[0], ip, 16);
- vKey[16] = port / 0x100;
- vKey[17] = port & 0x0FF;
- return vKey;
-}
-
-std::string CService::ToStringPort() const
-{
- return strprintf("%u", port);
-}
-
-std::string CService::ToStringIPPort() const
-{
- if (IsIPv4() || IsTor()) {
- return ToStringIP() + ":" + ToStringPort();
- } else {
- return "[" + ToStringIP() + "]:" + ToStringPort();
- }
-}
-
-std::string CService::ToString() const
-{
- return ToStringIPPort();
-}
-
-void CService::SetPort(unsigned short portIn)
-{
- port = portIn;
-}
-
-CSubNet::CSubNet():
- valid(false)
-{
- memset(netmask, 0, sizeof(netmask));
-}
-
-CSubNet::CSubNet(const std::string &strSubnet, bool fAllowLookup)
+bool LookupSubNet(const char* pszName, CSubNet& ret)
{
+ std::string strSubnet(pszName);
size_t slash = strSubnet.find_last_of('/');
std::vector<CNetAddr> vIP;
- valid = true;
- // Default to /32 (IPv4) or /128 (IPv6), i.e. match single address
- memset(netmask, 255, sizeof(netmask));
-
std::string strAddress = strSubnet.substr(0, slash);
- if (LookupHost(strAddress.c_str(), vIP, 1, fAllowLookup))
+ if (LookupHost(strAddress.c_str(), vIP, 1, false))
{
- network = vIP[0];
+ CNetAddr network = vIP[0];
if (slash != strSubnet.npos)
{
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
- const int astartofs = network.IsIPv4() ? 12 : 0;
- if (ParseInt32(strNetmask, &n)) // If valid number, assume /24 symtex
- {
- if(n >= 0 && n <= (128 - astartofs*8)) // Only valid if in range of bits of address
- {
- n += astartofs*8;
- // Clear bits [n..127]
- for (; n < 128; ++n)
- netmask[n>>3] &= ~(1<<(7-(n&7)));
- }
- else
- {
- valid = false;
- }
+ if (ParseInt32(strNetmask, &n)) { // If valid number, assume /24 syntax
+ ret = CSubNet(network, n);
+ return ret.IsValid();
}
else // If not a valid number, try full netmask syntax
{
- if (LookupHost(strNetmask.c_str(), vIP, 1, false)) // Never allow lookup for netmask
- {
- // 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.
- for(int x=astartofs; x<16; ++x)
- netmask[x] = vIP[0].ip[x];
- }
- else
- {
- valid = false;
+ // Never allow lookup for netmask
+ if (LookupHost(strNetmask.c_str(), vIP, 1, false)) {
+ ret = CSubNet(network, vIP[0]);
+ return ret.IsValid();
}
}
}
- }
- else
- {
- valid = false;
- }
-
- // Normalize network according to netmask
- for(int x=0; x<16; ++x)
- network.ip[x] &= netmask[x];
-}
-
-CSubNet::CSubNet(const CNetAddr &addr):
- valid(addr.IsValid())
-{
- memset(netmask, 255, sizeof(netmask));
- network = addr;
-}
-
-bool CSubNet::Match(const CNetAddr &addr) const
-{
- if (!valid || !addr.IsValid())
- return false;
- for(int x=0; x<16; ++x)
- if ((addr.ip[x] & netmask[x]) != network.ip[x])
- return false;
- return true;
-}
-
-static inline int NetmaskBits(uint8_t x)
-{
- switch(x) {
- case 0x00: return 0; break;
- case 0x80: return 1; break;
- case 0xc0: return 2; break;
- case 0xe0: return 3; break;
- case 0xf0: return 4; break;
- case 0xf8: return 5; break;
- case 0xfc: return 6; break;
- case 0xfe: return 7; break;
- case 0xff: return 8; break;
- default: return -1; break;
- }
-}
-
-std::string CSubNet::ToString() const
-{
- /* Parse binary 1{n}0{N-n} to see if mask can be represented as /n */
- int cidr = 0;
- bool valid_cidr = true;
- int n = network.IsIPv4() ? 12 : 0;
- for (; n < 16 && netmask[n] == 0xff; ++n)
- cidr += 8;
- if (n < 16) {
- int bits = NetmaskBits(netmask[n]);
- if (bits < 0)
- valid_cidr = false;
else
- cidr += bits;
- ++n;
- }
- for (; n < 16 && valid_cidr; ++n)
- if (netmask[n] != 0x00)
- valid_cidr = false;
-
- /* Format output */
- std::string strNetmask;
- if (valid_cidr) {
- strNetmask = strprintf("%u", cidr);
- } else {
- if (network.IsIPv4())
- strNetmask = strprintf("%u.%u.%u.%u", netmask[12], netmask[13], netmask[14], netmask[15]);
- else
- strNetmask = strprintf("%x:%x:%x:%x:%x:%x:%x:%x",
- netmask[0] << 8 | netmask[1], netmask[2] << 8 | netmask[3],
- netmask[4] << 8 | netmask[5], netmask[6] << 8 | netmask[7],
- netmask[8] << 8 | netmask[9], netmask[10] << 8 | netmask[11],
- netmask[12] << 8 | netmask[13], netmask[14] << 8 | netmask[15]);
+ {
+ ret = CSubNet(network);
+ return ret.IsValid();
+ }
}
-
- return network.ToString() + "/" + strNetmask;
-}
-
-bool CSubNet::IsValid() const
-{
- return valid;
-}
-
-bool operator==(const CSubNet& a, const CSubNet& b)
-{
- return a.valid == b.valid && a.network == b.network && !memcmp(a.netmask, b.netmask, 16);
-}
-
-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));
+ return false;
}
#ifdef WIN32
diff --git a/src/netbase.h b/src/netbase.h
index 9c2df0338e..eb39d16578 100644
--- a/src/netbase.h
+++ b/src/netbase.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2013 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.
@@ -10,6 +10,7 @@
#endif
#include "compat.h"
+#include "netaddress.h"
#include "serialize.h"
#include <stdint.h>
@@ -24,172 +25,11 @@ static const int DEFAULT_CONNECT_TIMEOUT = 5000;
//! -dns default
static const int DEFAULT_NAME_LOOKUP = true;
-#ifdef WIN32
-// In MSVC, this is defined as a macro, undefine it to prevent a compile and link error
-#undef SetPort
-#endif
-
-enum Network
-{
- NET_UNROUTABLE = 0,
- NET_IPV4,
- NET_IPV6,
- NET_TOR,
-
- NET_MAX,
-};
-
-/** IP address (IPv6, or IPv4 using mapped IPv6 range (::FFFF:0:0/96)) */
-class CNetAddr
-{
- protected:
- unsigned char ip[16]; // in network byte order
-
- public:
- CNetAddr();
- CNetAddr(const struct in_addr& ipv4Addr);
- explicit CNetAddr(const char *pszIp, bool fAllowLookup = false);
- explicit CNetAddr(const std::string &strIp, bool fAllowLookup = false);
- void Init();
- void SetIP(const CNetAddr& ip);
-
- /**
- * Set raw IPv4 or IPv6 address (in network byte order)
- * @note Only NET_IPV4 and NET_IPV6 are allowed for network.
- */
- void SetRaw(Network network, const uint8_t *data);
-
- bool SetSpecial(const std::string &strName); // for Tor addresses
- bool IsIPv4() const; // IPv4 mapped address (::FFFF:0:0/96, 0.0.0.0/0)
- bool IsIPv6() const; // IPv6 address (not mapped IPv4, not Tor)
- bool IsRFC1918() const; // IPv4 private networks (10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12)
- bool IsRFC2544() const; // IPv4 inter-network communcations (192.18.0.0/15)
- bool IsRFC6598() const; // IPv4 ISP-level NAT (100.64.0.0/10)
- bool IsRFC5737() const; // IPv4 documentation addresses (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24)
- bool IsRFC3849() const; // IPv6 documentation address (2001:0DB8::/32)
- bool IsRFC3927() const; // IPv4 autoconfig (169.254.0.0/16)
- bool IsRFC3964() const; // IPv6 6to4 tunnelling (2002::/16)
- bool IsRFC4193() const; // IPv6 unique local (FC00::/7)
- bool IsRFC4380() const; // IPv6 Teredo tunnelling (2001::/32)
- bool IsRFC4843() const; // IPv6 ORCHID (2001:10::/28)
- bool IsRFC4862() const; // IPv6 autoconfig (FE80::/64)
- bool IsRFC6052() const; // IPv6 well-known prefix (64:FF9B::/96)
- bool IsRFC6145() const; // IPv6 IPv4-translated address (::FFFF:0:0:0/96)
- bool IsTor() const;
- bool IsLocal() const;
- bool IsRoutable() const;
- bool IsValid() const;
- bool IsMulticast() const;
- enum Network GetNetwork() const;
- std::string ToString() const;
- std::string ToStringIP() const;
- unsigned int GetByte(int n) const;
- uint64_t GetHash() const;
- bool GetInAddr(struct in_addr* pipv4Addr) const;
- std::vector<unsigned char> GetGroup() const;
- int GetReachabilityFrom(const CNetAddr *paddrPartner = NULL) const;
-
- CNetAddr(const struct in6_addr& pipv6Addr);
- bool GetIn6Addr(struct in6_addr* pipv6Addr) const;
-
- friend bool operator==(const CNetAddr& a, const CNetAddr& b);
- friend bool operator!=(const CNetAddr& a, const CNetAddr& b);
- friend bool operator<(const CNetAddr& a, const CNetAddr& b);
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(FLATDATA(ip));
- }
-
- friend class CSubNet;
-};
-
-class CSubNet
-{
- protected:
- /// Network (base) address
- CNetAddr network;
- /// Netmask, in network byte order
- uint8_t netmask[16];
- /// Is this value valid? (only used to signal parse errors)
- bool valid;
-
- public:
- CSubNet();
- explicit CSubNet(const std::string &strSubnet, bool fAllowLookup = false);
-
- //constructor for single ip subnet (<ipv4>/32 or <ipv6>/128)
- explicit CSubNet(const CNetAddr &addr);
-
- bool Match(const CNetAddr &addr) const;
-
- std::string ToString() const;
- bool IsValid() const;
-
- 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);
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(network);
- READWRITE(FLATDATA(netmask));
- READWRITE(FLATDATA(valid));
- }
-};
-
-/** A combination of a network address (CNetAddr) and a (TCP) port */
-class CService : public CNetAddr
-{
- protected:
- unsigned short port; // host order
-
- public:
- CService();
- CService(const CNetAddr& ip, unsigned short port);
- CService(const struct in_addr& ipv4Addr, unsigned short port);
- CService(const struct sockaddr_in& addr);
- explicit CService(const char *pszIpPort, int portDefault, bool fAllowLookup = false);
- explicit CService(const char *pszIpPort, bool fAllowLookup = false);
- explicit CService(const std::string& strIpPort, int portDefault, bool fAllowLookup = false);
- explicit CService(const std::string& strIpPort, bool fAllowLookup = false);
- void Init();
- void SetPort(unsigned short portIn);
- unsigned short GetPort() const;
- bool GetSockAddr(struct sockaddr* paddr, socklen_t *addrlen) const;
- bool SetSockAddr(const struct sockaddr* paddr);
- friend bool operator==(const CService& a, const CService& b);
- friend bool operator!=(const CService& a, const CService& b);
- friend bool operator<(const CService& a, const CService& b);
- std::vector<unsigned char> GetKey() const;
- std::string ToString() const;
- std::string ToStringPort() const;
- std::string ToStringIPPort() const;
-
- CService(const struct in6_addr& ipv6Addr, unsigned short port);
- CService(const struct sockaddr_in6& addr);
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(FLATDATA(ip));
- unsigned short portN = htons(port);
- READWRITE(FLATDATA(portN));
- if (ser_action.ForRead())
- port = ntohs(portN);
- }
-};
-
class proxyType
{
public:
proxyType(): randomize_credentials(false) {}
- proxyType(const CService &proxy, bool randomize_credentials=false): proxy(proxy), randomize_credentials(randomize_credentials) {}
+ proxyType(const CService &_proxy, bool _randomize_credentials=false): proxy(_proxy), randomize_credentials(_randomize_credentials) {}
bool IsValid() const { return proxy.IsValid(); }
@@ -205,10 +45,12 @@ bool GetProxy(enum Network net, proxyType &proxyInfoOut);
bool IsProxy(const CNetAddr &addr);
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);
-bool Lookup(const char *pszName, std::vector<CService>& vAddr, int portDefault = 0, bool fAllowLookup = true, unsigned int nMaxSolutions = 0);
-bool LookupNumeric(const char *pszName, CService& addr, int portDefault = 0);
+bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions, bool fAllowLookup);
+bool LookupHost(const char *pszName, CNetAddr& addr, bool fAllowLookup);
+bool Lookup(const char *pszName, CService& addr, int portDefault, bool fAllowLookup);
+bool Lookup(const char *pszName, std::vector<CService>& vAddr, int portDefault, bool fAllowLookup, unsigned int nMaxSolutions);
+CService LookupNumeric(const char *pszName, int portDefault = 0);
+bool LookupSubNet(const char *pszName, CSubNet& subnet);
bool ConnectSocket(const CService &addr, SOCKET& hSocketRet, int nTimeout, bool *outProxyConnectionFailed = 0);
bool ConnectSocketByName(CService &addr, SOCKET& hSocketRet, const char *pszDest, int portDefault, int nTimeout, bool *outProxyConnectionFailed = 0);
/** Return readable error string for a network error code */
diff --git a/src/noui.cpp b/src/noui.cpp
index 3a77361919..0d9207c11a 100644
--- a/src/noui.cpp
+++ b/src/noui.cpp
@@ -39,6 +39,11 @@ static bool noui_ThreadSafeMessageBox(const std::string& message, const std::str
return false;
}
+static bool noui_ThreadSafeQuestion(const std::string& /* ignored interactive message */, const std::string& message, const std::string& caption, unsigned int style)
+{
+ return noui_ThreadSafeMessageBox(message, caption, style);
+}
+
static void noui_InitMessage(const std::string& message)
{
LogPrintf("init message: %s\n", message);
@@ -48,5 +53,6 @@ void noui_connect()
{
// Connect bitcoind signal handlers
uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);
+ uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion);
uiInterface.InitMessage.connect(noui_InitMessage);
}
diff --git a/src/noui.h b/src/noui.h
index 15cd30a639..ff16cc9aa8 100644
--- a/src/noui.h
+++ b/src/noui.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2013 The Bitcoin Core developers
+// Copyright (c) 2013-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.
diff --git a/src/policy/fees.cpp b/src/policy/fees.cpp
index 980ecf10df..7b0e8b7d08 100644
--- a/src/policy/fees.cpp
+++ b/src/policy/fees.cpp
@@ -8,6 +8,7 @@
#include "amount.h"
#include "primitives/transaction.h"
+#include "random.h"
#include "streams.h"
#include "txmempool.h"
#include "util.h"
@@ -87,7 +88,7 @@ double TxConfirmStats::EstimateMedianVal(int confTarget, double sufficientTxVal,
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
+ // values pass, so we start at maxbucketindex (highest fee) and look at successively
// 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;
@@ -580,3 +581,21 @@ void CBlockPolicyEstimator::Read(CAutoFile& filein)
priStats.Read(filein);
nBestSeenHeight = nFileBestSeenHeight;
}
+
+FeeFilterRounder::FeeFilterRounder(const CFeeRate& minIncrementalFee)
+{
+ CAmount minFeeLimit = minIncrementalFee.GetFeePerK() / 2;
+ feeset.insert(0);
+ for (double bucketBoundary = minFeeLimit; bucketBoundary <= MAX_FEERATE; bucketBoundary *= FEE_SPACING) {
+ feeset.insert(bucketBoundary);
+ }
+}
+
+CAmount FeeFilterRounder::round(CAmount currentMinFee)
+{
+ std::set<double>::iterator it = feeset.lower_bound(currentMinFee);
+ if ((it != feeset.begin() && insecure_rand() % 3 != 0) || it == feeset.end()) {
+ it--;
+ }
+ return *it;
+}
diff --git a/src/policy/fees.h b/src/policy/fees.h
index 7a293267d4..463f62f710 100644
--- a/src/policy/fees.h
+++ b/src/policy/fees.h
@@ -29,7 +29,7 @@ class CTxMemPool;
* 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
+ * at the bucket 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
@@ -87,13 +87,13 @@ private:
// 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
+ // and calculate 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
+ // and calculate 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
@@ -265,8 +265,8 @@ public:
void Read(CAutoFile& filein);
private:
- CFeeRate minTrackedFee; //! Passed to constructor to avoid dependency on main
- double minTrackedPriority; //! Set to AllowFreeThreshold
+ CFeeRate minTrackedFee; //!< Passed to constructor to avoid dependency on main
+ double minTrackedPriority; //!< Set to AllowFreeThreshold
unsigned int nBestSeenHeight;
struct TxStatsInfo
{
@@ -286,4 +286,17 @@ private:
CFeeRate feeLikely, feeUnlikely;
double priLikely, priUnlikely;
};
+
+class FeeFilterRounder
+{
+public:
+ /** Create new FeeFilterRounder */
+ FeeFilterRounder(const CFeeRate& minIncrementalFee);
+
+ /** Quantize a minimum fee for privacy purpose before broadcast **/
+ CAmount round(CAmount currentMinFee);
+
+private:
+ std::set<double> feeset;
+};
#endif /*BITCOIN_POLICYESTIMATOR_H */
diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp
index 46c7f18942..ae42b2bd74 100644
--- a/src/policy/policy.cpp
+++ b/src/policy/policy.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin developers
+// Copyright (c) 2009-2016 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -23,9 +23,6 @@
* 2. P2SH scripts with a crazy number of expensive
* CHECKSIG/CHECKMULTISIG operations
*
- * Check transaction inputs, and make sure any
- * pay-to-script-hash transactions are evaluating IsStandard scripts
- *
* Why bother? To avoid denial-of-service attacks; an attacker
* can submit a standard HASH... OP_EQUAL transaction,
* which will get accepted into blocks. The redemption
@@ -34,7 +31,7 @@
* DUP CHECKSIG DROP ... repeated 100 times... OP_1
*/
-bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType)
+bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType, const bool witnessEnabled)
{
std::vector<std::vector<unsigned char> > vSolutions;
if (!Solver(scriptPubKey, whichType, vSolutions))
@@ -53,12 +50,15 @@ bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType)
(!fAcceptDatacarrier || scriptPubKey.size() > nMaxDatacarrierBytes))
return false;
+ else if (!witnessEnabled && (whichType == TX_WITNESS_V0_KEYHASH || whichType == TX_WITNESS_V0_SCRIPTHASH))
+ return false;
+
return whichType != TX_NONSTANDARD;
}
-bool IsStandardTx(const CTransaction& tx, std::string& reason)
+bool IsStandardTx(const CTransaction& tx, std::string& reason, const bool witnessEnabled)
{
- if (tx.nVersion > CTransaction::CURRENT_VERSION || tx.nVersion < 1) {
+ if (tx.nVersion > CTransaction::MAX_STANDARD_VERSION || tx.nVersion < 1) {
reason = "version";
return false;
}
@@ -67,8 +67,8 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason)
// almost as much to process as they cost the sender in fees, because
// computing signature hashes is O(ninputs*txsize). Limiting transactions
// to MAX_STANDARD_TX_SIZE mitigates CPU exhaustion attacks.
- unsigned int sz = tx.GetSerializeSize(SER_NETWORK, CTransaction::CURRENT_VERSION);
- if (sz >= MAX_STANDARD_TX_SIZE) {
+ unsigned int sz = GetTransactionWeight(tx);
+ if (sz >= MAX_STANDARD_TX_WEIGHT) {
reason = "tx-size";
return false;
}
@@ -76,12 +76,12 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason)
BOOST_FOREACH(const CTxIn& txin, tx.vin)
{
// Biggest 'standard' txin is a 15-of-15 P2SH multisig with compressed
- // keys. (remember the 520 byte limit on redeemScript size) That works
+ // keys (remember the 520 byte limit on redeemScript size). That works
// out to a (15*(33+1))+3=513 byte redeemScript, 513+1+15*(73+1)+3=1627
// bytes of scriptSig, which we round off to 1650 bytes for some minor
// future-proofing. That's also enough to spend a 20-of-20
// CHECKMULTISIG scriptPubKey, though such a scriptPubKey is not
- // considered standard)
+ // considered standard.
if (txin.scriptSig.size() > 1650) {
reason = "scriptsig-size";
return false;
@@ -95,7 +95,7 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason)
unsigned int nDataOut = 0;
txnouttype whichType;
BOOST_FOREACH(const CTxOut& txout, tx.vout) {
- if (!::IsStandard(txout.scriptPubKey, whichType)) {
+ if (!::IsStandard(txout.scriptPubKey, whichType, witnessEnabled)) {
reason = "scriptpubkey";
return false;
}
@@ -135,46 +135,85 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
const CScript& prevScript = prev.scriptPubKey;
if (!Solver(prevScript, whichType, vSolutions))
return false;
- int nArgsExpected = ScriptSigArgsExpected(whichType, vSolutions);
- if (nArgsExpected < 0)
- return false;
-
- // Transactions with extra stuff in their scriptSigs are
- // non-standard. Note that this EvalScript() call will
- // be quick, because if there are any operations
- // beside "push data" in the scriptSig
- // IsStandardTx() will have already returned false
- // and this method isn't called.
- std::vector<std::vector<unsigned char> > stack;
- if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker()))
- return false;
if (whichType == TX_SCRIPTHASH)
{
+ std::vector<std::vector<unsigned char> > stack;
+ // convert the scriptSig into a stack, so we can inspect the redeemScript
+ if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), SIGVERSION_BASE))
+ return false;
if (stack.empty())
return false;
CScript subscript(stack.back().begin(), stack.back().end());
- std::vector<std::vector<unsigned char> > vSolutions2;
- txnouttype whichType2;
- if (Solver(subscript, whichType2, vSolutions2))
- {
- int tmpExpected = ScriptSigArgsExpected(whichType2, vSolutions2);
- if (tmpExpected < 0)
- return false;
- nArgsExpected += tmpExpected;
- }
- else
- {
- // Any other Script with less than 15 sigops OK:
- unsigned int sigops = subscript.GetSigOpCount(true);
- // ... extra data left on the stack after execution is OK, too:
- return (sigops <= MAX_P2SH_SIGOPS);
+ if (subscript.GetSigOpCount(true) > MAX_P2SH_SIGOPS) {
+ return false;
}
}
+ }
+
+ return true;
+}
+
+bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
+{
+ if (tx.IsCoinBase())
+ return true; // Coinbases are skipped
+
+ for (unsigned int i = 0; i < tx.vin.size(); i++)
+ {
+ // We don't care if witness for this input is empty, since it must not be bloated.
+ // If the script is invalid without witness, it would be caught sooner or later during validation.
+ if (tx.wit.vtxinwit[i].IsNull())
+ continue;
+
+ const CTxOut &prev = mapInputs.GetOutputFor(tx.vin[i]);
+
+ // get the scriptPubKey corresponding to this input:
+ CScript prevScript = prev.scriptPubKey;
+
+ if (prevScript.IsPayToScriptHash()) {
+ std::vector <std::vector<unsigned char> > stack;
+ // If the scriptPubKey is P2SH, we try to extract the redeemScript casually by converting the scriptSig
+ // into a stack. We do not check IsPushOnly nor compare the hash as these will be done later anyway.
+ // If the check fails at this stage, we know that this txid must be a bad one.
+ if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), SIGVERSION_BASE))
+ return false;
+ if (stack.empty())
+ return false;
+ prevScript = CScript(stack.back().begin(), stack.back().end());
+ }
- if (stack.size() != (unsigned int)nArgsExpected)
+ int witnessversion = 0;
+ std::vector<unsigned char> witnessprogram;
+
+ // Non-witness program must not be associated with any witness
+ if (!prevScript.IsWitnessProgram(witnessversion, witnessprogram))
return false;
- }
+ // Check P2WSH standard limits
+ if (witnessversion == 0 && witnessprogram.size() == 32) {
+ if (tx.wit.vtxinwit[i].scriptWitness.stack.back().size() > MAX_STANDARD_P2WSH_SCRIPT_SIZE)
+ return false;
+ size_t sizeWitnessStack = tx.wit.vtxinwit[i].scriptWitness.stack.size() - 1;
+ if (sizeWitnessStack > MAX_STANDARD_P2WSH_STACK_ITEMS)
+ return false;
+ for (unsigned int j = 0; j < sizeWitnessStack; j++) {
+ if (tx.wit.vtxinwit[i].scriptWitness.stack[j].size() > MAX_STANDARD_P2WSH_STACK_ITEM_SIZE)
+ return false;
+ }
+ }
+ }
return true;
}
+
+unsigned int nBytesPerSigOp = DEFAULT_BYTES_PER_SIGOP;
+
+int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost)
+{
+ return (std::max(nWeight, nSigOpCost * nBytesPerSigOp) + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
+}
+
+int64_t GetVirtualTransactionSize(const CTransaction& tx, int64_t nSigOpCost)
+{
+ return GetVirtualTransactionSize(GetTransactionWeight(tx), nSigOpCost);
+}
diff --git a/src/policy/policy.h b/src/policy/policy.h
index 31655f2f3a..814e6c0b6f 100644
--- a/src/policy/policy.h
+++ b/src/policy/policy.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin developers
+// Copyright (c) 2009-2016 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -14,19 +14,28 @@
class CCoinsViewCache;
-/** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
+/** Default for -blockmaxsize, which controls the maximum size of block the mining code will create **/
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 = 0;
-/** The maximum size for transactions we're willing to relay/mine */
-static const unsigned int MAX_STANDARD_TX_SIZE = 100000;
+/** Default for -blockmaxweight, which controls the range of block weights the mining code will create **/
+static const unsigned int DEFAULT_BLOCK_MAX_WEIGHT = 3000000;
+/** The maximum weight for transactions we're willing to relay/mine */
+static const unsigned int MAX_STANDARD_TX_WEIGHT = 400000;
/** 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 */
-static const unsigned int MAX_STANDARD_TX_SIGOPS = MAX_BLOCK_SIGOPS/5;
+static const unsigned int MAX_STANDARD_TX_SIGOPS_COST = MAX_BLOCK_SIGOPS_COST/5;
/** Default for -maxmempool, maximum megabytes of mempool memory usage */
static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE = 300;
+/** Default for -bytespersigop */
+static const unsigned int DEFAULT_BYTES_PER_SIGOP = 20;
+/** The maximum number of witness stack items in a standard P2WSH script */
+static const unsigned int MAX_STANDARD_P2WSH_STACK_ITEMS = 100;
+/** The maximum size of each witness stack item in a standard P2WSH script */
+static const unsigned int MAX_STANDARD_P2WSH_STACK_ITEM_SIZE = 80;
+/** The maximum size of a standard witnessScript */
+static const unsigned int MAX_STANDARD_P2WSH_SCRIPT_SIZE = 3600;
/**
* Standard script verification flags that standard transactions will comply
* with. However scripts violating these flags may still be present in valid
@@ -39,26 +48,45 @@ static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY
SCRIPT_VERIFY_NULLDUMMY |
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS |
SCRIPT_VERIFY_CLEANSTACK |
+ SCRIPT_VERIFY_MINIMALIF |
+ SCRIPT_VERIFY_NULLFAIL |
SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY |
- SCRIPT_VERIFY_LOW_S;
+ SCRIPT_VERIFY_CHECKSEQUENCEVERIFY |
+ SCRIPT_VERIFY_LOW_S |
+ SCRIPT_VERIFY_WITNESS |
+ SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM |
+ SCRIPT_VERIFY_WITNESS_PUBKEYTYPE;
/** 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;
-/** Used as the flags parameter to CheckFinalTx() in non-consensus code */
-static const unsigned int STANDARD_LOCKTIME_VERIFY_FLAGS = LOCKTIME_MEDIAN_TIME_PAST;
+/** Used as the flags parameter to sequence and nLocktime checks in non-consensus code. */
+static const unsigned int STANDARD_LOCKTIME_VERIFY_FLAGS = LOCKTIME_VERIFY_SEQUENCE |
+ LOCKTIME_MEDIAN_TIME_PAST;
-bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType);
+bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType, const bool witnessEnabled = false);
/**
* Check for standard transaction types
* @return True if all outputs (scriptPubKeys) use only standard transaction forms
*/
-bool IsStandardTx(const CTransaction& tx, std::string& reason);
+bool IsStandardTx(const CTransaction& tx, std::string& reason, const bool witnessEnabled = false);
/**
* Check for standard transaction types
* @param[in] mapInputs Map of previous transactions that have outputs we're spending
* @return True if all inputs (scriptSigs) use only standard transaction forms
*/
bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
+ /**
+ * Check if the transaction is over standard P2WSH resources limit:
+ * 3600bytes witnessScript size, 80bytes per witness stack element, 100 witness stack elements
+ * These limits are adequate for multi-signature up to n-of-100 using OP_CHECKSIG, OP_ADD, and OP_EQUAL,
+ */
+bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
+
+extern unsigned int nBytesPerSigOp;
+
+/** Compute the virtual transaction size (weight reinterpreted as bytes). */
+int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost);
+int64_t GetVirtualTransactionSize(const CTransaction& tx, int64_t nSigOpCost = 0);
#endif // BITCOIN_POLICY_POLICY_H
diff --git a/src/policy/rbf.cpp b/src/policy/rbf.cpp
new file mode 100644
index 0000000000..133cff611d
--- /dev/null
+++ b/src/policy/rbf.cpp
@@ -0,0 +1,47 @@
+// Copyright (c) 2016 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/rbf.h"
+
+bool SignalsOptInRBF(const CTransaction &tx)
+{
+ BOOST_FOREACH(const CTxIn &txin, tx.vin) {
+ if (txin.nSequence < std::numeric_limits<unsigned int>::max()-1) {
+ return true;
+ }
+ }
+ return false;
+}
+
+RBFTransactionState IsRBFOptIn(const CTransaction &tx, CTxMemPool &pool)
+{
+ AssertLockHeld(pool.cs);
+
+ CTxMemPool::setEntries setAncestors;
+
+ // First check the transaction itself.
+ if (SignalsOptInRBF(tx)) {
+ return RBF_TRANSACTIONSTATE_REPLACEABLE_BIP125;
+ }
+
+ // If this transaction is not in our mempool, then we can't be sure
+ // we will know about all its inputs.
+ if (!pool.exists(tx.GetHash())) {
+ return RBF_TRANSACTIONSTATE_UNKNOWN;
+ }
+
+ // If all the inputs have nSequence >= maxint-1, it still might be
+ // signaled for RBF if any unconfirmed parents have signaled.
+ uint64_t noLimit = std::numeric_limits<uint64_t>::max();
+ std::string dummy;
+ CTxMemPoolEntry entry = *pool.mapTx.find(tx.GetHash());
+ pool.CalculateMemPoolAncestors(entry, setAncestors, noLimit, noLimit, noLimit, noLimit, dummy, false);
+
+ BOOST_FOREACH(CTxMemPool::txiter it, setAncestors) {
+ if (SignalsOptInRBF(it->GetTx())) {
+ return RBF_TRANSACTIONSTATE_REPLACEABLE_BIP125;
+ }
+ }
+ return RBF_TRANSACTIONSTATE_FINAL;
+}
diff --git a/src/policy/rbf.h b/src/policy/rbf.h
new file mode 100644
index 0000000000..5a711dba07
--- /dev/null
+++ b/src/policy/rbf.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2016 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_POLICY_RBF_H
+#define BITCOIN_POLICY_RBF_H
+
+#include "txmempool.h"
+
+enum RBFTransactionState {
+ RBF_TRANSACTIONSTATE_UNKNOWN,
+ RBF_TRANSACTIONSTATE_REPLACEABLE_BIP125,
+ RBF_TRANSACTIONSTATE_FINAL
+};
+
+// Check whether the sequence numbers on this transaction are signaling
+// opt-in to replace-by-fee, according to BIP 125
+bool SignalsOptInRBF(const CTransaction &tx);
+
+// Determine whether an in-mempool transaction is signaling opt-in to RBF
+// according to BIP 125
+// This involves checking sequence numbers of the transaction, as well
+// as the sequence numbers of all in-mempool ancestors.
+RBFTransactionState IsRBFOptIn(const CTransaction &tx, CTxMemPool &pool);
+
+#endif // BITCOIN_POLICY_RBF_H
diff --git a/src/pow.cpp b/src/pow.cpp
index 5ace3fbc9b..1db3b69293 100644
--- a/src/pow.cpp
+++ b/src/pow.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -9,7 +9,6 @@
#include "chain.h"
#include "primitives/block.h"
#include "uint256.h"
-#include "util.h"
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
{
@@ -57,7 +56,6 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
// Limit adjustment step
int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
- LogPrintf(" nActualTimespan = %d before bounds\n", nActualTimespan);
if (nActualTimespan < params.nPowTargetTimespan/4)
nActualTimespan = params.nPowTargetTimespan/4;
if (nActualTimespan > params.nPowTargetTimespan*4)
@@ -66,21 +64,13 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
// Retarget
const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
arith_uint256 bnNew;
- arith_uint256 bnOld;
bnNew.SetCompact(pindexLast->nBits);
- bnOld = bnNew;
bnNew *= nActualTimespan;
bnNew /= params.nPowTargetTimespan;
if (bnNew > bnPowLimit)
bnNew = bnPowLimit;
- /// debug print
- LogPrintf("GetNextWorkRequired RETARGET\n");
- LogPrintf("params.nPowTargetTimespan = %d nActualTimespan = %d\n", params.nPowTargetTimespan, nActualTimespan);
- LogPrintf("Before: %08x %s\n", pindexLast->nBits, bnOld.ToString());
- LogPrintf("After: %08x %s\n", bnNew.GetCompact(), bnNew.ToString());
-
return bnNew.GetCompact();
}
@@ -94,43 +84,11 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&
// Check range
if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
- return error("CheckProofOfWork(): nBits below minimum work");
+ return false;
// Check proof of work matches claimed amount
if (UintToArith256(hash) > bnTarget)
- return error("CheckProofOfWork(): hash doesn't match nBits");
+ return false;
return true;
}
-
-arith_uint256 GetBlockProof(const CBlockIndex& block)
-{
- arith_uint256 bnTarget;
- bool fNegative;
- bool fOverflow;
- bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow);
- if (fNegative || fOverflow || bnTarget == 0)
- return 0;
- // We need to compute 2**256 / (bnTarget+1), but we can't represent 2**256
- // as it's too large for a arith_uint256. However, as 2**256 is at least as large
- // as bnTarget+1, it is equal to ((2**256 - bnTarget - 1) / (bnTarget+1)) + 1,
- // 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 e864a474cc..23e9c1c351 100644
--- a/src/pow.h
+++ b/src/pow.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -13,16 +13,11 @@
class CBlockHeader;
class CBlockIndex;
class uint256;
-class arith_uint256;
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params&);
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params&);
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */
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/prevector.h b/src/prevector.h
index 8992e305b3..25bce522dc 100644
--- a/src/prevector.h
+++ b/src/prevector.h
@@ -1,3 +1,7 @@
+// 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_PREVECTOR_H_
#define _BITCOIN_PREVECTOR_H_
@@ -294,9 +298,8 @@ public:
}
void resize(size_type new_size) {
- while (size() > new_size) {
- item_ptr(size() - 1)->~T();
- _size--;
+ if (size() > new_size) {
+ erase(item_ptr(new_size), end());
}
if (new_size > capacity()) {
change_capacity(new_size);
@@ -364,10 +367,7 @@ public:
}
iterator erase(iterator pos) {
- (*pos).~T();
- memmove(&(*pos), &(*pos) + 1, ((char*)&(*end())) - ((char*)(1 + &(*pos))));
- _size--;
- return pos;
+ return erase(pos, pos + 1);
}
iterator erase(iterator first, iterator last) {
@@ -392,7 +392,7 @@ public:
}
void pop_back() {
- _size--;
+ erase(end() - 1, end());
}
T& front() {
@@ -412,12 +412,7 @@ public:
}
void swap(prevector<N, T, Size, Diff>& other) {
- if (_size & other._size & 1) {
- std::swap(_union.capacity, other._union.capacity);
- std::swap(_union.indirect, other._union.indirect);
- } else {
- std::swap(_union, other._union);
- }
+ std::swap(_union, other._union);
std::swap(_size, other._size);
}
@@ -480,6 +475,14 @@ public:
return ((size_t)(sizeof(T))) * _union.capacity;
}
}
+
+ value_type* data() {
+ return item_ptr(0);
+ }
+
+ const value_type* data() const {
+ return item_ptr(0);
+ }
};
#pragma pack(pop)
diff --git a/src/primitives/block.cpp b/src/primitives/block.cpp
index 7280c18f77..0e6ab4dd71 100644
--- a/src/primitives/block.cpp
+++ b/src/primitives/block.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -18,7 +18,7 @@ uint256 CBlockHeader::GetHash() const
std::string CBlock::ToString() const
{
std::stringstream s;
- s << strprintf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%u)\n",
+ s << strprintf("CBlock(hash=%s, ver=0x%08x, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%u)\n",
GetHash().ToString(),
nVersion,
hashPrevBlock.ToString(),
@@ -31,3 +31,12 @@ std::string CBlock::ToString() const
}
return s.str();
}
+
+int64_t GetBlockWeight(const CBlock& block)
+{
+ // This implements the weight = (stripped_size * 4) + witness_size formula,
+ // using only serialization with and without witness data. As witness_size
+ // is equal to total_size - stripped_size, this formula is identical to:
+ // weight = (stripped_size * 3) + total_size.
+ return ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR - 1) + ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION);
+}
diff --git a/src/primitives/block.h b/src/primitives/block.h
index 5c017d436f..72dfed985a 100644
--- a/src/primitives/block.h
+++ b/src/primitives/block.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
@@ -21,7 +21,6 @@ class CBlockHeader
{
public:
// header
- static const int32_t CURRENT_VERSION=4;
int32_t nVersion;
uint256 hashPrevBlock;
uint256 hashMerkleRoot;
@@ -39,7 +38,6 @@ public:
template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
READWRITE(this->nVersion);
- nVersion = this->nVersion;
READWRITE(hashPrevBlock);
READWRITE(hashMerkleRoot);
READWRITE(nTime);
@@ -49,7 +47,7 @@ public:
void SetNull()
{
- nVersion = CBlockHeader::CURRENT_VERSION;
+ nVersion = 0;
hashPrevBlock.SetNull();
hashMerkleRoot.SetNull();
nTime = 0;
@@ -121,7 +119,6 @@ public:
std::string ToString() const;
};
-
/** Describes a place in the block chain to another node such that if the
* other node doesn't have the same branch, it can find a recent common trunk.
* The further back it is, the further before the fork it may be.
@@ -157,4 +154,7 @@ struct CBlockLocator
}
};
+/** Compute the consensus-critical block weight (see BIP 141). */
+int64_t GetBlockWeight(const CBlock& tx);
+
#endif // BITCOIN_PRIMITIVES_BLOCK_H
diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp
index 46d3cbbe2e..4afbe99fd3 100644
--- a/src/primitives/transaction.cpp
+++ b/src/primitives/transaction.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -37,7 +37,7 @@ std::string CTxIn::ToString() const
str += strprintf(", coinbase %s", HexStr(scriptSig));
else
str += strprintf(", scriptSig=%s", HexStr(scriptSig).substr(0, 24));
- if (nSequence != std::numeric_limits<unsigned int>::max())
+ if (nSequence != SEQUENCE_FINAL)
str += strprintf(", nSequence=%u", nSequence);
str += ")";
return str;
@@ -60,21 +60,26 @@ std::string CTxOut::ToString() const
}
CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nLockTime(0) {}
-CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) {}
+CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), wit(tx.wit), nLockTime(tx.nLockTime) {}
uint256 CMutableTransaction::GetHash() const
{
- return SerializeHash(*this);
+ return SerializeHash(*this, SER_GETHASH, SERIALIZE_TRANSACTION_NO_WITNESS);
}
void CTransaction::UpdateHash() const
{
- *const_cast<uint256*>(&hash) = SerializeHash(*this);
+ *const_cast<uint256*>(&hash) = SerializeHash(*this, SER_GETHASH, SERIALIZE_TRANSACTION_NO_WITNESS);
+}
+
+uint256 CTransaction::GetWitnessHash() const
+{
+ return SerializeHash(*this, SER_GETHASH, 0);
}
CTransaction::CTransaction() : nVersion(CTransaction::CURRENT_VERSION), vin(), vout(), nLockTime(0) { }
-CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) {
+CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), wit(tx.wit), nLockTime(tx.nLockTime) {
UpdateHash();
}
@@ -82,6 +87,7 @@ CTransaction& CTransaction::operator=(const CTransaction &tx) {
*const_cast<int*>(&nVersion) = tx.nVersion;
*const_cast<std::vector<CTxIn>*>(&vin) = tx.vin;
*const_cast<std::vector<CTxOut>*>(&vout) = tx.vout;
+ *const_cast<CTxWitness*>(&wit) = tx.wit;
*const_cast<unsigned int*>(&nLockTime) = tx.nLockTime;
*const_cast<uint256*>(&hash) = tx.hash;
return *this;
@@ -94,7 +100,7 @@ CAmount CTransaction::GetValueOut() const
{
nValueOut += it->nValue;
if (!MoneyRange(it->nValue) || !MoneyRange(nValueOut))
- throw std::runtime_error("CTransaction::GetValueOut(): value out of range");
+ throw std::runtime_error(std::string(__func__) + ": value out of range");
}
return nValueOut;
}
@@ -115,7 +121,7 @@ unsigned int CTransaction::CalculateModifiedSize(unsigned int nTxSize) const
// Providing any more cleanup incentive than making additional inputs free would
// risk encouraging people to create junk outputs to redeem later.
if (nTxSize == 0)
- nTxSize = ::GetSerializeSize(*this, SER_NETWORK, PROTOCOL_VERSION);
+ nTxSize = (GetTransactionWeight(*this) + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
for (std::vector<CTxIn>::const_iterator it(vin.begin()); it != vin.end(); ++it)
{
unsigned int offset = 41U + std::min(110U, (unsigned int)it->scriptSig.size());
@@ -125,6 +131,11 @@ unsigned int CTransaction::CalculateModifiedSize(unsigned int nTxSize) const
return nTxSize;
}
+unsigned int CTransaction::GetTotalSize() const
+{
+ return ::GetSerializeSize(*this, SER_NETWORK, PROTOCOL_VERSION);
+}
+
std::string CTransaction::ToString() const
{
std::string str;
@@ -136,7 +147,14 @@ std::string CTransaction::ToString() const
nLockTime);
for (unsigned int i = 0; i < vin.size(); i++)
str += " " + vin[i].ToString() + "\n";
+ for (unsigned int i = 0; i < wit.vtxinwit.size(); i++)
+ str += " " + wit.vtxinwit[i].scriptWitness.ToString() + "\n";
for (unsigned int i = 0; i < vout.size(); i++)
str += " " + vout[i].ToString() + "\n";
return str;
}
+
+int64_t GetTransactionWeight(const CTransaction& tx)
+{
+ return ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR -1) + ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
+}
diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h
index c5d8a64a6d..16c2e5c454 100644
--- a/src/primitives/transaction.h
+++ b/src/primitives/transaction.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -11,6 +11,10 @@
#include "serialize.h"
#include "uint256.h"
+static const int SERIALIZE_TRANSACTION_NO_WITNESS = 0x40000000;
+
+static const int WITNESS_SCALE_FACTOR = 4;
+
/** An outpoint - a combination of a transaction hash and an index n into its vout */
class COutPoint
{
@@ -34,7 +38,8 @@ public:
friend bool operator<(const COutPoint& a, const COutPoint& b)
{
- return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
+ int cmp = a.hash.Compare(b.hash);
+ return cmp < 0 || (cmp == 0 && a.n < b.n);
}
friend bool operator==(const COutPoint& a, const COutPoint& b)
@@ -61,13 +66,40 @@ public:
CScript scriptSig;
uint32_t nSequence;
+ /* Setting nSequence to this value for every input in a transaction
+ * disables nLockTime. */
+ static const uint32_t SEQUENCE_FINAL = 0xffffffff;
+
+ /* Below flags apply in the context of BIP 68*/
+ /* If this flag set, CTxIn::nSequence is NOT interpreted as a
+ * relative lock-time. */
+ static const uint32_t SEQUENCE_LOCKTIME_DISABLE_FLAG = (1 << 31);
+
+ /* If CTxIn::nSequence encodes a relative lock-time and this flag
+ * is set, the relative lock-time has units of 512 seconds,
+ * otherwise it specifies blocks with a granularity of 1. */
+ static const uint32_t SEQUENCE_LOCKTIME_TYPE_FLAG = (1 << 22);
+
+ /* If CTxIn::nSequence encodes a relative lock-time, this mask is
+ * applied to extract that lock-time from the sequence field. */
+ static const uint32_t SEQUENCE_LOCKTIME_MASK = 0x0000ffff;
+
+ /* In order to use the same number of bits to encode roughly the
+ * same wall-clock duration, and because blocks are naturally
+ * limited to occur every 600s on average, the minimum granularity
+ * for time-based relative lock-time is fixed at 512 seconds.
+ * Converting from CTxIn::nSequence to seconds is performed by
+ * multiplying by 512 = 2^9, or equivalently shifting up by
+ * 9 bits. */
+ static const int SEQUENCE_LOCKTIME_GRANULARITY = 9;
+
CTxIn()
{
- nSequence = std::numeric_limits<unsigned int>::max();
+ nSequence = SEQUENCE_FINAL;
}
- explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=std::numeric_limits<unsigned int>::max());
- CTxIn(uint256 hashPrevTx, uint32_t nOut, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=std::numeric_limits<uint32_t>::max());
+ explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=SEQUENCE_FINAL);
+ CTxIn(uint256 hashPrevTx, uint32_t nOut, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=SEQUENCE_FINAL);
ADD_SERIALIZE_METHODS;
@@ -78,11 +110,6 @@ public:
READWRITE(nSequence);
}
- bool IsFinal() const
- {
- return (nSequence == std::numeric_limits<uint32_t>::max());
- }
-
friend bool operator==(const CTxIn& a, const CTxIn& b)
{
return (a.prevout == b.prevout &&
@@ -141,15 +168,30 @@ public:
// which has units satoshis-per-kilobyte.
// If you'd pay more than 1/3 in fees
// to spend something, then we consider it dust.
- // A typical spendable txout is 34 bytes big, and will
+ // A typical spendable non-segwit txout is 34 bytes big, and will
// need a CTxIn of at least 148 bytes to spend:
// so dust is a spendable txout less than
- // 546*minRelayTxFee/1000 (in satoshis)
+ // 546*minRelayTxFee/1000 (in satoshis).
+ // A typical spendable segwit txout is 31 bytes big, and will
+ // need a CTxIn of at least 67 bytes to spend:
+ // so dust is a spendable txout less than
+ // 294*minRelayTxFee/1000 (in satoshis).
if (scriptPubKey.IsUnspendable())
return 0;
- size_t nSize = GetSerializeSize(SER_DISK,0)+148u;
- return 3*minRelayTxFee.GetFee(nSize);
+ size_t nSize = GetSerializeSize(SER_DISK, 0);
+ int witnessversion = 0;
+ std::vector<unsigned char> witnessprogram;
+
+ if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) {
+ // sum the sizes of the parts of a transaction input
+ // with 75% segwit discount applied to the script size.
+ nSize += (32 + 4 + 1 + (107 / WITNESS_SCALE_FACTOR) + 4);
+ } else {
+ nSize += (32 + 4 + 1 + 107 + 4); // the 148 mentioned above
+ }
+
+ return 3 * minRelayTxFee.GetFee(nSize);
}
bool IsDust(const CFeeRate &minRelayTxFee) const
@@ -171,8 +213,139 @@ public:
std::string ToString() const;
};
+class CTxInWitness
+{
+public:
+ CScriptWitness scriptWitness;
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
+ {
+ READWRITE(scriptWitness.stack);
+ }
+
+ bool IsNull() const { return scriptWitness.IsNull(); }
+
+ CTxInWitness() { }
+};
+
+class CTxWitness
+{
+public:
+ /** In case vtxinwit is missing, all entries are treated as if they were empty CTxInWitnesses */
+ std::vector<CTxInWitness> vtxinwit;
+
+ ADD_SERIALIZE_METHODS;
+
+ bool IsEmpty() const { return vtxinwit.empty(); }
+
+ bool IsNull() const
+ {
+ for (size_t n = 0; n < vtxinwit.size(); n++) {
+ if (!vtxinwit[n].IsNull()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ void SetNull()
+ {
+ vtxinwit.clear();
+ }
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
+ {
+ for (size_t n = 0; n < vtxinwit.size(); n++) {
+ READWRITE(vtxinwit[n]);
+ }
+ if (IsNull()) {
+ /* It's illegal to encode a witness when all vtxinwit entries are empty. */
+ throw std::ios_base::failure("Superfluous witness record");
+ }
+ }
+};
+
struct CMutableTransaction;
+/**
+ * Basic transaction serialization format:
+ * - int32_t nVersion
+ * - std::vector<CTxIn> vin
+ * - std::vector<CTxOut> vout
+ * - uint32_t nLockTime
+ *
+ * Extended transaction serialization format:
+ * - int32_t nVersion
+ * - unsigned char dummy = 0x00
+ * - unsigned char flags (!= 0)
+ * - std::vector<CTxIn> vin
+ * - std::vector<CTxOut> vout
+ * - if (flags & 1):
+ * - CTxWitness wit;
+ * - uint32_t nLockTime
+ */
+template<typename Stream, typename Operation, typename TxType>
+inline void SerializeTransaction(TxType& tx, Stream& s, Operation ser_action, int nType, int nVersion) {
+ const bool fAllowWitness = !(nVersion & SERIALIZE_TRANSACTION_NO_WITNESS);
+
+ READWRITE(*const_cast<int32_t*>(&tx.nVersion));
+ unsigned char flags = 0;
+ if (ser_action.ForRead()) {
+ const_cast<std::vector<CTxIn>*>(&tx.vin)->clear();
+ const_cast<std::vector<CTxOut>*>(&tx.vout)->clear();
+ const_cast<CTxWitness*>(&tx.wit)->SetNull();
+ /* Try to read the vin. In case the dummy is there, this will be read as an empty vector. */
+ READWRITE(*const_cast<std::vector<CTxIn>*>(&tx.vin));
+ if (tx.vin.size() == 0 && fAllowWitness) {
+ /* We read a dummy or an empty vin. */
+ READWRITE(flags);
+ if (flags != 0) {
+ READWRITE(*const_cast<std::vector<CTxIn>*>(&tx.vin));
+ READWRITE(*const_cast<std::vector<CTxOut>*>(&tx.vout));
+ }
+ } else {
+ /* We read a non-empty vin. Assume a normal vout follows. */
+ READWRITE(*const_cast<std::vector<CTxOut>*>(&tx.vout));
+ }
+ if ((flags & 1) && fAllowWitness) {
+ /* The witness flag is present, and we support witnesses. */
+ flags ^= 1;
+ const_cast<CTxWitness*>(&tx.wit)->vtxinwit.resize(tx.vin.size());
+ READWRITE(tx.wit);
+ }
+ if (flags) {
+ /* Unknown flag in the serialization */
+ throw std::ios_base::failure("Unknown transaction optional data");
+ }
+ } else {
+ // Consistency check
+ assert(tx.wit.vtxinwit.size() <= tx.vin.size());
+ if (fAllowWitness) {
+ /* Check whether witnesses need to be serialized. */
+ if (!tx.wit.IsNull()) {
+ flags |= 1;
+ }
+ }
+ if (flags) {
+ /* Use extended format in case witnesses are to be serialized. */
+ std::vector<CTxIn> vinDummy;
+ READWRITE(vinDummy);
+ READWRITE(flags);
+ }
+ READWRITE(*const_cast<std::vector<CTxIn>*>(&tx.vin));
+ READWRITE(*const_cast<std::vector<CTxOut>*>(&tx.vout));
+ if (flags & 1) {
+ const_cast<CTxWitness*>(&tx.wit)->vtxinwit.resize(tx.vin.size());
+ READWRITE(tx.wit);
+ }
+ }
+ READWRITE(*const_cast<uint32_t*>(&tx.nLockTime));
+}
+
/** The basic transaction that is broadcasted on the network and contained in
* blocks. A transaction can contain multiple inputs and outputs.
*/
@@ -181,11 +354,17 @@ class CTransaction
private:
/** Memory only. */
const uint256 hash;
- void UpdateHash() const;
public:
+ // Default transaction version.
static const int32_t CURRENT_VERSION=1;
+ // Changing the default transaction version requires a two step process: first
+ // adapting relay policy by bumping MAX_STANDARD_VERSION, and then later date
+ // bumping the default CURRENT_VERSION at which point both CURRENT_VERSION and
+ // MAX_STANDARD_VERSION will be equal.
+ static const int32_t MAX_STANDARD_VERSION=2;
+
// The local variables are made const to prevent unintended modification
// without updating the cached hash value. However, CTransaction is not
// actually immutable; deserialization and assignment are implemented,
@@ -194,6 +373,7 @@ public:
const int32_t nVersion;
const std::vector<CTxIn> vin;
const std::vector<CTxOut> vout;
+ CTxWitness wit; // Not const: can change without invalidating the txid cache
const uint32_t nLockTime;
/** Construct a CTransaction that qualifies as IsNull() */
@@ -208,13 +388,10 @@ public:
template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(*const_cast<int32_t*>(&this->nVersion));
- nVersion = this->nVersion;
- READWRITE(*const_cast<std::vector<CTxIn>*>(&vin));
- READWRITE(*const_cast<std::vector<CTxOut>*>(&vout));
- READWRITE(*const_cast<uint32_t*>(&nLockTime));
- if (ser_action.ForRead())
+ SerializeTransaction(*this, s, ser_action, nType, nVersion);
+ if (ser_action.ForRead()) {
UpdateHash();
+ }
}
bool IsNull() const {
@@ -225,6 +402,9 @@ public:
return hash;
}
+ // Compute a hash that includes both transaction and witness data
+ uint256 GetWitnessHash() const;
+
// Return sum of txouts.
CAmount GetValueOut() const;
// GetValueIn() is a method on CCoinsViewCache, because
@@ -235,6 +415,13 @@ public:
// Compute modified tx size for priority calculation (optionally given tx size)
unsigned int CalculateModifiedSize(unsigned int nTxSize=0) const;
+
+ /**
+ * Get the total transaction size in bytes, including witness data.
+ * "Total Size" defined in BIP141 and BIP144.
+ * @return Total transaction size in bytes
+ */
+ unsigned int GetTotalSize() const;
bool IsCoinBase() const
{
@@ -252,6 +439,8 @@ public:
}
std::string ToString() const;
+
+ void UpdateHash() const;
};
/** A mutable version of CTransaction. */
@@ -260,6 +449,7 @@ struct CMutableTransaction
int32_t nVersion;
std::vector<CTxIn> vin;
std::vector<CTxOut> vout;
+ CTxWitness wit;
uint32_t nLockTime;
CMutableTransaction();
@@ -269,11 +459,7 @@ struct CMutableTransaction
template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- READWRITE(this->nVersion);
- nVersion = this->nVersion;
- READWRITE(vin);
- READWRITE(vout);
- READWRITE(nLockTime);
+ SerializeTransaction(*this, s, ser_action, nType, nVersion);
}
/** Compute the hash of this CMutableTransaction. This is computed on the
@@ -282,4 +468,7 @@ struct CMutableTransaction
uint256 GetHash() const;
};
+/** Compute the weight of a transaction, as defined by BIP 141 */
+int64_t GetTransactionWeight(const CTransaction &tx);
+
#endif // BITCOIN_PRIMITIVES_TRANSACTION_H
diff --git a/src/protocol.cpp b/src/protocol.cpp
index dd855aa33a..54ad62b1a2 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -12,20 +12,74 @@
# include <arpa/inet.h>
#endif
-static const char* ppszTypeName[] =
-{
- "ERROR",
- "tx",
- "block",
- "filtered block"
+namespace NetMsgType {
+const char *VERSION="version";
+const char *VERACK="verack";
+const char *ADDR="addr";
+const char *INV="inv";
+const char *GETDATA="getdata";
+const char *MERKLEBLOCK="merkleblock";
+const char *GETBLOCKS="getblocks";
+const char *GETHEADERS="getheaders";
+const char *TX="tx";
+const char *HEADERS="headers";
+const char *BLOCK="block";
+const char *GETADDR="getaddr";
+const char *MEMPOOL="mempool";
+const char *PING="ping";
+const char *PONG="pong";
+const char *NOTFOUND="notfound";
+const char *FILTERLOAD="filterload";
+const char *FILTERADD="filteradd";
+const char *FILTERCLEAR="filterclear";
+const char *REJECT="reject";
+const char *SENDHEADERS="sendheaders";
+const char *FEEFILTER="feefilter";
+const char *SENDCMPCT="sendcmpct";
+const char *CMPCTBLOCK="cmpctblock";
+const char *GETBLOCKTXN="getblocktxn";
+const char *BLOCKTXN="blocktxn";
+};
+
+/** All known message types. Keep this in the same order as the list of
+ * messages above and in protocol.h.
+ */
+const static std::string allNetMessageTypes[] = {
+ NetMsgType::VERSION,
+ NetMsgType::VERACK,
+ NetMsgType::ADDR,
+ NetMsgType::INV,
+ NetMsgType::GETDATA,
+ NetMsgType::MERKLEBLOCK,
+ NetMsgType::GETBLOCKS,
+ NetMsgType::GETHEADERS,
+ NetMsgType::TX,
+ NetMsgType::HEADERS,
+ NetMsgType::BLOCK,
+ NetMsgType::GETADDR,
+ NetMsgType::MEMPOOL,
+ NetMsgType::PING,
+ NetMsgType::PONG,
+ NetMsgType::NOTFOUND,
+ NetMsgType::FILTERLOAD,
+ NetMsgType::FILTERADD,
+ NetMsgType::FILTERCLEAR,
+ NetMsgType::REJECT,
+ NetMsgType::SENDHEADERS,
+ NetMsgType::FEEFILTER,
+ NetMsgType::SENDCMPCT,
+ NetMsgType::CMPCTBLOCK,
+ NetMsgType::GETBLOCKTXN,
+ NetMsgType::BLOCKTXN,
};
+const static std::vector<std::string> allNetMessageTypesVec(allNetMessageTypes, allNetMessageTypes+ARRAYLEN(allNetMessageTypes));
CMessageHeader::CMessageHeader(const MessageStartChars& pchMessageStartIn)
{
memcpy(pchMessageStart, pchMessageStartIn, MESSAGE_START_SIZE);
memset(pchCommand, 0, sizeof(pchCommand));
nMessageSize = -1;
- nChecksum = 0;
+ memset(pchChecksum, 0, CHECKSUM_SIZE);
}
CMessageHeader::CMessageHeader(const MessageStartChars& pchMessageStartIn, const char* pszCommand, unsigned int nMessageSizeIn)
@@ -34,7 +88,7 @@ CMessageHeader::CMessageHeader(const MessageStartChars& pchMessageStartIn, const
memset(pchCommand, 0, sizeof(pchCommand));
strncpy(pchCommand, pszCommand, COMMAND_SIZE);
nMessageSize = nMessageSizeIn;
- nChecksum = 0;
+ memset(pchChecksum, 0, CHECKSUM_SIZE);
}
std::string CMessageHeader::GetCommand() const
@@ -79,7 +133,7 @@ CAddress::CAddress() : CService()
Init();
}
-CAddress::CAddress(CService ipIn, uint64_t nServicesIn) : CService(ipIn)
+CAddress::CAddress(CService ipIn, ServiceFlags nServicesIn) : CService(ipIn)
{
Init();
nServices = nServicesIn;
@@ -87,7 +141,7 @@ CAddress::CAddress(CService ipIn, uint64_t nServicesIn) : CService(ipIn)
void CAddress::Init()
{
- nServices = NODE_NETWORK;
+ nServices = NODE_NONE;
nTime = 100000000;
}
@@ -103,40 +157,34 @@ CInv::CInv(int typeIn, const uint256& hashIn)
hash = hashIn;
}
-CInv::CInv(const std::string& strType, const uint256& hashIn)
-{
- unsigned int i;
- for (i = 1; i < ARRAYLEN(ppszTypeName); i++)
- {
- if (strType == ppszTypeName[i])
- {
- type = i;
- break;
- }
- }
- if (i == ARRAYLEN(ppszTypeName))
- throw std::out_of_range(strprintf("CInv::CInv(string, uint256): unknown type '%s'", strType));
- hash = hashIn;
-}
-
bool operator<(const CInv& a, const CInv& b)
{
return (a.type < b.type || (a.type == b.type && a.hash < b.hash));
}
-bool CInv::IsKnownType() const
+std::string CInv::GetCommand() const
{
- return (type >= 1 && type < (int)ARRAYLEN(ppszTypeName));
-}
-
-const char* CInv::GetCommand() const
-{
- if (!IsKnownType())
+ std::string cmd;
+ if (type & MSG_WITNESS_FLAG)
+ cmd.append("witness-");
+ int masked = type & MSG_TYPE_MASK;
+ switch (masked)
+ {
+ case MSG_TX: return cmd.append(NetMsgType::TX);
+ case MSG_BLOCK: return cmd.append(NetMsgType::BLOCK);
+ case MSG_FILTERED_BLOCK: return cmd.append(NetMsgType::MERKLEBLOCK);
+ case MSG_CMPCT_BLOCK: return cmd.append(NetMsgType::CMPCTBLOCK);
+ default:
throw std::out_of_range(strprintf("CInv::GetCommand(): type=%d unknown type", type));
- return ppszTypeName[type];
+ }
}
std::string CInv::ToString() const
{
return strprintf("%s %s", GetCommand(), hash.ToString());
}
+
+const std::vector<std::string> &getAllNetMessageTypes()
+{
+ return allNetMessageTypesVec;
+}
diff --git a/src/protocol.h b/src/protocol.h
index 50aeaf44ba..d19e0d3a5e 100644
--- a/src/protocol.h
+++ b/src/protocol.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
@@ -10,7 +10,7 @@
#ifndef BITCOIN_PROTOCOL_H
#define BITCOIN_PROTOCOL_H
-#include "netbase.h"
+#include "netaddress.h"
#include "serialize.h"
#include "uint256.h"
#include "version.h"
@@ -18,8 +18,6 @@
#include <stdint.h>
#include <string>
-#define MESSAGE_START_SIZE 4
-
/** Message header.
* (4) message start.
* (12) command.
@@ -29,6 +27,16 @@
class CMessageHeader
{
public:
+ enum {
+ MESSAGE_START_SIZE = 4,
+ COMMAND_SIZE = 12,
+ MESSAGE_SIZE_SIZE = 4,
+ CHECKSUM_SIZE = 4,
+
+ MESSAGE_SIZE_OFFSET = MESSAGE_START_SIZE + COMMAND_SIZE,
+ CHECKSUM_OFFSET = MESSAGE_SIZE_OFFSET + MESSAGE_SIZE_SIZE,
+ HEADER_SIZE = MESSAGE_START_SIZE + COMMAND_SIZE + MESSAGE_SIZE_SIZE + CHECKSUM_SIZE
+ };
typedef unsigned char MessageStartChars[MESSAGE_START_SIZE];
CMessageHeader(const MessageStartChars& pchMessageStartIn);
@@ -45,28 +53,202 @@ public:
READWRITE(FLATDATA(pchMessageStart));
READWRITE(FLATDATA(pchCommand));
READWRITE(nMessageSize);
- READWRITE(nChecksum);
+ READWRITE(FLATDATA(pchChecksum));
}
- // TODO: make private (improves encapsulation)
-public:
- enum {
- COMMAND_SIZE = 12,
- MESSAGE_SIZE_SIZE = sizeof(int),
- CHECKSUM_SIZE = sizeof(int),
-
- MESSAGE_SIZE_OFFSET = MESSAGE_START_SIZE + COMMAND_SIZE,
- CHECKSUM_OFFSET = MESSAGE_SIZE_OFFSET + MESSAGE_SIZE_SIZE,
- HEADER_SIZE = MESSAGE_START_SIZE + COMMAND_SIZE + MESSAGE_SIZE_SIZE + CHECKSUM_SIZE
- };
char pchMessageStart[MESSAGE_START_SIZE];
char pchCommand[COMMAND_SIZE];
- unsigned int nMessageSize;
- unsigned int nChecksum;
+ uint32_t nMessageSize;
+ uint8_t pchChecksum[CHECKSUM_SIZE];
+};
+
+/**
+ * Bitcoin protocol message types. When adding new message types, don't forget
+ * to update allNetMessageTypes in protocol.cpp.
+ */
+namespace NetMsgType {
+
+/**
+ * The version message provides information about the transmitting node to the
+ * receiving node at the beginning of a connection.
+ * @see https://bitcoin.org/en/developer-reference#version
+ */
+extern const char *VERSION;
+/**
+ * The verack message acknowledges a previously-received version message,
+ * informing the connecting node that it can begin to send other messages.
+ * @see https://bitcoin.org/en/developer-reference#verack
+ */
+extern const char *VERACK;
+/**
+ * The addr (IP address) message relays connection information for peers on the
+ * network.
+ * @see https://bitcoin.org/en/developer-reference#addr
+ */
+extern const char *ADDR;
+/**
+ * The inv message (inventory message) transmits one or more inventories of
+ * objects known to the transmitting peer.
+ * @see https://bitcoin.org/en/developer-reference#inv
+ */
+extern const char *INV;
+/**
+ * The getdata message requests one or more data objects from another node.
+ * @see https://bitcoin.org/en/developer-reference#getdata
+ */
+extern const char *GETDATA;
+/**
+ * The merkleblock message is a reply to a getdata message which requested a
+ * block using the inventory type MSG_MERKLEBLOCK.
+ * @since protocol version 70001 as described by BIP37.
+ * @see https://bitcoin.org/en/developer-reference#merkleblock
+ */
+extern const char *MERKLEBLOCK;
+/**
+ * The getblocks message requests an inv message that provides block header
+ * hashes starting from a particular point in the block chain.
+ * @see https://bitcoin.org/en/developer-reference#getblocks
+ */
+extern const char *GETBLOCKS;
+/**
+ * The getheaders message requests a headers message that provides block
+ * headers starting from a particular point in the block chain.
+ * @since protocol version 31800.
+ * @see https://bitcoin.org/en/developer-reference#getheaders
+ */
+extern const char *GETHEADERS;
+/**
+ * The tx message transmits a single transaction.
+ * @see https://bitcoin.org/en/developer-reference#tx
+ */
+extern const char *TX;
+/**
+ * The headers message sends one or more block headers to a node which
+ * previously requested certain headers with a getheaders message.
+ * @since protocol version 31800.
+ * @see https://bitcoin.org/en/developer-reference#headers
+ */
+extern const char *HEADERS;
+/**
+ * The block message transmits a single serialized block.
+ * @see https://bitcoin.org/en/developer-reference#block
+ */
+extern const char *BLOCK;
+/**
+ * The getaddr message requests an addr message from the receiving node,
+ * preferably one with lots of IP addresses of other receiving nodes.
+ * @see https://bitcoin.org/en/developer-reference#getaddr
+ */
+extern const char *GETADDR;
+/**
+ * The mempool message requests the TXIDs of transactions that the receiving
+ * node has verified as valid but which have not yet appeared in a block.
+ * @since protocol version 60002.
+ * @see https://bitcoin.org/en/developer-reference#mempool
+ */
+extern const char *MEMPOOL;
+/**
+ * The ping message is sent periodically to help confirm that the receiving
+ * peer is still connected.
+ * @see https://bitcoin.org/en/developer-reference#ping
+ */
+extern const char *PING;
+/**
+ * The pong message replies to a ping message, proving to the pinging node that
+ * the ponging node is still alive.
+ * @since protocol version 60001 as described by BIP31.
+ * @see https://bitcoin.org/en/developer-reference#pong
+ */
+extern const char *PONG;
+/**
+ * The notfound message is a reply to a getdata message which requested an
+ * object the receiving node does not have available for relay.
+ * @ince protocol version 70001.
+ * @see https://bitcoin.org/en/developer-reference#notfound
+ */
+extern const char *NOTFOUND;
+/**
+ * The filterload message tells the receiving peer to filter all relayed
+ * transactions and requested merkle blocks through the provided filter.
+ * @since protocol version 70001 as described by BIP37.
+ * Only available with service bit NODE_BLOOM since protocol version
+ * 70011 as described by BIP111.
+ * @see https://bitcoin.org/en/developer-reference#filterload
+ */
+extern const char *FILTERLOAD;
+/**
+ * The filteradd message tells the receiving peer to add a single element to a
+ * previously-set bloom filter, such as a new public key.
+ * @since protocol version 70001 as described by BIP37.
+ * Only available with service bit NODE_BLOOM since protocol version
+ * 70011 as described by BIP111.
+ * @see https://bitcoin.org/en/developer-reference#filteradd
+ */
+extern const char *FILTERADD;
+/**
+ * The filterclear message tells the receiving peer to remove a previously-set
+ * bloom filter.
+ * @since protocol version 70001 as described by BIP37.
+ * Only available with service bit NODE_BLOOM since protocol version
+ * 70011 as described by BIP111.
+ * @see https://bitcoin.org/en/developer-reference#filterclear
+ */
+extern const char *FILTERCLEAR;
+/**
+ * The reject message informs the receiving node that one of its previous
+ * messages has been rejected.
+ * @since protocol version 70002 as described by BIP61.
+ * @see https://bitcoin.org/en/developer-reference#reject
+ */
+extern const char *REJECT;
+/**
+ * Indicates that a node prefers to receive new block announcements via a
+ * "headers" message rather than an "inv".
+ * @since protocol version 70012 as described by BIP130.
+ * @see https://bitcoin.org/en/developer-reference#sendheaders
+ */
+extern const char *SENDHEADERS;
+/**
+ * The feefilter message tells the receiving peer not to inv us any txs
+ * which do not meet the specified min fee rate.
+ * @since protocol version 70013 as described by BIP133
+ */
+extern const char *FEEFILTER;
+/**
+ * Contains a 1-byte bool and 8-byte LE version number.
+ * Indicates that a node is willing to provide blocks via "cmpctblock" messages.
+ * May indicate that a node prefers to receive new block announcements via a
+ * "cmpctblock" message rather than an "inv", depending on message contents.
+ * @since protocol version 70014 as described by BIP 152
+ */
+extern const char *SENDCMPCT;
+/**
+ * Contains a CBlockHeaderAndShortTxIDs object - providing a header and
+ * list of "short txids".
+ * @since protocol version 70014 as described by BIP 152
+ */
+extern const char *CMPCTBLOCK;
+/**
+ * Contains a BlockTransactionsRequest
+ * Peer should respond with "blocktxn" message.
+ * @since protocol version 70014 as described by BIP 152
+ */
+extern const char *GETBLOCKTXN;
+/**
+ * Contains a BlockTransactions.
+ * Sent in response to a "getblocktxn" message.
+ * @since protocol version 70014 as described by BIP 152
+ */
+extern const char *BLOCKTXN;
};
+/* Get a vector of all valid message types (see above) */
+const std::vector<std::string> &getAllNetMessageTypes();
+
/** nServices flags */
-enum {
+enum ServiceFlags : uint64_t {
+ // Nothing
+ NODE_NONE = 0,
// NODE_NETWORK means that the node is capable of serving the block chain. It is currently
// set by all Bitcoin Core nodes, and is unset by SPV clients or other peers that just want
// network services but don't provide them.
@@ -79,6 +261,12 @@ enum {
// Bitcoin Core nodes used to support this by default, without advertising this bit,
// but no longer do as of protocol version 70011 (= NO_BLOOM_VERSION)
NODE_BLOOM = (1 << 2),
+ // Indicates that a node can be asked for blocks and transactions including
+ // witness data.
+ NODE_WITNESS = (1 << 3),
+ // NODE_XTHIN means the node supports Xtreme Thinblocks
+ // If this is turned off then the node will not service nor make xthin requests
+ NODE_XTHIN = (1 << 4),
// Bits 24-31 are reserved for temporary experiments. Just pick a bit that
// isn't getting used, or one not being used much, and notify the
@@ -94,7 +282,7 @@ class CAddress : public CService
{
public:
CAddress();
- explicit CAddress(CService ipIn, uint64_t nServicesIn = NODE_NETWORK);
+ explicit CAddress(CService ipIn, ServiceFlags nServicesIn);
void Init();
@@ -110,25 +298,47 @@ public:
if ((nType & SER_DISK) ||
(nVersion >= CADDR_TIME_VERSION && !(nType & SER_GETHASH)))
READWRITE(nTime);
- READWRITE(nServices);
+ uint64_t nServicesInt = nServices;
+ READWRITE(nServicesInt);
+ nServices = (ServiceFlags)nServicesInt;
READWRITE(*(CService*)this);
}
// TODO: make private (improves encapsulation)
public:
- uint64_t nServices;
+ ServiceFlags nServices;
// disk and network only
unsigned int nTime;
};
+/** getdata message type flags */
+const uint32_t MSG_WITNESS_FLAG = 1 << 30;
+const uint32_t MSG_TYPE_MASK = 0xffffffff >> 2;
+
+/** getdata / inv message types.
+ * These numbers are defined by the protocol. When adding a new value, be sure
+ * to mention it in the respective BIP.
+ */
+enum GetDataMsg
+{
+ UNDEFINED = 0,
+ MSG_TX = 1,
+ MSG_BLOCK = 2,
+ // The following can only occur in getdata. Invs always use TX or BLOCK.
+ MSG_FILTERED_BLOCK = 3, //!< Defined in BIP37
+ MSG_CMPCT_BLOCK = 4, //!< Defined in BIP152
+ MSG_WITNESS_BLOCK = MSG_BLOCK | MSG_WITNESS_FLAG, //!< Defined in BIP144
+ MSG_WITNESS_TX = MSG_TX | MSG_WITNESS_FLAG, //!< Defined in BIP144
+ MSG_FILTERED_WITNESS_BLOCK = MSG_FILTERED_BLOCK | MSG_WITNESS_FLAG,
+};
+
/** inv message data */
class CInv
{
public:
CInv();
CInv(int typeIn, const uint256& hashIn);
- CInv(const std::string& strType, const uint256& hashIn);
ADD_SERIALIZE_METHODS;
@@ -141,8 +351,7 @@ public:
friend bool operator<(const CInv& a, const CInv& b);
- bool IsKnownType() const;
- const char* GetCommand() const;
+ std::string GetCommand() const;
std::string ToString() const;
// TODO: make private (improves encapsulation)
@@ -151,12 +360,4 @@ public:
uint256 hash;
};
-enum {
- MSG_TX = 1,
- MSG_BLOCK,
- // Nodes may always request a MSG_FILTERED_BLOCK in a getdata, however,
- // MSG_FILTERED_BLOCK should not appear in any invs except as a part of getdata.
- MSG_FILTERED_BLOCK,
-};
-
#endif // BITCOIN_PROTOCOL_H
diff --git a/src/pubkey.cpp b/src/pubkey.cpp
index 6ebb152c75..91a657593a 100644
--- a/src/pubkey.cpp
+++ b/src/pubkey.cpp
@@ -1,4 +1,4 @@
-// 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.
@@ -246,7 +246,7 @@ bool CPubKey::Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChi
return true;
}
-void CExtPubKey::Encode(unsigned char code[74]) const {
+void CExtPubKey::Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const {
code[0] = nDepth;
memcpy(code+1, vchFingerprint, 4);
code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF;
@@ -256,20 +256,20 @@ void CExtPubKey::Encode(unsigned char code[74]) const {
memcpy(code+41, pubkey.begin(), 33);
}
-void CExtPubKey::Decode(const unsigned char code[74]) {
+void CExtPubKey::Decode(const unsigned char code[BIP32_EXTKEY_SIZE]) {
nDepth = code[0];
memcpy(vchFingerprint, code+1, 4);
nChild = (code[5] << 24) | (code[6] << 16) | (code[7] << 8) | code[8];
memcpy(chaincode.begin(), code+9, 32);
- pubkey.Set(code+41, code+74);
+ pubkey.Set(code+41, code+BIP32_EXTKEY_SIZE);
}
-bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const {
+bool CExtPubKey::Derive(CExtPubKey &out, unsigned int _nChild) const {
out.nDepth = nDepth + 1;
CKeyID id = pubkey.GetID();
memcpy(&out.vchFingerprint[0], &id, 4);
- out.nChild = nChild;
- return pubkey.Derive(out.pubkey, out.chaincode, nChild, chaincode);
+ out.nChild = _nChild;
+ return pubkey.Derive(out.pubkey, out.chaincode, _nChild, chaincode);
}
/* static */ bool CPubKey::CheckLowS(const std::vector<unsigned char>& vchSig) {
diff --git a/src/pubkey.h b/src/pubkey.h
index a1d437e706..3a554877f8 100644
--- a/src/pubkey.h
+++ b/src/pubkey.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -13,7 +13,7 @@
#include <stdexcept>
#include <vector>
-/**
+/**
* secp256k1:
* const unsigned int PRIVATE_KEY_SIZE = 279;
* const unsigned int PUBLIC_KEY_SIZE = 65;
@@ -23,6 +23,8 @@
* script supports up to 75 for single byte push
*/
+const unsigned int BIP32_EXTKEY_SIZE = 74;
+
/** A reference to a CKey: the Hash160 of its serialized public key */
class CKeyID : public uint160
{
@@ -86,9 +88,9 @@ public:
}
//! Construct a public key from a byte vector.
- CPubKey(const std::vector<unsigned char>& vch)
+ CPubKey(const std::vector<unsigned char>& _vch)
{
- Set(vch.begin(), vch.end());
+ Set(_vch.begin(), _vch.end());
}
//! Simple read-only vector-like interface to the pubkey data.
@@ -154,7 +156,7 @@ public:
/*
* Check syntactic correctness.
- *
+ *
* Note that this is consensus critical as CheckSig() calls it!
*/
bool IsValid() const
@@ -201,13 +203,40 @@ struct CExtPubKey {
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 &&
- a.chaincode == b.chaincode && a.pubkey == b.pubkey;
+ return a.nDepth == b.nDepth &&
+ memcmp(&a.vchFingerprint[0], &b.vchFingerprint[0], sizeof(vchFingerprint)) == 0 &&
+ a.nChild == b.nChild &&
+ a.chaincode == b.chaincode &&
+ a.pubkey == b.pubkey;
}
- void Encode(unsigned char code[74]) const;
- void Decode(const unsigned char code[74]);
+ void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const;
+ void Decode(const unsigned char code[BIP32_EXTKEY_SIZE]);
bool Derive(CExtPubKey& out, unsigned int nChild) const;
+
+ unsigned int GetSerializeSize(int nType, int nVersion) const
+ {
+ return BIP32_EXTKEY_SIZE+1; //add one byte for the size (compact int)
+ }
+ template <typename Stream>
+ void Serialize(Stream& s, int nType, int nVersion) const
+ {
+ unsigned int len = BIP32_EXTKEY_SIZE;
+ ::WriteCompactSize(s, len);
+ unsigned char code[BIP32_EXTKEY_SIZE];
+ Encode(code);
+ s.write((const char *)&code[0], len);
+ }
+ template <typename Stream>
+ void Unserialize(Stream& s, int nType, int nVersion)
+ {
+ unsigned int len = ::ReadCompactSize(s);
+ unsigned char code[BIP32_EXTKEY_SIZE];
+ if (len != BIP32_EXTKEY_SIZE)
+ throw std::runtime_error("Invalid extended key size\n");
+ s.read((char *)&code[0], len);
+ Decode(code);
+ }
};
/** Users of this module must hold an ECCVerifyHandle. The constructor and
diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp
index 8bd1586446..58cf4dede0 100644
--- a/src/qt/addressbookpage.cpp
+++ b/src/qt/addressbookpage.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -21,12 +21,12 @@
#include <QMessageBox>
#include <QSortFilterProxyModel>
-AddressBookPage::AddressBookPage(const PlatformStyle *platformStyle, Mode mode, Tabs tab, QWidget *parent) :
+AddressBookPage::AddressBookPage(const PlatformStyle *platformStyle, Mode _mode, Tabs _tab, QWidget *parent) :
QDialog(parent),
ui(new Ui::AddressBookPage),
model(0),
- mode(mode),
- tab(tab)
+ mode(_mode),
+ tab(_tab)
{
ui->setupUi(this);
@@ -107,14 +107,14 @@ AddressBookPage::~AddressBookPage()
delete ui;
}
-void AddressBookPage::setModel(AddressTableModel *model)
+void AddressBookPage::setModel(AddressTableModel *_model)
{
- this->model = model;
- if(!model)
+ this->model = _model;
+ if(!_model)
return;
proxyModel = new QSortFilterProxyModel(this);
- proxyModel->setSourceModel(model);
+ proxyModel->setSourceModel(_model);
proxyModel->setDynamicSortFilter(true);
proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
@@ -147,7 +147,7 @@ void AddressBookPage::setModel(AddressTableModel *model)
this, SLOT(selectionChanged()));
// Select row for newly created address
- connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(selectNewAddress(QModelIndex,int,int)));
+ connect(_model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(selectNewAddress(QModelIndex,int,int)));
selectionChanged();
}
diff --git a/src/qt/addressbookpage.h b/src/qt/addressbookpage.h
index 92e6cab9ac..c22566d473 100644
--- a/src/qt/addressbookpage.h
+++ b/src/qt/addressbookpage.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp
index a488d298c4..830c9cdf19 100644
--- a/src/qt/addresstablemodel.cpp
+++ b/src/qt/addresstablemodel.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -31,8 +31,8 @@ struct AddressTableEntry
QString address;
AddressTableEntry() {}
- AddressTableEntry(Type type, const QString &label, const QString &address):
- type(type), label(label), address(address) {}
+ AddressTableEntry(Type _type, const QString &_label, const QString &_address):
+ type(_type), label(_label), address(_address) {}
};
struct AddressTableEntryLessThan
@@ -73,8 +73,8 @@ public:
QList<AddressTableEntry> cachedAddressTable;
AddressTableModel *parent;
- AddressTablePriv(CWallet *wallet, AddressTableModel *parent):
- wallet(wallet), parent(parent) {}
+ AddressTablePriv(CWallet *_wallet, AddressTableModel *_parent):
+ wallet(_wallet), parent(_parent) {}
void refreshAddressTable()
{
@@ -164,8 +164,8 @@ public:
}
};
-AddressTableModel::AddressTableModel(CWallet *wallet, WalletModel *parent) :
- QAbstractTableModel(parent),walletModel(parent),wallet(wallet),priv(0)
+AddressTableModel::AddressTableModel(CWallet *_wallet, WalletModel *parent) :
+ QAbstractTableModel(parent),walletModel(parent),wallet(_wallet),priv(0)
{
columns << tr("Label") << tr("Address");
priv = new AddressTablePriv(wallet, this);
diff --git a/src/qt/addresstablemodel.h b/src/qt/addresstablemodel.h
index 2b7475c4e2..d04b95ebae 100644
--- a/src/qt/addresstablemodel.h
+++ b/src/qt/addresstablemodel.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp
index 441814ff07..129ea1efa4 100644
--- a/src/qt/askpassphrasedialog.cpp
+++ b/src/qt/askpassphrasedialog.cpp
@@ -1,7 +1,11 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "askpassphrasedialog.h"
#include "ui_askpassphrasedialog.h"
@@ -14,10 +18,10 @@
#include <QMessageBox>
#include <QPushButton>
-AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) :
+AskPassphraseDialog::AskPassphraseDialog(Mode _mode, QWidget *parent) :
QDialog(parent),
ui(new Ui::AskPassphraseDialog),
- mode(mode),
+ mode(_mode),
model(0),
fCapsLock(false)
{
@@ -73,16 +77,13 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) :
AskPassphraseDialog::~AskPassphraseDialog()
{
- // Attempt to overwrite text so that they do not linger around in memory
- ui->passEdit1->setText(QString(" ").repeated(ui->passEdit1->text().size()));
- ui->passEdit2->setText(QString(" ").repeated(ui->passEdit2->text().size()));
- ui->passEdit3->setText(QString(" ").repeated(ui->passEdit3->text().size()));
+ secureClearPassFields();
delete ui;
}
-void AskPassphraseDialog::setModel(WalletModel *model)
+void AskPassphraseDialog::setModel(WalletModel *_model)
{
- this->model = model;
+ this->model = _model;
}
void AskPassphraseDialog::accept()
@@ -99,6 +100,8 @@ void AskPassphraseDialog::accept()
newpass1.assign(ui->passEdit2->text().toStdString().c_str());
newpass2.assign(ui->passEdit3->text().toStdString().c_str());
+ secureClearPassFields();
+
switch(mode)
{
case Encrypt: {
@@ -119,9 +122,9 @@ void AskPassphraseDialog::accept()
{
QMessageBox::warning(this, tr("Wallet encrypted"),
"<qt>" +
- tr("Bitcoin Core will close now to finish the encryption process. "
+ tr("%1 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.") +
+ "your bitcoins from being stolen by malware infecting your computer.").arg(tr(PACKAGE_NAME)) +
"<br><br><b>" +
tr("IMPORTANT: Any previous backups you have made of your wallet file "
"should be replaced with the newly generated, encrypted wallet file. "
@@ -256,3 +259,17 @@ bool AskPassphraseDialog::eventFilter(QObject *object, QEvent *event)
}
return QDialog::eventFilter(object, event);
}
+
+static void SecureClearQLineEdit(QLineEdit* edit)
+{
+ // Attempt to overwrite text so that they do not linger around in memory
+ edit->setText(QString(" ").repeated(edit->text().size()));
+ edit->clear();
+}
+
+void AskPassphraseDialog::secureClearPassFields()
+{
+ SecureClearQLineEdit(ui->passEdit1);
+ SecureClearQLineEdit(ui->passEdit2);
+ SecureClearQLineEdit(ui->passEdit3);
+}
diff --git a/src/qt/askpassphrasedialog.h b/src/qt/askpassphrasedialog.h
index d4d832825a..34bf7ccb31 100644
--- a/src/qt/askpassphrasedialog.h
+++ b/src/qt/askpassphrasedialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -42,6 +42,7 @@ private:
private Q_SLOTS:
void textChanged();
+ void secureClearPassFields();
protected:
bool event(QEvent *event);
diff --git a/src/qt/bantablemodel.cpp b/src/qt/bantablemodel.cpp
index 33792af5ba..6e11e23904 100644
--- a/src/qt/bantablemodel.cpp
+++ b/src/qt/bantablemodel.cpp
@@ -48,7 +48,8 @@ public:
void refreshBanlist()
{
banmap_t banMap;
- CNode::GetBanned(banMap);
+ if(g_connman)
+ g_connman->GetBanned(banMap);
cachedBanlist.clear();
#if QT_VERSION >= 0x040700
@@ -103,7 +104,7 @@ int BanTableModel::rowCount(const QModelIndex &parent) const
int BanTableModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
- return columns.length();;
+ return columns.length();
}
QVariant BanTableModel::data(const QModelIndex &index, int role) const
@@ -178,4 +179,4 @@ bool BanTableModel::shouldShow()
if (priv->size() > 0)
return true;
return false;
-} \ No newline at end of file
+}
diff --git a/src/qt/bantablemodel.h b/src/qt/bantablemodel.h
index c21dd04e31..fe9600ac0b 100644
--- a/src/qt/bantablemodel.h
+++ b/src/qt/bantablemodel.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 6e6330d2a4..9986af4957 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -26,7 +26,7 @@
#endif
#include "init.h"
-#include "rpcserver.h"
+#include "rpc/server.h"
#include "scheduler.h"
#include "ui_interface.h"
#include "util.h"
@@ -370,6 +370,7 @@ void BitcoinApplication::createSplashScreen(const NetworkStyle *networkStyle)
splash->setAttribute(Qt::WA_DeleteOnClose);
splash->show();
connect(this, SIGNAL(splashFinished(QWidget*)), splash, SLOT(slotFinish(QWidget*)));
+ connect(this, SIGNAL(requestedShutdown()), splash, SLOT(close()));
}
void BitcoinApplication::startThread()
@@ -532,6 +533,9 @@ int main(int argc, char *argv[])
// Generate high-dpi pixmaps
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif
+#if QT_VERSION >= 0x050600
+ QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+#endif
#ifdef Q_OS_MAC
QApplication::setAttribute(Qt::AA_DontShowIconsInMenus);
#endif
@@ -574,20 +578,21 @@ int main(int argc, char *argv[])
/// 5. Now that settings and translations are available, ask user for data directory
// User language is set up: pick a data directory
- Intro::pickDataDirectory();
+ if (!Intro::pickDataDirectory())
+ return 0;
/// 6. Determine availability of data directory and parse bitcoin.conf
/// - Do not call GetDataDir(true) before this step finishes
if (!boost::filesystem::is_directory(GetDataDir(false)))
{
- QMessageBox::critical(0, QObject::tr("Bitcoin Core"),
+ QMessageBox::critical(0, QObject::tr(PACKAGE_NAME),
QObject::tr("Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(mapArgs["-datadir"])));
return 1;
}
try {
- ReadConfigFile(mapArgs, mapMultiArgs);
+ ReadConfigFile(GetArg("-conf", BITCOIN_CONF_FILENAME), mapArgs, mapMultiArgs);
} catch (const std::exception& e) {
- QMessageBox::critical(0, QObject::tr("Bitcoin Core"),
+ QMessageBox::critical(0, QObject::tr(PACKAGE_NAME),
QObject::tr("Error: Cannot parse configuration file: %1. Only use key=value syntax.").arg(e.what()));
return false;
}
@@ -602,7 +607,7 @@ int main(int argc, char *argv[])
try {
SelectParams(ChainNameFromCommandLine());
} catch(std::exception &e) {
- QMessageBox::critical(0, QObject::tr("Bitcoin Core"), QObject::tr("Error: %1").arg(e.what()));
+ QMessageBox::critical(0, QObject::tr(PACKAGE_NAME), QObject::tr("Error: %1").arg(e.what()));
return 1;
}
#ifdef ENABLE_WALLET
@@ -662,7 +667,7 @@ int main(int argc, char *argv[])
app.createWindow(networkStyle.data());
app.requestInitialize();
#if defined(Q_OS_WIN) && QT_VERSION >= 0x050000
- WinShutdownMonitor::registerShutdownBlockReason(QObject::tr("Bitcoin Core didn't yet exit safely..."), (HWND)app.getMainWinId());
+ WinShutdownMonitor::registerShutdownBlockReason(QObject::tr("%1 didn't yet exit safely...").arg(QObject::tr(PACKAGE_NAME)), (HWND)app.getMainWinId());
#endif
app.exec();
app.requestShutdown();
diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc
index c899e95506..ca5b1fa673 100644
--- a/src/qt/bitcoin.qrc
+++ b/src/qt/bitcoin.qrc
@@ -46,6 +46,12 @@
<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>
+ <file alias="fontbigger">res/icons/fontbigger.png</file>
+ <file alias="fontsmaller">res/icons/fontsmaller.png</file>
+ <file alias="prompticon">res/icons/chevron.png</file>
+ <file alias="transaction_abandoned">res/icons/transaction_abandoned.png</file>
+ <file alias="hd_enabled">res/icons/hd_enabled.png</file>
+ <file alias="hd_disabled">res/icons/hd_disabled.png</file>
</qresource>
<qresource prefix="/movies">
<file alias="spinner-000">res/movies/spinner-000.png</file>
diff --git a/src/qt/bitcoin_locale.qrc b/src/qt/bitcoin_locale.qrc
index a8a0253b07..8dd07c3d41 100644
--- a/src/qt/bitcoin_locale.qrc
+++ b/src/qt/bitcoin_locale.qrc
@@ -1,11 +1,11 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/translations">
+ <file alias="af">locale/bitcoin_af.qm</file>
<file alias="af_ZA">locale/bitcoin_af_ZA.qm</file>
<file alias="ar">locale/bitcoin_ar.qm</file>
<file alias="be_BY">locale/bitcoin_be_BY.qm</file>
- <file alias="bg_BG">locale/bitcoin_bg_BG.qm</file>
<file alias="bg">locale/bitcoin_bg.qm</file>
- <file alias="bs">locale/bitcoin_bs.qm</file>
+ <file alias="bg_BG">locale/bitcoin_bg_BG.qm</file>
<file alias="ca_ES">locale/bitcoin_ca_ES.qm</file>
<file alias="ca">locale/bitcoin_ca.qm</file>
<file alias="ca@valencia">locale/bitcoin_ca@valencia.qm</file>
@@ -19,7 +19,9 @@
<file alias="en_GB">locale/bitcoin_en_GB.qm</file>
<file alias="en">locale/bitcoin_en.qm</file>
<file alias="eo">locale/bitcoin_eo.qm</file>
+ <file alias="es_AR">locale/bitcoin_es_AR.qm</file>
<file alias="es_CL">locale/bitcoin_es_CL.qm</file>
+ <file alias="es_CO">locale/bitcoin_es_CO.qm</file>
<file alias="es_DO">locale/bitcoin_es_DO.qm</file>
<file alias="es_ES">locale/bitcoin_es_ES.qm</file>
<file alias="es_MX">locale/bitcoin_es_MX.qm</file>
@@ -40,11 +42,13 @@
<file alias="hr">locale/bitcoin_hr.qm</file>
<file alias="hu">locale/bitcoin_hu.qm</file>
<file alias="id_ID">locale/bitcoin_id_ID.qm</file>
+ <file alias="it_IT">locale/bitcoin_it_IT.qm</file>
<file alias="it">locale/bitcoin_it.qm</file>
<file alias="ja">locale/bitcoin_ja.qm</file>
<file alias="ka">locale/bitcoin_ka.qm</file>
<file alias="kk_KZ">locale/bitcoin_kk_KZ.qm</file>
<file alias="ko_KR">locale/bitcoin_ko_KR.qm</file>
+ <file alias="ku_IQ">locale/bitcoin_ku_IQ.qm</file>
<file alias="ky">locale/bitcoin_ky.qm</file>
<file alias="la">locale/bitcoin_la.qm</file>
<file alias="lt">locale/bitcoin_lt.qm</file>
@@ -59,13 +63,16 @@
<file alias="pt_BR">locale/bitcoin_pt_BR.qm</file>
<file alias="pt_PT">locale/bitcoin_pt_PT.qm</file>
<file alias="ro_RO">locale/bitcoin_ro_RO.qm</file>
+ <file alias="ro">locale/bitcoin_ro.qm</file>
<file alias="ru_RU">locale/bitcoin_ru_RU.qm</file>
<file alias="ru">locale/bitcoin_ru.qm</file>
<file alias="sk">locale/bitcoin_sk.qm</file>
<file alias="sl_SI">locale/bitcoin_sl_SI.qm</file>
<file alias="sq">locale/bitcoin_sq.qm</file>
+ <file alias="sr@latin">locale/bitcoin_sr@latin.qm</file>
<file alias="sr">locale/bitcoin_sr.qm</file>
<file alias="sv">locale/bitcoin_sv.qm</file>
+ <file alias="ta">locale/bitcoin_ta.qm</file>
<file alias="th_TH">locale/bitcoin_th_TH.qm</file>
<file alias="tr_TR">locale/bitcoin_tr_TR.qm</file>
<file alias="tr">locale/bitcoin_tr.qm</file>
@@ -75,6 +82,7 @@
<file alias="vi">locale/bitcoin_vi.qm</file>
<file alias="vi_VN">locale/bitcoin_vi_VN.qm</file>
<file alias="zh_CN">locale/bitcoin_zh_CN.qm</file>
+ <file alias="zh_HK">locale/bitcoin_zh_HK.qm</file>
<file alias="zh">locale/bitcoin_zh.qm</file>
<file alias="zh_TW">locale/bitcoin_zh_TW.qm</file>
</qresource>
diff --git a/src/qt/bitcoinamountfield.cpp b/src/qt/bitcoinamountfield.cpp
index d19b9fd4af..73eb35a54e 100644
--- a/src/qt/bitcoinamountfield.cpp
+++ b/src/qt/bitcoinamountfield.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/bitcoinamountfield.h b/src/qt/bitcoinamountfield.h
index 3703b1f8d7..2f03a3d171 100644
--- a/src/qt/bitcoinamountfield.h
+++ b/src/qt/bitcoinamountfield.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index b2bd167aea..af767aa6c6 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -1,13 +1,18 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "bitcoingui.h"
#include "bitcoinunits.h"
#include "clientmodel.h"
#include "guiconstants.h"
#include "guiutil.h"
+#include "modaloverlay.h"
#include "networkstyle.h"
#include "notificator.h"
#include "openuridialog.h"
@@ -69,14 +74,18 @@ const std::string BitcoinGUI::DEFAULT_UIPLATFORM =
#endif
;
+/** Display name for default wallet name. Uses tilde to avoid name
+ * collisions in the future with additional wallets */
const QString BitcoinGUI::DEFAULT_WALLET = "~Default";
-BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *networkStyle, QWidget *parent) :
+BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle *networkStyle, QWidget *parent) :
QMainWindow(parent),
+ enableWallet(false),
clientModel(0),
walletFrame(0),
unitDisplayControl(0),
- labelEncryptionIcon(0),
+ labelWalletEncryptionIcon(0),
+ labelWalletHDStatusIcon(0),
labelConnectionsIcon(0),
labelBlocksIcon(0),
progressBarLabel(0),
@@ -109,18 +118,16 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n
notificator(0),
rpcConsole(0),
helpMessageDialog(0),
+ modalOverlay(0),
prevBlocks(0),
spinnerFrame(0),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
GUIUtil::restoreWindowGeometry("nWindow", QSize(850, 550), this);
- QString windowTitle = tr("Bitcoin Core") + " - ";
+ QString windowTitle = tr(PACKAGE_NAME) + " - ";
#ifdef ENABLE_WALLET
- /* if compiled with wallet support, -disablewallet can still disable the wallet */
- enableWallet = !GetBoolArg("-disablewallet", false);
-#else
- enableWallet = false;
+ enableWallet = WalletModel::isWalletEnabled();
#endif // ENABLE_WALLET
if(enableWallet)
{
@@ -143,13 +150,13 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n
setUnifiedTitleAndToolBarOnMac(true);
#endif
- rpcConsole = new RPCConsole(platformStyle, 0);
+ rpcConsole = new RPCConsole(_platformStyle, 0);
helpMessageDialog = new HelpMessageDialog(this, false);
#ifdef ENABLE_WALLET
if(enableWallet)
{
/** Create wallet frame and make it the central widget */
- walletFrame = new WalletFrame(platformStyle, this);
+ walletFrame = new WalletFrame(_platformStyle, this);
setCentralWidget(walletFrame);
} else
#endif // ENABLE_WALLET
@@ -190,7 +197,8 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n
frameBlocksLayout->setContentsMargins(3,0,3,0);
frameBlocksLayout->setSpacing(3);
unitDisplayControl = new UnitDisplayStatusBarControl(platformStyle);
- labelEncryptionIcon = new QLabel();
+ labelWalletEncryptionIcon = new QLabel();
+ labelWalletHDStatusIcon = new QLabel();
labelConnectionsIcon = new QLabel();
labelBlocksIcon = new QLabel();
if(enableWallet)
@@ -198,7 +206,8 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n
frameBlocksLayout->addStretch();
frameBlocksLayout->addWidget(unitDisplayControl);
frameBlocksLayout->addStretch();
- frameBlocksLayout->addWidget(labelEncryptionIcon);
+ frameBlocksLayout->addWidget(labelWalletEncryptionIcon);
+ frameBlocksLayout->addWidget(labelWalletHDStatusIcon);
}
frameBlocksLayout->addStretch();
frameBlocksLayout->addWidget(labelConnectionsIcon);
@@ -234,6 +243,12 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n
// Subscribe to notifications from core
subscribeToCoreSignals();
+
+ modalOverlay = new ModalOverlay(this->centralWidget());
+#ifdef ENABLE_WALLET
+ if(enableWallet)
+ connect(walletFrame, SIGNAL(requestedSyncWarningInfo()), this, SLOT(showModalOverlay()));
+#endif
}
BitcoinGUI::~BitcoinGUI()
@@ -313,15 +328,17 @@ void BitcoinGUI::createActions()
quitAction->setStatusTip(tr("Quit application"));
quitAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q));
quitAction->setMenuRole(QAction::QuitRole);
- aboutAction = new QAction(platformStyle->TextColorIcon(":/icons/about"), tr("&About Bitcoin Core"), this);
- aboutAction->setStatusTip(tr("Show information about Bitcoin Core"));
+ aboutAction = new QAction(platformStyle->TextColorIcon(":/icons/about"), tr("&About %1").arg(tr(PACKAGE_NAME)), this);
+ aboutAction->setStatusTip(tr("Show information about %1").arg(tr(PACKAGE_NAME)));
aboutAction->setMenuRole(QAction::AboutRole);
+ aboutAction->setEnabled(false);
aboutQtAction = new QAction(platformStyle->TextColorIcon(":/icons/about_qt"), tr("About &Qt"), this);
aboutQtAction->setStatusTip(tr("Show information about Qt"));
aboutQtAction->setMenuRole(QAction::AboutQtRole);
optionsAction = new QAction(platformStyle->TextColorIcon(":/icons/options"), tr("&Options..."), this);
- optionsAction->setStatusTip(tr("Modify configuration options for Bitcoin Core"));
+ optionsAction->setStatusTip(tr("Modify configuration options for %1").arg(tr(PACKAGE_NAME)));
optionsAction->setMenuRole(QAction::PreferencesRole);
+ optionsAction->setEnabled(false);
toggleHideAction = new QAction(platformStyle->TextColorIcon(":/icons/about"), tr("&Show / Hide"), this);
toggleHideAction->setStatusTip(tr("Show or hide the main Window"));
@@ -339,6 +356,8 @@ void BitcoinGUI::createActions()
openRPCConsoleAction = new QAction(platformStyle->TextColorIcon(":/icons/debugwindow"), tr("&Debug window"), this);
openRPCConsoleAction->setStatusTip(tr("Open debugging and diagnostic console"));
+ // initially disable the debug window menu item
+ openRPCConsoleAction->setEnabled(false);
usedSendingAddressesAction = new QAction(platformStyle->TextColorIcon(":/icons/address-book"), tr("&Sending addresses..."), this);
usedSendingAddressesAction->setStatusTip(tr("Show the list of used sending addresses and labels"));
@@ -350,7 +369,7 @@ void BitcoinGUI::createActions()
showHelpMessageAction = new QAction(platformStyle->TextColorIcon(":/icons/info"), tr("&Command-line options"), this);
showHelpMessageAction->setMenuRole(QAction::NoRole);
- showHelpMessageAction->setStatusTip(tr("Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options"));
+ showHelpMessageAction->setStatusTip(tr("Show the %1 help message to get a list with possible Bitcoin command-line options").arg(tr(PACKAGE_NAME)));
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutClicked()));
@@ -440,36 +459,48 @@ void BitcoinGUI::createToolBars()
}
}
-void BitcoinGUI::setClientModel(ClientModel *clientModel)
+void BitcoinGUI::setClientModel(ClientModel *_clientModel)
{
- this->clientModel = clientModel;
- if(clientModel)
+ this->clientModel = _clientModel;
+ if(_clientModel)
{
// Create system tray menu (or setup the dock menu) that late to prevent users from calling actions,
// while the client has not yet fully loaded
createTrayIconMenu();
// Keep up to date with client
- setNumConnections(clientModel->getNumConnections());
- connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
+ setNumConnections(_clientModel->getNumConnections());
+ connect(_clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
- setNumBlocks(clientModel->getNumBlocks(), clientModel->getLastBlockDate(), clientModel->getVerificationProgress(NULL));
- connect(clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double)), this, SLOT(setNumBlocks(int,QDateTime,double)));
+ setNumBlocks(_clientModel->getNumBlocks(), _clientModel->getLastBlockDate(), _clientModel->getVerificationProgress(NULL), false);
+ connect(_clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double,bool)), this, SLOT(setNumBlocks(int,QDateTime,double,bool)));
// Receive and report messages from client model
- connect(clientModel, SIGNAL(message(QString,QString,unsigned int)), this, SLOT(message(QString,QString,unsigned int)));
+ connect(_clientModel, SIGNAL(message(QString,QString,unsigned int)), this, SLOT(message(QString,QString,unsigned int)));
// Show progress dialog
- connect(clientModel, SIGNAL(showProgress(QString,int)), this, SLOT(showProgress(QString,int)));
+ connect(_clientModel, SIGNAL(showProgress(QString,int)), this, SLOT(showProgress(QString,int)));
- rpcConsole->setClientModel(clientModel);
+ rpcConsole->setClientModel(_clientModel);
#ifdef ENABLE_WALLET
if(walletFrame)
{
- walletFrame->setClientModel(clientModel);
+ walletFrame->setClientModel(_clientModel);
}
#endif // ENABLE_WALLET
- unitDisplayControl->setOptionsModel(clientModel->getOptionsModel());
+ unitDisplayControl->setOptionsModel(_clientModel->getOptionsModel());
+
+ OptionsModel* optionsModel = _clientModel->getOptionsModel();
+ if(optionsModel)
+ {
+ // be aware of the tray icon disable state change reported by the OptionsModel object.
+ connect(optionsModel,SIGNAL(hideTrayIconChanged(bool)),this,SLOT(setTrayIconVisible(bool)));
+
+ // initialize the disable state of the tray icon with the current value in the model.
+ setTrayIconVisible(optionsModel->getHideTrayIcon());
+ }
+
+ modalOverlay->setKnownBestHeight(clientModel->getHeaderTipHeight(), QDateTime::fromTime_t(clientModel->getHeaderTipTime()));
} else {
// Disable possibility to show main window via action
toggleHideAction->setEnabled(false);
@@ -528,10 +559,10 @@ void BitcoinGUI::createTrayIcon(const NetworkStyle *networkStyle)
{
#ifndef Q_OS_MAC
trayIcon = new QSystemTrayIcon(this);
- QString toolTip = tr("Bitcoin Core client") + " " + networkStyle->getTitleAddText();
+ QString toolTip = tr("%1 client").arg(tr(PACKAGE_NAME)) + " " + networkStyle->getTitleAddText();
trayIcon->setToolTip(toolTip);
trayIcon->setIcon(networkStyle->getTrayAndWindowIcon());
- trayIcon->show();
+ trayIcon->hide();
#endif
notificator = new Notificator(QApplication::applicationName(), trayIcon, this);
@@ -682,9 +713,19 @@ void BitcoinGUI::setNumConnections(int count)
labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count));
}
-void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress)
+void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool header)
{
- if(!clientModel)
+ if (modalOverlay)
+ {
+ if (header) {
+ /* use clientmodels getHeaderTipHeight and getHeaderTipTime because the NotifyHeaderTip signal does not fire when updating the best header */
+ modalOverlay->setKnownBestHeight(clientModel->getHeaderTipHeight(), QDateTime::fromTime_t(clientModel->getHeaderTipTime()));
+ }
+ else {
+ modalOverlay->tipUpdate(count, blockDate, nVerificationProgress);
+ }
+ }
+ if (!clientModel)
return;
// Prevent orphan statusbar messages (e.g. hover Quit in main menu, wait until chain-sync starts -> garbelled text)
@@ -694,15 +735,25 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVer
enum BlockSource blockSource = clientModel->getBlockSource();
switch (blockSource) {
case BLOCK_SOURCE_NETWORK:
+ if (header) {
+ return;
+ }
progressBarLabel->setText(tr("Synchronizing with network..."));
break;
case BLOCK_SOURCE_DISK:
- progressBarLabel->setText(tr("Importing blocks from disk..."));
+ if (header) {
+ progressBarLabel->setText(tr("Indexing blocks on disk..."));
+ } else {
+ progressBarLabel->setText(tr("Processing blocks on disk..."));
+ }
break;
case BLOCK_SOURCE_REINDEX:
progressBarLabel->setText(tr("Reindexing blocks on disk..."));
break;
case BLOCK_SOURCE_NONE:
+ if (header) {
+ return;
+ }
// Case: not Importing, not Reindexing and no network connection
progressBarLabel->setText(tr("No block source available..."));
break;
@@ -723,7 +774,10 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVer
#ifdef ENABLE_WALLET
if(walletFrame)
+ {
walletFrame->showOutOfSyncWarning(false);
+ modalOverlay->showHide(true, true);
+ }
#endif // ENABLE_WALLET
progressBarLabel->setVisible(false);
@@ -731,30 +785,7 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVer
}
else
{
- // Represent time from last generated block in human readable text
- QString timeBehindText;
- const int HOUR_IN_SECONDS = 60*60;
- const int DAY_IN_SECONDS = 24*60*60;
- const int WEEK_IN_SECONDS = 7*24*60*60;
- const int YEAR_IN_SECONDS = 31556952; // Average length of year in Gregorian calendar
- if(secs < 2*DAY_IN_SECONDS)
- {
- timeBehindText = tr("%n hour(s)","",secs/HOUR_IN_SECONDS);
- }
- else if(secs < 2*WEEK_IN_SECONDS)
- {
- timeBehindText = tr("%n day(s)","",secs/DAY_IN_SECONDS);
- }
- else if(secs < YEAR_IN_SECONDS)
- {
- timeBehindText = tr("%n week(s)","",secs/WEEK_IN_SECONDS);
- }
- else
- {
- qint64 years = secs / YEAR_IN_SECONDS;
- qint64 remainder = secs % YEAR_IN_SECONDS;
- timeBehindText = tr("%1 and %2").arg(tr("%n year(s)", "", years)).arg(tr("%n week(s)","", remainder/WEEK_IN_SECONDS));
- }
+ QString timeBehindText = GUIUtil::formateNiceTimeOffset(secs);
progressBarLabel->setVisible(true);
progressBar->setFormat(tr("%1 behind").arg(timeBehindText));
@@ -774,7 +805,10 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVer
#ifdef ENABLE_WALLET
if(walletFrame)
+ {
walletFrame->showOutOfSyncWarning(true);
+ modalOverlay->showHide();
+ }
#endif // ENABLE_WALLET
tooltip += QString("<br>");
@@ -874,17 +908,30 @@ void BitcoinGUI::closeEvent(QCloseEvent *event)
#ifndef Q_OS_MAC // Ignored on Mac
if(clientModel && clientModel->getOptionsModel())
{
- if(!clientModel->getOptionsModel()->getMinimizeToTray() &&
- !clientModel->getOptionsModel()->getMinimizeOnClose())
+ if(!clientModel->getOptionsModel()->getMinimizeOnClose())
{
// close rpcConsole in case it was open to make some space for the shutdown window
rpcConsole->close();
QApplication::quit();
}
+ else
+ {
+ QMainWindow::showMinimized();
+ event->ignore();
+ }
}
-#endif
+#else
QMainWindow::closeEvent(event);
+#endif
+}
+
+void BitcoinGUI::showEvent(QShowEvent *event)
+{
+ // enable the debug window when the main window shows up
+ openRPCConsoleAction->setEnabled(true);
+ aboutAction->setEnabled(true);
+ optionsAction->setEnabled(true);
}
#ifdef ENABLE_WALLET
@@ -947,28 +994,37 @@ bool BitcoinGUI::handlePaymentRequest(const SendCoinsRecipient& recipient)
return false;
}
+void BitcoinGUI::setHDStatus(int hdEnabled)
+{
+ labelWalletHDStatusIcon->setPixmap(platformStyle->SingleColorIcon(hdEnabled ? ":/icons/hd_enabled" : ":/icons/hd_disabled").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+ labelWalletHDStatusIcon->setToolTip(hdEnabled ? tr("HD key generation is <b>enabled</b>") : tr("HD key generation is <b>disabled</b>"));
+
+ // eventually disable the QLabel to set its opacity to 50%
+ labelWalletHDStatusIcon->setEnabled(hdEnabled);
+}
+
void BitcoinGUI::setEncryptionStatus(int status)
{
switch(status)
{
case WalletModel::Unencrypted:
- labelEncryptionIcon->hide();
+ labelWalletEncryptionIcon->hide();
encryptWalletAction->setChecked(false);
changePassphraseAction->setEnabled(false);
encryptWalletAction->setEnabled(true);
break;
case WalletModel::Unlocked:
- labelEncryptionIcon->show();
- labelEncryptionIcon->setPixmap(platformStyle->SingleColorIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
- labelEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>unlocked</b>"));
+ labelWalletEncryptionIcon->show();
+ labelWalletEncryptionIcon->setPixmap(platformStyle->SingleColorIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+ labelWalletEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>unlocked</b>"));
encryptWalletAction->setChecked(true);
changePassphraseAction->setEnabled(true);
encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported
break;
case WalletModel::Locked:
- labelEncryptionIcon->show();
- labelEncryptionIcon->setPixmap(platformStyle->SingleColorIcon(":/icons/lock_closed").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
- labelEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>locked</b>"));
+ labelWalletEncryptionIcon->show();
+ labelWalletEncryptionIcon->setPixmap(platformStyle->SingleColorIcon(":/icons/lock_closed").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+ labelWalletEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>locked</b>"));
encryptWalletAction->setChecked(true);
changePassphraseAction->setEnabled(true);
encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported
@@ -1040,6 +1096,20 @@ void BitcoinGUI::showProgress(const QString &title, int nProgress)
progressDialog->setValue(nProgress);
}
+void BitcoinGUI::setTrayIconVisible(bool fHideTrayIcon)
+{
+ if (trayIcon)
+ {
+ trayIcon->setVisible(!fHideTrayIcon);
+ }
+}
+
+void BitcoinGUI::showModalOverlay()
+{
+ if (modalOverlay)
+ modalOverlay->showHide(false, true);
+}
+
static bool ThreadSafeMessageBox(BitcoinGUI *gui, const std::string& message, const std::string& caption, unsigned int style)
{
bool modal = (style & CClientUIInterface::MODAL);
@@ -1061,12 +1131,14 @@ void BitcoinGUI::subscribeToCoreSignals()
{
// Connect signals to client
uiInterface.ThreadSafeMessageBox.connect(boost::bind(ThreadSafeMessageBox, this, _1, _2, _3));
+ uiInterface.ThreadSafeQuestion.connect(boost::bind(ThreadSafeMessageBox, this, _1, _3, _4));
}
void BitcoinGUI::unsubscribeFromCoreSignals()
{
// Disconnect signals from client
uiInterface.ThreadSafeMessageBox.disconnect(boost::bind(ThreadSafeMessageBox, this, _1, _2, _3));
+ uiInterface.ThreadSafeQuestion.disconnect(boost::bind(ThreadSafeMessageBox, this, _1, _3, _4));
}
UnitDisplayStatusBarControl::UnitDisplayStatusBarControl(const PlatformStyle *platformStyle) :
@@ -1107,17 +1179,17 @@ void UnitDisplayStatusBarControl::createContextMenu()
}
/** Lets the control know about the Options Model (and its signals) */
-void UnitDisplayStatusBarControl::setOptionsModel(OptionsModel *optionsModel)
+void UnitDisplayStatusBarControl::setOptionsModel(OptionsModel *_optionsModel)
{
- if (optionsModel)
+ if (_optionsModel)
{
- this->optionsModel = optionsModel;
+ this->optionsModel = _optionsModel;
// be aware of a display unit change reported by the OptionsModel object.
- connect(optionsModel,SIGNAL(displayUnitChanged(int)),this,SLOT(updateDisplayUnit(int)));
+ connect(_optionsModel,SIGNAL(displayUnitChanged(int)),this,SLOT(updateDisplayUnit(int)));
// initialize the display units label with the current value in the model.
- updateDisplayUnit(optionsModel->getDisplayUnit());
+ updateDisplayUnit(_optionsModel->getDisplayUnit());
}
}
diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h
index b121a443e7..0eaa44b263 100644
--- a/src/qt/bitcoingui.h
+++ b/src/qt/bitcoingui.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -29,6 +29,7 @@ class UnitDisplayStatusBarControl;
class WalletFrame;
class WalletModel;
class HelpMessageDialog;
+class ModalOverlay;
class CWallet;
@@ -72,6 +73,7 @@ public:
protected:
void changeEvent(QEvent *e);
void closeEvent(QCloseEvent *event);
+ void showEvent(QShowEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
bool eventFilter(QObject *object, QEvent *event);
@@ -81,7 +83,8 @@ private:
WalletFrame *walletFrame;
UnitDisplayStatusBarControl *unitDisplayControl;
- QLabel *labelEncryptionIcon;
+ QLabel *labelWalletEncryptionIcon;
+ QLabel *labelWalletHDStatusIcon;
QLabel *labelConnectionsIcon;
QLabel *labelBlocksIcon;
QLabel *progressBarLabel;
@@ -116,6 +119,7 @@ private:
Notificator *notificator;
RPCConsole *rpcConsole;
HelpMessageDialog *helpMessageDialog;
+ ModalOverlay *modalOverlay;
/** Keep track of previous number of blocks, to detect progress */
int prevBlocks;
@@ -150,7 +154,7 @@ public Q_SLOTS:
/** Set number of connections shown in the UI */
void setNumConnections(int count);
/** Set number of blocks and last block date shown in the UI */
- void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress);
+ void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers);
/** Notify the user of an event from the core network or transaction handling code.
@param[in] title the message box / notification title
@@ -168,6 +172,12 @@ public Q_SLOTS:
*/
void setEncryptionStatus(int status);
+ /** Set the hd-enabled status as shown in the UI.
+ @param[in] status current hd enabled status
+ @see WalletModel::EncryptionStatus
+ */
+ void setHDStatus(int hdEnabled);
+
bool handlePaymentRequest(const SendCoinsRecipient& recipient);
/** Show incoming transaction notification for new transactions. */
@@ -218,6 +228,11 @@ private Q_SLOTS:
/** Show progress dialog e.g. for verifychain */
void showProgress(const QString &title, int nProgress);
+
+ /** When hideTrayIcon setting is changed in OptionsModel hide or show the icon accordingly. */
+ void setTrayIconVisible(bool);
+
+ void showModalOverlay();
};
class UnitDisplayStatusBarControl : public QLabel
diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp
index 6b5f243668..bca5b72827 100644
--- a/src/qt/bitcoinstrings.cpp
+++ b/src/qt/bitcoinstrings.cpp
@@ -2,23 +2,34 @@
#include <QtGlobal>
-// Automatically generated by extract_strings.py
+// Automatically generated by extract_strings_qt.py
#ifdef __GNUC__
#define UNUSED __attribute__((unused))
#else
#define UNUSED
#endif
static const char UNUSED *bitcoin_strings[] = {
+QT_TRANSLATE_NOOP("bitcoin-core", "Bitcoin Core"),
+QT_TRANSLATE_NOOP("bitcoin-core", "The %s developers"),
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", ""
+"-fallbackfee is set very high! This is the transaction fee you may pay when "
+"fee estimates are not available."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"-maxtxfee is set very high! Fees this large could be paid on a single "
"transaction."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"-paytxfee is set very high! This is the transaction fee you will pay if you "
"send a transaction."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"A fee rate (in %s/kB) that will be used when fee estimation has insufficient "
+"data (default: %s)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Accept relayed transactions received from whitelisted peers even when not "
+"relaying transactions (default: %d)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Allow JSON-RPC connections from specified source. Valid for <ip> 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"),
@@ -33,8 +44,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"notation for IPv6. This option can be specified multiple times (default: "
"bind to all interfaces)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"Cannot obtain a lock on data directory %s. Bitcoin Core is probably already "
-"running."),
+"Cannot obtain a lock on data directory %s. %s is probably already running."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Create new files with system default permissions, instead of umask 077 (only "
"effective with disabled wallet functionality)"),
@@ -50,8 +60,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Do not keep transactions in the mempool longer than <n> hours (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"Error reading wallet.dat! All keys read correctly, but transaction data or "
-"address book entries might be missing or incorrect."),
+"Error loading %s: You can't enable HD on a already existing non-HD wallet"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Error reading %s! All keys read correctly, but transaction data or address "
+"book entries might be missing or incorrect."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Error: Listening for incoming connections failed (listen returned error %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -70,6 +82,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Fees (in %s/kB) smaller than this are considered zero fee for transaction "
"creation (default: %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Force relay of transactions from whitelisted peers even they violate local "
+"relay policy (default: %d)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"How thorough the block verification of -checkblocks is (0-4, default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"If <category> is not supplied or if <category> = 1, output all debugging "
@@ -84,18 +99,25 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Maintain a full transaction index, used by the getrawtransaction rpc call "
"(default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Maximum allowed median peer time offset adjustment. Local perspective of "
+"time may be influenced by peers forward or backward by this amount. "
+"(default: %u seconds)"),
+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 (in %s) to use in a single wallet transaction; setting "
-"this too low may abort large transactions (default: %s)"),
+"Maximum total fees (in %s) to use in a single wallet transaction or raw "
+"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", ""
"Please check that your computer's date and time are correct! If your clock "
-"is wrong Bitcoin Core will not work properly."),
+"is wrong, %s will not work properly."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Please contribute if you find %s useful. Visit %s for further information "
+"about the software."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Prune configured below the minimum of %d MiB. Please use a higher number."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -121,9 +143,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Set the number of script verification threads (%u to %d, 0 = auto, <0 = "
"leave that many cores free, default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"Set the number of threads for coin generation if enabled (-1 = all cores, "
-"default: %d)"),
-QT_TRANSLATE_NOOP("bitcoin-core", ""
"Support filtering of blocks and transaction with bloom filters (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"The block database contains a block which appears to be from the future. "
@@ -146,14 +165,20 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = "
"no limit (default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"Unable to bind to %s on this computer. Bitcoin Core is probably already "
-"running."),
+"Unable to rewind the database to a pre-fork state. You will need to "
+"redownload the blockchain"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Unsupported argument -socks found. Setting SOCKS version isn't possible "
"anymore, only SOCKS5 proxies are supported."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/"
+"or -whitelistforcerelay."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Use UPnP to map the listening port (default: 1 when listening and no -proxy)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Use hierarchical deterministic key generation (HD) after BIP32. Only has "
+"effect during wallet creation/first start"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: "
"%s)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -161,22 +186,19 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is "
"included in share/rpcuser. This option can be specified multiple times"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"WARNING: abnormally high number of blocks generated, %d blocks received in "
-"the last %d hours (%d expected)"),
-QT_TRANSLATE_NOOP("bitcoin-core", ""
-"WARNING: check your network connection, %d blocks received in the last %d "
-"hours (%d expected)"),
-QT_TRANSLATE_NOOP("bitcoin-core", ""
"Warning: The network does not appear to fully agree! Some miners appear to "
"be experiencing issues."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Warning: Unknown block versions being mined! It's possible unknown rules are "
+"in effect"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; "
+"if your balance or transactions are incorrect you should restore from a "
+"backup."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Warning: We do not appear to fully agree with our peers! You may need to "
"upgrade, or other nodes may need to upgrade."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"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."),
-QT_TRANSLATE_NOOP("bitcoin-core", ""
"Whitelist peers connecting from the given netmask or IP address. Can be "
"specified multiple times."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -185,6 +207,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
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", ""
+"You need to rebuild the database using -reindex-chainstate to change -txindex"),
+QT_TRANSLATE_NOOP("bitcoin-core", "%s corrupt, salvage failed"),
QT_TRANSLATE_NOOP("bitcoin-core", "(default: %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "(default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "-maxmempool must be at least %d MB"),
@@ -192,24 +217,22 @@ 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", "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", "Always query for peer addresses via DNS lookup (default: %u)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Always relay transactions received from whitelisted peers (default: %d)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to recover private keys from a corrupt wallet.dat on startup"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Append comment to the user agent string"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to recover private keys from a corrupt wallet on startup"),
QT_TRANSLATE_NOOP("bitcoin-core", "Automatically create Tor hidden service (default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Block creation options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot downgrade wallet"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -bind address: '%s'"),
-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 resolve -%s address: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot write default address"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Change index out of range"),
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"),
QT_TRANSLATE_NOOP("bitcoin-core", "Connection options:"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Copyright (C) 2009-%i The Bitcoin Core Developers"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Copyright (C) %i-%i"),
QT_TRANSLATE_NOOP("bitcoin-core", "Corrupted block database detected"),
QT_TRANSLATE_NOOP("bitcoin-core", "Debugging/Testing options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Do not load the wallet and disable wallet RPC calls"),
@@ -219,12 +242,14 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Enable publish hash block in <address>"),
QT_TRANSLATE_NOOP("bitcoin-core", "Enable publish hash transaction in <address>"),
QT_TRANSLATE_NOOP("bitcoin-core", "Enable publish raw block in <address>"),
QT_TRANSLATE_NOOP("bitcoin-core", "Enable publish raw transaction in <address>"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Enable transaction replacement in the memory pool (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing block database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing wallet database environment %s!"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error loading %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error loading %s: Wallet corrupted"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error loading %s: Wallet requires newer version of %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error loading %s: You can't disable HD on a already existing HD wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error loading block database"),
-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"),
@@ -232,34 +257,34 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error: A fatal internal error occurred, see d
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Disk space is low!"),
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 %s/kB) to add to transactions you send (default: %s)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Generate coins (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "How many blocks to check at startup (default: %u, 0 = all)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Importing..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Imports blocks from external blk000??.dat file on startup"),
QT_TRANSLATE_NOOP("bitcoin-core", "Include IP addresses in debug output (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Incorrect or no genesis block found. Wrong datadir for network?"),
QT_TRANSLATE_NOOP("bitcoin-core", "Information"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Initialization sanity check failed. Bitcoin Core is shutting down."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Initialization sanity check failed. %s is shutting down."),
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 -%s=<amount>: '%s'"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -fallbackfee=<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 netmask specified in -whitelist: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Keep at most <n> unconnectable transactions in memory (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Keep the transaction memory pool below <n> megabytes (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Listen for connections on <port> (default: %u or testnet: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading addresses..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Loading banlist..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading block index..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading wallet..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Location of the auth cookie (default: data dir)"),
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", "Minimum bytes per sigop in transactions we relay and mine (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Need to specify a port with -whitebind: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Node relay options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Not enough file descriptors available."),
@@ -267,24 +292,27 @@ 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 this help message and exit"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Print version and exit"),
QT_TRANSLATE_NOOP("bitcoin-core", "Prune cannot be configured with a negative value."),
QT_TRANSLATE_NOOP("bitcoin-core", "Prune mode is incompatible with -txindex."),
QT_TRANSLATE_NOOP("bitcoin-core", "Pruning blockstore..."),
QT_TRANSLATE_NOOP("bitcoin-core", "RPC server options:"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Rebuild block chain index from current blk000??.dat files on startup"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Receive and display P2P network alerts (default: %u)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Rebuild chain state and block index from the blk*.dat files on disk"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Rebuild chain state from the currently indexed blocks"),
QT_TRANSLATE_NOOP("bitcoin-core", "Reducing -maxconnections from %d to %d, because of system limitations."),
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 on startup"),
QT_TRANSLATE_NOOP("bitcoin-core", "Rescanning..."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Rewinding blocks..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Run in the background as a daemon and accept commands"),
QT_TRANSLATE_NOOP("bitcoin-core", "Send trace/debug info to console instead of debug.log file"),
QT_TRANSLATE_NOOP("bitcoin-core", "Send transactions as zero-fee transactions if possible (default: %u)"),
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 maximum BIP141 block cost (default: %d)"),
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", "Show all debugging options (usage: --help -help-debug)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Shrink debug.log file on client startup (default: 1 when no -debug)"),
@@ -296,8 +324,8 @@ 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", "The source code is available from %s."),
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", "Threshold for disconnecting misbehaving peers (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Tor control port password (default: empty)"),
@@ -307,6 +335,7 @@ 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", "Unable to bind to %s on this computer (bind returned error %s)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer. %s is probably already running."),
QT_TRANSLATE_NOOP("bitcoin-core", "Unable to start HTTP server. See debug log for details."),
QT_TRANSLATE_NOOP("bitcoin-core", "Unknown network specified in -onlynet: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Unsupported argument -benchmark ignored, use -debug=bench."),
@@ -319,13 +348,12 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Username for JSON-RPC connections"),
QT_TRANSLATE_NOOP("bitcoin-core", "Verifying blocks..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Verifying wallet..."),
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 debugging/testing options:"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Wallet needed to be rewritten: restart %s 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: unknown new rules activated (versionbit %i)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Whether to operate in a blocks only mode (default: %u)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "You need to rebuild the database using -reindex to change -txindex"),
QT_TRANSLATE_NOOP("bitcoin-core", "Zapping all transactions from wallet..."),
QT_TRANSLATE_NOOP("bitcoin-core", "ZeroMQ notification options:"),
-QT_TRANSLATE_NOOP("bitcoin-core", "wallet.dat corrupt, salvage failed"),
};
diff --git a/src/qt/bitcoinunits.cpp b/src/qt/bitcoinunits.cpp
index 425b45d918..6490057897 100644
--- a/src/qt/bitcoinunits.cpp
+++ b/src/qt/bitcoinunits.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -111,13 +111,6 @@ QString BitcoinUnits::format(int unit, const CAmount& nIn, bool fPlus, Separator
}
-// TODO: Review all remaining calls to BitcoinUnits::formatWithUnit to
-// TODO: determine whether the output is used in a plain text context
-// TODO: or an HTML context (and replace with
-// TODO: BtcoinUnits::formatHtmlWithUnit in the latter case). Hopefully
-// TODO: there aren't instances where the result could be used in
-// TODO: either context.
-
// NOTE: Using formatWithUnit in an HTML context risks wrapping
// quantities at the thousands separator. More subtly, it also results
// in a standard space rather than a thin space, due to a bug in Qt's
diff --git a/src/qt/bitcoinunits.h b/src/qt/bitcoinunits.h
index 1871c33a78..fda067b0b8 100644
--- a/src/qt/bitcoinunits.h
+++ b/src/qt/bitcoinunits.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -88,6 +88,7 @@ public:
static QString format(int unit, const CAmount& amount, bool plussign=false, SeparatorStyle separators=separatorStandard);
//! Format as string (with unit)
static QString formatWithUnit(int unit, const CAmount& amount, bool plussign=false, SeparatorStyle separators=separatorStandard);
+ //! Format as HTML string (with unit)
static QString formatHtmlWithUnit(int unit, const CAmount& amount, bool plussign=false, SeparatorStyle separators=separatorStandard);
//! Parse string to coin amount
static bool parse(int unit, const QString &value, CAmount *val_out);
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index 1271187420..87704c641d 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -8,7 +8,6 @@
#include "guiconstants.h"
#include "peertablemodel.h"
-#include "alert.h"
#include "chainparams.h"
#include "checkpoints.h"
#include "clientversion.h"
@@ -25,11 +24,12 @@
class CBlockIndex;
static const int64_t nClientStartupTime = GetTime();
+static int64_t nLastHeaderTipUpdateNotification = 0;
static int64_t nLastBlockTipUpdateNotification = 0;
-ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) :
+ClientModel::ClientModel(OptionsModel *_optionsModel, QObject *parent) :
QObject(parent),
- optionsModel(optionsModel),
+ optionsModel(_optionsModel),
peerTableModel(0),
banTableModel(0),
pollTimer(0)
@@ -50,16 +50,18 @@ ClientModel::~ClientModel()
int ClientModel::getNumConnections(unsigned int flags) const
{
- LOCK(cs_vNodes);
- if (flags == CONNECTIONS_ALL) // Shortcut if we want total
- return vNodes.size();
+ CConnman::NumConnections connections = CConnman::CONNECTIONS_NONE;
- int nNum = 0;
- BOOST_FOREACH(const CNode* pnode, vNodes)
- if (flags & (pnode->fInbound ? CONNECTIONS_IN : CONNECTIONS_OUT))
- nNum++;
+ if(flags == CONNECTIONS_IN)
+ connections = CConnman::CONNECTIONS_IN;
+ else if (flags == CONNECTIONS_OUT)
+ connections = CConnman::CONNECTIONS_OUT;
+ else if (flags == CONNECTIONS_ALL)
+ connections = CConnman::CONNECTIONS_ALL;
- return nNum;
+ if(g_connman)
+ return g_connman->GetNodeCount(connections);
+ return 0;
}
int ClientModel::getNumBlocks() const
@@ -68,14 +70,34 @@ int ClientModel::getNumBlocks() const
return chainActive.Height();
}
+int ClientModel::getHeaderTipHeight() const
+{
+ LOCK(cs_main);
+ if (!pindexBestHeader)
+ return 0;
+ return pindexBestHeader->nHeight;
+}
+
+int64_t ClientModel::getHeaderTipTime() const
+{
+ LOCK(cs_main);
+ if (!pindexBestHeader)
+ return 0;
+ return pindexBestHeader->GetBlockTime();
+}
+
quint64 ClientModel::getTotalBytesRecv() const
{
- return CNode::GetTotalBytesRecv();
+ if(!g_connman)
+ return 0;
+ return g_connman->GetTotalBytesRecv();
}
quint64 ClientModel::getTotalBytesSent() const
{
- return CNode::GetTotalBytesSent();
+ if(!g_connman)
+ return 0;
+ return g_connman->GetTotalBytesSent();
}
QDateTime ClientModel::getLastBlockDate() const
@@ -112,7 +134,7 @@ double ClientModel::getVerificationProgress(const CBlockIndex *tipIn) const
void ClientModel::updateTimer()
{
// no locking required at this point
- // the following calls will aquire the required lock
+ // the following calls will acquire the required lock
Q_EMIT mempoolSizeChanged(getMempoolSize(), getMempoolDynamicUsage());
Q_EMIT bytesChanged(getTotalBytesRecv(), getTotalBytesSent());
}
@@ -122,20 +144,8 @@ void ClientModel::updateNumConnections(int numConnections)
Q_EMIT numConnectionsChanged(numConnections);
}
-void ClientModel::updateAlert(const QString &hash, int status)
+void ClientModel::updateAlert()
{
- // Show error message notification for new alert
- if(status == CT_NEW)
- {
- uint256 hash_256;
- hash_256.SetHex(hash.toStdString());
- CAlert alert = CAlert::getAlertByHash(hash_256);
- if(!alert.IsNull())
- {
- Q_EMIT message(tr("Network Alert"), QString::fromStdString(alert.strStatusBar), CClientUIInterface::ICON_ERROR);
- }
- }
-
Q_EMIT alertsChanged(getStatusBarWarnings());
}
@@ -186,24 +196,19 @@ QString ClientModel::formatSubVersion() const
return QString::fromStdString(strSubVersion);
}
-QString ClientModel::formatBuildDate() const
-{
- return QString::fromStdString(CLIENT_DATE);
-}
-
bool ClientModel::isReleaseVersion() const
{
return CLIENT_VERSION_IS_RELEASE;
}
-QString ClientModel::clientName() const
+QString ClientModel::formatClientStartupTime() const
{
- return QString::fromStdString(CLIENT_NAME);
+ return QDateTime::fromTime_t(nClientStartupTime).toString();
}
-QString ClientModel::formatClientStartupTime() const
+QString ClientModel::dataDir() const
{
- return QDateTime::fromTime_t(nClientStartupTime).toString();
+ return QString::fromStdString(GetDataDir().string());
}
void ClientModel::updateBanlist()
@@ -227,12 +232,10 @@ static void NotifyNumConnectionsChanged(ClientModel *clientmodel, int newNumConn
Q_ARG(int, newNumConnections));
}
-static void NotifyAlertChanged(ClientModel *clientmodel, const uint256 &hash, ChangeType status)
+static void NotifyAlertChanged(ClientModel *clientmodel)
{
- qDebug() << "NotifyAlertChanged: " + QString::fromStdString(hash.GetHex()) + " status=" + QString::number(status);
- QMetaObject::invokeMethod(clientmodel, "updateAlert", Qt::QueuedConnection,
- Q_ARG(QString, QString::fromStdString(hash.GetHex())),
- Q_ARG(int, status));
+ qDebug() << "NotifyAlertChanged";
+ QMetaObject::invokeMethod(clientmodel, "updateAlert", Qt::QueuedConnection);
}
static void BannedListChanged(ClientModel *clientmodel)
@@ -241,7 +244,7 @@ static void BannedListChanged(ClientModel *clientmodel)
QMetaObject::invokeMethod(clientmodel, "updateBanlist", Qt::QueuedConnection);
}
-static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CBlockIndex *pIndex)
+static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CBlockIndex *pIndex, bool fHeader)
{
// lock free async UI updates in case we have a new block tip
// during initial sync, only update the UI if the last update
@@ -250,14 +253,17 @@ static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CB
if (initialSync)
now = GetTimeMillis();
+ int64_t& nLastUpdateNotification = fHeader ? nLastHeaderTipUpdateNotification : nLastBlockTipUpdateNotification;
+
// if we are in-sync, update the UI regardless of last update time
- if (!initialSync || now - nLastBlockTipUpdateNotification > MODEL_UPDATE_DELAY) {
+ if (!initialSync || now - nLastUpdateNotification > MODEL_UPDATE_DELAY) {
//pass a async signal to the UI thread
QMetaObject::invokeMethod(clientmodel, "numBlocksChanged", Qt::QueuedConnection,
Q_ARG(int, pIndex->nHeight),
Q_ARG(QDateTime, QDateTime::fromTime_t(pIndex->GetBlockTime())),
- Q_ARG(double, clientmodel->getVerificationProgress(pIndex)));
- nLastBlockTipUpdateNotification = now;
+ Q_ARG(double, clientmodel->getVerificationProgress(pIndex)),
+ Q_ARG(bool, fHeader));
+ nLastUpdateNotification = now;
}
}
@@ -266,9 +272,10 @@ void ClientModel::subscribeToCoreSignals()
// Connect signals to client
uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2));
uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, _1));
- uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this, _1, _2));
+ uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this));
uiInterface.BannedListChanged.connect(boost::bind(BannedListChanged, this));
- uiInterface.NotifyBlockTip.connect(boost::bind(BlockTipChanged, this, _1, _2));
+ uiInterface.NotifyBlockTip.connect(boost::bind(BlockTipChanged, this, _1, _2, false));
+ uiInterface.NotifyHeaderTip.connect(boost::bind(BlockTipChanged, this, _1, _2, true));
}
void ClientModel::unsubscribeFromCoreSignals()
@@ -276,7 +283,8 @@ void ClientModel::unsubscribeFromCoreSignals()
// Disconnect signals from client
uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, _1));
- uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this, _1, _2));
+ uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this));
uiInterface.BannedListChanged.disconnect(boost::bind(BannedListChanged, this));
- uiInterface.NotifyBlockTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2));
+ uiInterface.NotifyBlockTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2, false));
+ uiInterface.NotifyHeaderTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2, true));
}
diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h
index 2d204fdb67..3fd8404cbb 100644
--- a/src/qt/clientmodel.h
+++ b/src/qt/clientmodel.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -51,7 +51,8 @@ public:
//! Return number of connections, default is in- and outbound (total)
int getNumConnections(unsigned int flags = CONNECTIONS_ALL) const;
int getNumBlocks() const;
-
+ int getHeaderTipHeight() const;
+ int64_t getHeaderTipTime() const;
//! Return number of transactions in the mempool
long getMempoolSize() const;
//! Return the dynamic memory usage of the mempool
@@ -72,10 +73,9 @@ public:
QString formatFullVersion() const;
QString formatSubVersion() const;
- QString formatBuildDate() const;
bool isReleaseVersion() const;
- QString clientName() const;
QString formatClientStartupTime() const;
+ QString dataDir() const;
private:
OptionsModel *optionsModel;
@@ -89,7 +89,7 @@ private:
Q_SIGNALS:
void numConnectionsChanged(int count);
- void numBlocksChanged(int count, const QDateTime& blockDate, double nVerificationProgress);
+ void numBlocksChanged(int count, const QDateTime& blockDate, double nVerificationProgress, bool header);
void mempoolSizeChanged(long count, size_t mempoolSizeInBytes);
void alertsChanged(const QString &warnings);
void bytesChanged(quint64 totalBytesIn, quint64 totalBytesOut);
@@ -103,7 +103,7 @@ Q_SIGNALS:
public Q_SLOTS:
void updateTimer();
void updateNumConnections(int numConnections);
- void updateAlert(const QString &hash, int status);
+ void updateAlert();
void updateBanlist();
};
diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp
index 0f42243047..86fd4ebd65 100644
--- a/src/qt/coincontroldialog.cpp
+++ b/src/qt/coincontroldialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -35,11 +35,11 @@ QList<CAmount> CoinControlDialog::payAmounts;
CCoinControl* CoinControlDialog::coinControl = new CCoinControl();
bool CoinControlDialog::fSubtractFeeFromAmount = false;
-CoinControlDialog::CoinControlDialog(const PlatformStyle *platformStyle, QWidget *parent) :
+CoinControlDialog::CoinControlDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
QDialog(parent),
ui(new Ui::CoinControlDialog),
model(0),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
ui->setupUi(this);
@@ -76,7 +76,6 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *platformStyle, QWidget
QAction *clipboardFeeAction = new QAction(tr("Copy fee"), this);
QAction *clipboardAfterFeeAction = new QAction(tr("Copy after fee"), this);
QAction *clipboardBytesAction = new QAction(tr("Copy bytes"), this);
- QAction *clipboardPriorityAction = new QAction(tr("Copy priority"), this);
QAction *clipboardLowOutputAction = new QAction(tr("Copy dust"), this);
QAction *clipboardChangeAction = new QAction(tr("Copy change"), this);
@@ -85,7 +84,6 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *platformStyle, QWidget
connect(clipboardFeeAction, SIGNAL(triggered()), this, SLOT(clipboardFee()));
connect(clipboardAfterFeeAction, SIGNAL(triggered()), this, SLOT(clipboardAfterFee()));
connect(clipboardBytesAction, SIGNAL(triggered()), this, SLOT(clipboardBytes()));
- connect(clipboardPriorityAction, SIGNAL(triggered()), this, SLOT(clipboardPriority()));
connect(clipboardLowOutputAction, SIGNAL(triggered()), this, SLOT(clipboardLowOutput()));
connect(clipboardChangeAction, SIGNAL(triggered()), this, SLOT(clipboardChange()));
@@ -94,7 +92,6 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *platformStyle, QWidget
ui->labelCoinControlFee->addAction(clipboardFeeAction);
ui->labelCoinControlAfterFee->addAction(clipboardAfterFeeAction);
ui->labelCoinControlBytes->addAction(clipboardBytesAction);
- ui->labelCoinControlPriority->addAction(clipboardPriorityAction);
ui->labelCoinControlLowOutput->addAction(clipboardLowOutputAction);
ui->labelCoinControlChange->addAction(clipboardChangeAction);
@@ -124,16 +121,14 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *platformStyle, QWidget
ui->treeWidget->headerItem()->setText(COLUMN_CHECKBOX, QString());
ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, 84);
- ui->treeWidget->setColumnWidth(COLUMN_AMOUNT, 100);
- ui->treeWidget->setColumnWidth(COLUMN_LABEL, 170);
- ui->treeWidget->setColumnWidth(COLUMN_ADDRESS, 290);
- 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 don't show it
+ ui->treeWidget->setColumnWidth(COLUMN_AMOUNT, 110);
+ ui->treeWidget->setColumnWidth(COLUMN_LABEL, 190);
+ ui->treeWidget->setColumnWidth(COLUMN_ADDRESS, 320);
+ ui->treeWidget->setColumnWidth(COLUMN_DATE, 130);
+ ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 110);
+ ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transaction 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
@@ -157,15 +152,15 @@ CoinControlDialog::~CoinControlDialog()
delete ui;
}
-void CoinControlDialog::setModel(WalletModel *model)
+void CoinControlDialog::setModel(WalletModel *_model)
{
- this->model = model;
+ this->model = _model;
- if(model && model->getOptionsModel() && model->getAddressTableModel())
+ if(_model && _model->getOptionsModel() && _model->getAddressTableModel())
{
updateView();
updateLabelLocked();
- CoinControlDialog::updateLabels(model, this);
+ CoinControlDialog::updateLabels(_model, this);
}
}
@@ -325,12 +320,6 @@ void CoinControlDialog::clipboardBytes()
GUIUtil::setClipboard(ui->labelCoinControlBytes->text().replace(ASYMP_UTF8, ""));
}
-// copy label "Priority" to clipboard
-void CoinControlDialog::clipboardPriority()
-{
- GUIUtil::setClipboard(ui->labelCoinControlPriority->text());
-}
-
// copy label "Dust" to clipboard
void CoinControlDialog::clipboardLowOutput()
{
@@ -408,10 +397,8 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column)
CoinControlDialog::updateLabels(model, this);
}
- // todo: this is a temporary qt5 fix: when clicking a parent node in tree mode, the parent node
- // 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.
+ // TODO: Remove this temporary qt5 fix after Qt5.3 and Qt5.4 are no longer used.
+ // Fixed in Qt5.5 and above: https://bugreports.qt.io/browse/QTBUG-43473
#if QT_VERSION >= 0x050000
else if (column == COLUMN_CHECKBOX && item->childCount() > 0)
{
@@ -421,25 +408,6 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column)
#endif
}
-// return human readable label for priority number
-QString CoinControlDialog::getPriorityLabel(double dPriority, double mempoolEstimatePriority)
-{
- double dPriorityMedium = mempoolEstimatePriority;
-
- if (dPriorityMedium <= 0)
- dPriorityMedium = AllowFreeThreshold(); // not enough data, back to hard-coded
-
- if (dPriority / 1000000 > dPriorityMedium) return tr("highest");
- else if (dPriority / 100000 > dPriorityMedium) return tr("higher");
- else if (dPriority / 10000 > dPriorityMedium) return tr("high");
- else if (dPriority / 1000 > dPriorityMedium) return tr("medium-high");
- else if (dPriority > dPriorityMedium) return tr("medium");
- else if (dPriority * 10 > dPriorityMedium) return tr("low-medium");
- else if (dPriority * 100 > dPriorityMedium) return tr("low");
- else if (dPriority * 1000 > dPriorityMedium) return tr("lower");
- else return tr("lowest");
-}
-
// shows count of locked unspent outputs
void CoinControlDialog::updateLabelLocked()
{
@@ -475,7 +443,6 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
}
}
- QString sPriorityLabel = tr("none");
CAmount nAmount = 0;
CAmount nPayFee = 0;
CAmount nAfterFee = 0;
@@ -487,6 +454,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
unsigned int nQuantity = 0;
int nQuantityUncompressed = 0;
bool fAllowFree = false;
+ bool fWitness = false;
std::vector<COutPoint> vCoinControl;
std::vector<COutput> vOutputs;
@@ -515,7 +483,14 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
// Bytes
CTxDestination address;
- if(ExtractDestination(out.tx->vout[out.i].scriptPubKey, address))
+ int witnessversion = 0;
+ std::vector<unsigned char> witnessprogram;
+ if (out.tx->vout[out.i].scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram))
+ {
+ nBytesInputs += (32 + 4 + 1 + (107 / WITNESS_SCALE_FACTOR) + 4);
+ fWitness = true;
+ }
+ else if(ExtractDestination(out.tx->vout[out.i].scriptPubKey, address))
{
CPubKey pubkey;
CKeyID *keyid = boost::get<CKeyID>(&address);
@@ -536,11 +511,14 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
{
// Bytes
nBytes = nBytesInputs + ((CoinControlDialog::payAmounts.size() > 0 ? CoinControlDialog::payAmounts.size() + 1 : 2) * 34) + 10; // always assume +1 output for change here
-
- // Priority
- double mempoolEstimatePriority = mempool.estimateSmartPriority(nTxConfirmTarget);
- dPriority = dPriorityInputs / (nBytes - nBytesInputs + (nQuantityUncompressed * 29)); // 29 = 180 - 151 (uncompressed public keys are over the limit. max 151 bytes of the input are ignored for priority)
- sPriorityLabel = CoinControlDialog::getPriorityLabel(dPriority, mempoolEstimatePriority);
+ if (fWitness)
+ {
+ // there is some fudging in these numbers related to the actual virtual transaction size calculation that will keep this estimate from being exact.
+ // usually, the result will be an overestimate within a couple of satoshis so that the confirmation dialog ends up displaying a slightly smaller fee.
+ // also, the witness stack size value value is a variable sized integer. usually, the number of stack items will be well under the single byte var int limit.
+ nBytes += 2; // account for the serialized marker and flag bytes
+ nBytes += nQuantity; // account for the witness byte that holds the number of stack items for each input.
+ }
// in the subtract fee from amount case, we can tell if zero change already and subtract the bytes, so that fee calculation afterwards is accurate
if (CoinControlDialog::fSubtractFeeFromAmount)
@@ -554,6 +532,8 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
// Allow free? (require at least hard-coded threshold and default to that if no estimate)
+ double mempoolEstimatePriority = mempool.estimateSmartPriority(nTxConfirmTarget);
+ dPriority = dPriorityInputs / (nBytes - nBytesInputs + (nQuantityUncompressed * 29)); // 29 = 180 - 151 (uncompressed public keys are over the limit. max 151 bytes of the input are ignored for priority)
double dPriorityNeeded = std::max(mempoolEstimatePriority, AllowFreeThreshold());
fAllowFree = (dPriority >= dPriorityNeeded);
@@ -603,7 +583,6 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
QLabel *l3 = dialog->findChild<QLabel *>("labelCoinControlFee");
QLabel *l4 = dialog->findChild<QLabel *>("labelCoinControlAfterFee");
QLabel *l5 = dialog->findChild<QLabel *>("labelCoinControlBytes");
- QLabel *l6 = dialog->findChild<QLabel *>("labelCoinControlPriority");
QLabel *l7 = dialog->findChild<QLabel *>("labelCoinControlLowOutput");
QLabel *l8 = dialog->findChild<QLabel *>("labelCoinControlChange");
@@ -619,7 +598,6 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
l3->setText(BitcoinUnits::formatWithUnit(nDisplayUnit, nPayFee)); // Fee
l4->setText(BitcoinUnits::formatWithUnit(nDisplayUnit, nAfterFee)); // After Fee
l5->setText(((nBytes > 0) ? ASYMP_UTF8 : "") + QString::number(nBytes)); // Bytes
- l6->setText(sPriorityLabel); // Priority
l7->setText(fDust ? tr("yes") : tr("no")); // Dust
l8->setText(BitcoinUnits::formatWithUnit(nDisplayUnit, nChange)); // Change
if (nPayFee > 0 && (coinControl->nMinimumTotalFee < nPayFee))
@@ -630,21 +608,11 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
l8->setText(ASYMP_UTF8 + l8->text());
}
- // turn labels "red"
- l5->setStyleSheet((nBytes >= MAX_FREE_TRANSACTION_CREATE_SIZE) ? "color:red;" : "");// Bytes >= 1000
- l6->setStyleSheet((dPriority > 0 && !fAllowFree) ? "color:red;" : ""); // Priority < "medium"
- l7->setStyleSheet((fDust) ? "color:red;" : ""); // Dust = "yes"
+ // turn label red when dust
+ l7->setStyleSheet((fDust) ? "color:red;" : "");
// tool tips
- 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::GetRequiredFee(1000))) + "<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 means a fee of at least %1 per kB is required.").arg(BitcoinUnits::formatWithUnit(nDisplayUnit, CWallet::GetRequiredFee(1000)));
-
- QString toolTip3 = tr("This label turns red if any recipient receives an amount smaller than %1.").arg(BitcoinUnits::formatWithUnit(nDisplayUnit, ::minRelayTxFee.GetFee(546)));
+ QString toolTipDust = tr("This label turns red if any recipient receives an amount smaller than the current dust threshold.");
// how many satoshis the estimated fee can vary per byte we guess wrong
double dFeeVary;
@@ -657,14 +625,11 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
l3->setToolTip(toolTip4);
l4->setToolTip(toolTip4);
- l5->setToolTip(toolTip1);
- l6->setToolTip(toolTip2);
- l7->setToolTip(toolTip3);
+ l7->setToolTip(toolTipDust);
l8->setToolTip(toolTip4);
dialog->findChild<QLabel *>("labelCoinControlFeeText") ->setToolTip(l3->toolTip());
dialog->findChild<QLabel *>("labelCoinControlAfterFeeText") ->setToolTip(l4->toolTip());
dialog->findChild<QLabel *>("labelCoinControlBytesText") ->setToolTip(l5->toolTip());
- dialog->findChild<QLabel *>("labelCoinControlPriorityText") ->setToolTip(l6->toolTip());
dialog->findChild<QLabel *>("labelCoinControlLowOutputText")->setToolTip(l7->toolTip());
dialog->findChild<QLabel *>("labelCoinControlChangeText") ->setToolTip(l8->toolTip());
@@ -688,7 +653,6 @@ void CoinControlDialog::updateView()
QFlags<Qt::ItemFlag> flgTristate = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsTristate;
int nDisplayUnit = model->getOptionsModel()->getDisplayUnit();
- double mempoolEstimatePriority = mempool.estimateSmartPriority(nTxConfirmTarget);
std::map<QString, std::vector<COutput> > mapCoins;
model->listCoins(mapCoins);
@@ -717,11 +681,8 @@ void CoinControlDialog::updateView()
}
CAmount nSum = 0;
- double dPrioritySum = 0;
int nChildren = 0;
- int nInputSum = 0;
BOOST_FOREACH(const COutput& out, coins.second) {
- int nInputSize = 0;
nSum += out.tx->vout[out.i].nValue;
nChildren++;
@@ -741,11 +702,6 @@ void CoinControlDialog::updateView()
// if listMode or change => show bitcoin address. In tree mode, address is not shown again for direct wallet address outputs
if (!treeMode || (!(sAddress == sWalletAddress)))
itemOutput->setText(COLUMN_ADDRESS, sAddress);
-
- CPubKey pubkey;
- CKeyID *keyid = boost::get<CKeyID>(&outputAddress);
- if (keyid && model->getPubKey(*keyid, pubkey) && !pubkey.IsCompressed())
- nInputSize = 29; // 29 = 180 - 151 (public key is 180 bytes, priority free area is 151 bytes)
}
// label
@@ -774,13 +730,6 @@ void CoinControlDialog::updateView()
// confirmations
itemOutput->setText(COLUMN_CONFIRMATIONS, strPad(QString::number(out.nDepth), 8, " "));
- // priority
- double dPriority = ((double)out.tx->vout[out.i].nValue / (nInputSize + 78)) * (out.nDepth+1); // 78 = 2 * 34 + 10
- itemOutput->setText(COLUMN_PRIORITY, CoinControlDialog::getPriorityLabel(dPriority, mempoolEstimatePriority));
- itemOutput->setText(COLUMN_PRIORITY_INT64, strPad(QString::number((int64_t)dPriority), 20, " "));
- dPrioritySum += (double)out.tx->vout[out.i].nValue * (out.nDepth+1);
- nInputSum += nInputSize;
-
// transaction hash
uint256 txhash = out.tx->GetHash();
itemOutput->setText(COLUMN_TXHASH, QString::fromStdString(txhash.GetHex()));
@@ -798,19 +747,16 @@ void CoinControlDialog::updateView()
}
// set checkbox
- if (coinControl->IsSelected(txhash, out.i))
+ if (coinControl->IsSelected(COutPoint(txhash, out.i)))
itemOutput->setCheckState(COLUMN_CHECKBOX, Qt::Checked);
}
// amount
if (treeMode)
{
- dPrioritySum = dPrioritySum / (nInputSum + 78);
itemWalletAddress->setText(COLUMN_CHECKBOX, "(" + QString::number(nChildren) + ")");
itemWalletAddress->setText(COLUMN_AMOUNT, BitcoinUnits::format(nDisplayUnit, nSum));
itemWalletAddress->setText(COLUMN_AMOUNT_INT64, strPad(QString::number(nSum), 15, " "));
- itemWalletAddress->setText(COLUMN_PRIORITY, CoinControlDialog::getPriorityLabel(dPrioritySum, mempoolEstimatePriority));
- itemWalletAddress->setText(COLUMN_PRIORITY_INT64, strPad(QString::number((int64_t)dPrioritySum), 20, " "));
}
}
diff --git a/src/qt/coincontroldialog.h b/src/qt/coincontroldialog.h
index 8ff1eac709..7d73421e3a 100644
--- a/src/qt/coincontroldialog.h
+++ b/src/qt/coincontroldialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -40,7 +40,6 @@ public:
// static because also called from sendcoinsdialog
static void updateLabels(WalletModel*, QDialog*);
- static QString getPriorityLabel(double dPriority, double mempoolEstimatePriority);
static QList<CAmount> payAmounts;
static CCoinControl *coinControl;
@@ -72,11 +71,9 @@ private:
COLUMN_ADDRESS,
COLUMN_DATE,
COLUMN_CONFIRMATIONS,
- COLUMN_PRIORITY,
COLUMN_TXHASH,
COLUMN_VOUT_INDEX,
COLUMN_AMOUNT_INT64,
- COLUMN_PRIORITY_INT64,
COLUMN_DATE_INT64
};
@@ -87,8 +84,6 @@ private:
{
if (column == COLUMN_AMOUNT_INT64)
return COLUMN_AMOUNT;
- else if (column == COLUMN_PRIORITY_INT64)
- return COLUMN_PRIORITY;
else if (column == COLUMN_DATE_INT64)
return COLUMN_DATE;
}
@@ -96,8 +91,6 @@ private:
{
if (column == COLUMN_AMOUNT)
return COLUMN_AMOUNT_INT64;
- else if (column == COLUMN_PRIORITY)
- return COLUMN_PRIORITY_INT64;
else if (column == COLUMN_DATE)
return COLUMN_DATE_INT64;
}
@@ -118,7 +111,6 @@ private Q_SLOTS:
void clipboardFee();
void clipboardAfterFee();
void clipboardBytes();
- void clipboardPriority();
void clipboardLowOutput();
void clipboardChange();
void radioTreeMode(bool);
diff --git a/src/qt/coincontroltreewidget.cpp b/src/qt/coincontroltreewidget.cpp
index 5dcbf0c3f1..f86bc0851f 100644
--- a/src/qt/coincontroltreewidget.cpp
+++ b/src/qt/coincontroltreewidget.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/coincontroltreewidget.h b/src/qt/coincontroltreewidget.h
index 98a7d32f05..62645fcdb0 100644
--- a/src/qt/coincontroltreewidget.h
+++ b/src/qt/coincontroltreewidget.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
diff --git a/src/qt/csvmodelwriter.cpp b/src/qt/csvmodelwriter.cpp
index 55c5957088..f424e6cd98 100644
--- a/src/qt/csvmodelwriter.cpp
+++ b/src/qt/csvmodelwriter.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
@@ -8,15 +8,15 @@
#include <QFile>
#include <QTextStream>
-CSVModelWriter::CSVModelWriter(const QString &filename, QObject *parent) :
+CSVModelWriter::CSVModelWriter(const QString &_filename, QObject *parent) :
QObject(parent),
- filename(filename), model(0)
+ filename(_filename), model(0)
{
}
-void CSVModelWriter::setModel(const QAbstractItemModel *model)
+void CSVModelWriter::setModel(const QAbstractItemModel *_model)
{
- this->model = model;
+ this->model = _model;
}
void CSVModelWriter::addColumn(const QString &title, int column, int role)
diff --git a/src/qt/csvmodelwriter.h b/src/qt/csvmodelwriter.h
index a2bf379f4e..edea369ad1 100644
--- a/src/qt/csvmodelwriter.h
+++ b/src/qt/csvmodelwriter.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
diff --git a/src/qt/editaddressdialog.cpp b/src/qt/editaddressdialog.cpp
index 1c22594cd7..a9ffe016fd 100644
--- a/src/qt/editaddressdialog.cpp
+++ b/src/qt/editaddressdialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
@@ -11,11 +11,11 @@
#include <QDataWidgetMapper>
#include <QMessageBox>
-EditAddressDialog::EditAddressDialog(Mode mode, QWidget *parent) :
+EditAddressDialog::EditAddressDialog(Mode _mode, QWidget *parent) :
QDialog(parent),
ui(new Ui::EditAddressDialog),
mapper(0),
- mode(mode),
+ mode(_mode),
model(0)
{
ui->setupUi(this);
@@ -49,13 +49,13 @@ EditAddressDialog::~EditAddressDialog()
delete ui;
}
-void EditAddressDialog::setModel(AddressTableModel *model)
+void EditAddressDialog::setModel(AddressTableModel *_model)
{
- this->model = model;
- if(!model)
+ this->model = _model;
+ if(!_model)
return;
- mapper->setModel(model);
+ mapper->setModel(_model);
mapper->addMapping(ui->labelEdit, AddressTableModel::Label);
mapper->addMapping(ui->addressEdit, AddressTableModel::Address);
}
@@ -137,8 +137,8 @@ QString EditAddressDialog::getAddress() const
return address;
}
-void EditAddressDialog::setAddress(const QString &address)
+void EditAddressDialog::setAddress(const QString &_address)
{
- this->address = address;
- ui->addressEdit->setText(address);
+ this->address = _address;
+ ui->addressEdit->setText(_address);
}
diff --git a/src/qt/editaddressdialog.h b/src/qt/editaddressdialog.h
index d59fce2d41..ddb67ece72 100644
--- a/src/qt/editaddressdialog.h
+++ b/src/qt/editaddressdialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/forms/coincontroldialog.ui b/src/qt/forms/coincontroldialog.ui
index c1fef6b9b1..1ea00eb5c3 100644
--- a/src/qt/forms/coincontroldialog.ui
+++ b/src/qt/forms/coincontroldialog.ui
@@ -140,7 +140,10 @@
</widget>
</item>
<item row="1" column="0">
- <widget class="QLabel" name="labelCoinControlPriorityText">
+ <widget class="QLabel" name="labelCoinControlLowOutputText">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="font">
<font>
<weight>75</weight>
@@ -148,12 +151,15 @@
</font>
</property>
<property name="text">
- <string>Priority:</string>
+ <string>Dust:</string>
</property>
</widget>
</item>
<item row="1" column="1">
- <widget class="QLabel" name="labelCoinControlPriority">
+ <widget class="QLabel" name="labelCoinControlLowOutput">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
</property>
@@ -161,7 +167,7 @@
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="text">
- <string notr="true">medium</string>
+ <string notr="true">no</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
@@ -213,41 +219,6 @@
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="labelCoinControlLowOutputText">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Dust:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="labelCoinControlLowOutput">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="cursor">
- <cursorShape>IBeamCursor</cursorShape>
- </property>
- <property name="contextMenuPolicy">
- <enum>Qt::ActionsContextMenu</enum>
- </property>
- <property name="text">
- <string notr="true">no</string>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
- </property>
- </widget>
- </item>
</layout>
</item>
<item>
@@ -431,7 +402,7 @@
<bool>false</bool>
</property>
<property name="columnCount">
- <number>12</number>
+ <number>10</number>
</property>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>true</bool>
@@ -474,16 +445,6 @@
</column>
<column>
<property name="text">
- <string>Priority</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string/>
- </property>
- </column>
- <column>
- <property name="text">
<string/>
</property>
</column>
diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui
index 2471470363..9dc641979e 100644
--- a/src/qt/forms/debugwindow.ui
+++ b/src/qt/forms/debugwindow.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>740</width>
- <height>450</height>
+ <height>430</height>
</rect>
</property>
<property name="windowTitle">
@@ -41,36 +41,13 @@
</widget>
</item>
<item row="1" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Client name</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1" colspan="2">
- <widget class="QLabel" name="clientName">
- <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="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Client version</string>
</property>
</widget>
</item>
- <item row="2" column="1" colspan="2">
+ <item row="1" column="1" colspan="2">
<widget class="QLabel" name="clientVersion">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -86,7 +63,7 @@
</property>
</widget>
</item>
- <item row="3" column="0">
+ <item row="2" column="0">
<widget class="QLabel" name="labelClientUserAgent">
<property name="text">
<string>User Agent</string>
@@ -96,7 +73,7 @@
</property>
</widget>
</item>
- <item row="3" column="1" colspan="2">
+ <item row="2" column="1" colspan="2">
<widget class="QLabel" name="clientUserAgent">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -112,33 +89,7 @@
</property>
</widget>
</item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_14">
- <property name="text">
- <string>Using OpenSSL version</string>
- </property>
- <property name="indent">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item row="4" column="1" colspan="2">
- <widget class="QLabel" name="openSSLVersion">
- <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="5" column="0">
+ <item row="3" column="0">
<widget class="QLabel" name="label_berkeleyDBVersion">
<property name="text">
<string>Using BerkeleyDB version</string>
@@ -148,7 +99,7 @@
</property>
</widget>
</item>
- <item row="5" column="1" colspan="2">
+ <item row="3" column="1" colspan="2">
<widget class="QLabel" name="berkeleyDBVersion">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -164,15 +115,15 @@
</property>
</widget>
</item>
- <item row="6" column="0">
+ <item row="4" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
- <string>Build date</string>
+ <string>Datadir</string>
</property>
</widget>
</item>
- <item row="6" column="1" colspan="2">
- <widget class="QLabel" name="buildDate">
+ <item row="4" column="1" colspan="2">
+ <widget class="QLabel" name="dataDir">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
</property>
@@ -182,19 +133,22 @@
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
- <item row="7" column="0">
+ <item row="5" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Startup time</string>
</property>
</widget>
</item>
- <item row="7" column="1" colspan="2">
+ <item row="5" column="1" colspan="2">
<widget class="QLabel" name="startupTime">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -210,14 +164,27 @@
</property>
</widget>
</item>
- <item row="9" column="0">
+ <item row="6" column="0">
+ <widget class="QLabel" name="labelNetwork">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Network</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
- <item row="9" column="1" colspan="2">
+ <item row="7" column="1" colspan="2">
<widget class="QLabel" name="networkName">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -233,14 +200,14 @@
</property>
</widget>
</item>
- <item row="10" column="0">
+ <item row="8" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Number of connections</string>
</property>
</widget>
</item>
- <item row="10" column="1" colspan="2">
+ <item row="8" column="1" colspan="2">
<widget class="QLabel" name="numberOfConnections">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -256,7 +223,7 @@
</property>
</widget>
</item>
- <item row="11" column="0">
+ <item row="9" column="0">
<widget class="QLabel" name="label_10">
<property name="font">
<font>
@@ -269,14 +236,14 @@
</property>
</widget>
</item>
- <item row="12" column="0">
+ <item row="10" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Current number of blocks</string>
</property>
</widget>
</item>
- <item row="12" column="1" colspan="2">
+ <item row="10" column="1" colspan="2">
<widget class="QLabel" name="numberOfBlocks">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -292,14 +259,14 @@
</property>
</widget>
</item>
- <item row="13" column="0">
+ <item row="11" column="0">
<widget class="QLabel" name="labelLastBlockTime">
<property name="text">
<string>Last block time</string>
</property>
</widget>
</item>
- <item row="13" column="1" colspan="2">
+ <item row="11" column="1" colspan="2">
<widget class="QLabel" name="lastBlockTime">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -315,7 +282,7 @@
</property>
</widget>
</item>
- <item row="14" column="0">
+ <item row="12" column="0">
<widget class="QLabel" name="labelMempoolTitle">
<property name="font">
<font>
@@ -328,14 +295,14 @@
</property>
</widget>
</item>
- <item row="15" column="0">
+ <item row="13" column="0">
<widget class="QLabel" name="labelNumberOfTransactions">
<property name="text">
<string>Current number of transactions</string>
</property>
</widget>
</item>
- <item row="15" column="1">
+ <item row="13" column="1">
<widget class="QLabel" name="mempoolNumberTxs">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -351,27 +318,14 @@
</property>
</widget>
</item>
- <item row="8" column="0">
- <widget class="QLabel" name="labelNetwork">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Network</string>
- </property>
- </widget>
- </item>
- <item row="16" column="0">
+ <item row="14" column="0">
<widget class="QLabel" name="labelMemoryUsage">
<property name="text">
<string>Memory usage</string>
</property>
</widget>
</item>
- <item row="16" column="1">
+ <item row="14" column="1">
<widget class="QLabel" name="mempoolSize">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -387,7 +341,7 @@
</property>
</widget>
</item>
- <item row="14" column="2" rowspan="3">
+ <item row="12" column="2" rowspan="3">
<layout class="QVBoxLayout" name="verticalLayoutDebugButton">
<property name="spacing">
<number>3</number>
@@ -415,7 +369,7 @@
<item>
<widget class="QPushButton" name="openDebugLogfileButton">
<property name="toolTip">
- <string>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</string>
+ <string>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</string>
</property>
<property name="text">
<string>&amp;Open</string>
@@ -427,7 +381,7 @@
</item>
</layout>
</item>
- <item row="18" column="0">
+ <item row="15" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -450,6 +404,125 @@
<property name="spacing">
<number>3</number>
</property>
+ <property name="bottomMargin">
+ <number>5</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="fontSmallerButton">
+ <property name="maximumSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="toolTip">
+ <string>Decrease font size</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/fontsmaller</normaloff>:/icons/fontsmaller</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="fontBiggerButton">
+ <property name="maximumSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Increase font size</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/fontbigger</normaloff>:/icons/fontbigger</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clearButton">
+ <property name="maximumSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Clear console</string>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/remove</normaloff>:/icons/remove</iconset>
+ </property>
+ <property name="shortcut">
+ <string notr="true">Ctrl+L</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
<item>
<widget class="QTextEdit" name="messagesWidget">
<property name="minimumSize">
@@ -470,44 +543,48 @@
</widget>
</item>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout">
+ <layout class="QHBoxLayout" name="horizontalLayoutPrompt">
<property name="spacing">
<number>3</number>
</property>
<item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string notr="true">&gt;</string>
+ <widget class="QPushButton" name="promptIcon">
+ <property name="enabled">
+ <bool>false</bool>
</property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="lineEdit"/>
- </item>
- <item>
- <widget class="QPushButton" name="clearButton">
<property name="maximumSize">
<size>
- <width>24</width>
+ <width>16</width>
<height>24</height>
</size>
</property>
- <property name="toolTip">
- <string>Clear console</string>
- </property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../bitcoin.qrc">
- <normaloff>:/icons/remove</normaloff>:/icons/remove</iconset>
+ <normaloff>:/icons/prompticon</normaloff>
+ <disabledoff>:/icons/prompticon</disabledoff>:/icons/prompticon</iconset>
</property>
- <property name="shortcut">
- <string notr="true">Ctrl+L</string>
+ <property name="iconSize">
+ <size>
+ <width>14</width>
+ <height>14</height>
+ </size>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEdit">
+ <property name="placeholderText">
+ <string/>
+ </property>
</widget>
</item>
</layout>
@@ -782,6 +859,9 @@
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
+ <property name="tabKeyNavigation">
+ <bool>false</bool>
+ </property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
@@ -843,6 +923,9 @@
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
+ <property name="tabKeyNavigation">
+ <bool>false</bool>
+ </property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
diff --git a/src/qt/forms/helpmessagedialog.ui b/src/qt/forms/helpmessagedialog.ui
index dc7df9d6c8..b7f941f70b 100644
--- a/src/qt/forms/helpmessagedialog.ui
+++ b/src/qt/forms/helpmessagedialog.ui
@@ -10,9 +10,6 @@
<height>400</height>
</rect>
</property>
- <property name="windowTitle">
- <string notr="true">Bitcoin Core - Command-line options</string>
- </property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
diff --git a/src/qt/forms/intro.ui b/src/qt/forms/intro.ui
index 09e7bdb024..e4ff3da1ab 100644
--- a/src/qt/forms/intro.ui
+++ b/src/qt/forms/intro.ui
@@ -15,12 +15,12 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
- <widget class="QLabel" name="label_2">
+ <widget class="QLabel" name="welcomeLabel">
<property name="styleSheet">
<string notr="true">QLabel { font-style:italic; }</string>
</property>
<property name="text">
- <string>Welcome to Bitcoin Core.</string>
+ <string>Welcome to %1.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -44,9 +44,9 @@
</spacer>
</item>
<item>
- <widget class="QLabel" name="label_4">
+ <widget class="QLabel" name="storageLabel">
<property name="text">
- <string>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</string>
+ <string>As this is the first time the program is launched, you can choose where %1 will store its data.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -56,7 +56,7 @@
<item>
<widget class="QLabel" name="sizeWarningLabel">
<property name="text">
- <string>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.</string>
+ <string>%1 will download and store a copy of the Bitcoin block chain. At least %2GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
diff --git a/src/qt/forms/modaloverlay.ui b/src/qt/forms/modaloverlay.ui
new file mode 100644
index 0000000000..73223735f5
--- /dev/null
+++ b/src/qt/forms/modaloverlay.ui
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ModalOverlay</class>
+ <widget class="ModalOverlay" name="ModalOverlay">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>640</width>
+ <height>385</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout" stretch="0">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="bgWidget" native="true">
+ <property name="styleSheet">
+ <string notr="true">#bgWidget { background: rgba(0,0,0,220); }</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayoutMain" stretch="1">
+ <property name="leftMargin">
+ <number>60</number>
+ </property>
+ <property name="topMargin">
+ <number>60</number>
+ </property>
+ <property name="rightMargin">
+ <number>60</number>
+ </property>
+ <property name="bottomMargin">
+ <number>60</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="contentWidget" native="true">
+ <property name="styleSheet">
+ <string notr="true">#contentWidget { background: rgba(255,255,255,240); border-radius: 6px; }
+
+QLabel { color: rgb(40,40,40); }</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayoutSub" stretch="1,0,0,0">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>10</number>
+ </property>
+ <property name="topMargin">
+ <number>10</number>
+ </property>
+ <property name="rightMargin">
+ <number>10</number>
+ </property>
+ <property name="bottomMargin">
+ <number>10</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayoutIconText" stretch="0,1">
+ <property name="topMargin">
+ <number>20</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayoutIcon">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="warningIcon">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/warning</normaloff>
+ <disabledoff>:/icons/warning</disabledoff>:/icons/warning</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>48</width>
+ <height>48</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacerWarningIcon">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayoutInfoText">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="infoText">
+ <property name="text">
+ <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. This means that recent transactions will not be visible, and the balance will not be up-to-date until this process has completed.</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="infoTextStrong">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Spending bitcoins may not be possible during that phase!</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacerInTextSpace">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacerAfterText">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::FieldsStayAtSizeHint</enum>
+ </property>
+ <property name="horizontalSpacing">
+ <number>6</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>6</number>
+ </property>
+ <property name="topMargin">
+ <number>10</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelNumberOfBlocksLeft">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Number of blocks left</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="numberOfBlocksLeft">
+ <property name="text">
+ <string>unknown...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelLastBlockTime">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Last block time</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="newestBlockDate">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>unknown...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="labelSyncDone">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Progress</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayoutSync" stretch="0,1">
+ <item>
+ <widget class="QLabel" name="percentageProgress">
+ <property name="text">
+ <string>~</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar">
+ <property name="value">
+ <number>24</number>
+ </property>
+ <property name="format">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="labelProgressIncrease">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Progress increase per hour</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="progressIncreasePerH">
+ <property name="text">
+ <string>calculating...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="labelEstimatedTimeLeft">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Estimated time left until synced</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLabel" name="expectedTimeLeft">
+ <property name="text">
+ <string>calculating...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayoutButtons">
+ <property name="leftMargin">
+ <number>10</number>
+ </property>
+ <property name="topMargin">
+ <number>10</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="closeButton">
+ <property name="text">
+ <string>Hide</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>ModalOverlay</class>
+ <extends>QWidget</extends>
+ <header>modaloverlay.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui
index 22c67b8040..0b29201872 100644
--- a/src/qt/forms/optionsdialog.ui
+++ b/src/qt/forms/optionsdialog.ui
@@ -30,10 +30,10 @@
<item>
<widget class="QCheckBox" name="bitcoinAtStartup">
<property name="toolTip">
- <string>Automatically start Bitcoin Core after logging in to the system.</string>
+ <string>Automatically start %1 after logging in to the system.</string>
</property>
<property name="text">
- <string>&amp;Start Bitcoin Core on system login</string>
+ <string>&amp;Start %1 on system login</string>
</property>
</widget>
</item>
@@ -505,6 +505,16 @@
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_Window">
<item>
+ <widget class="QCheckBox" name="hideTrayIcon">
+ <property name="toolTip">
+ <string>&amp;Hide the icon from the system tray.</string>
+ </property>
+ <property name="text">
+ <string>Hide tray icon</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QCheckBox" name="minimizeToTray">
<property name="toolTip">
<string>Show only a tray icon after minimizing the window.</string>
@@ -562,7 +572,7 @@
<item>
<widget class="QValueComboBox" name="lang">
<property name="toolTip">
- <string>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</string>
+ <string>The user interface language can be set here. This setting will take effect after restarting %1.</string>
</property>
</widget>
</item>
diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui
index 6d792d1475..923ed68996 100644
--- a/src/qt/forms/overviewpage.ui
+++ b/src/qt/forms/overviewpage.ui
@@ -61,7 +61,7 @@
<item>
<widget class="QPushButton" name="labelWalletStatus">
<property name="enabled">
- <bool>false</bool>
+ <bool>true</bool>
</property>
<property name="maximumSize">
<size>
@@ -447,7 +447,7 @@
<item>
<widget class="QPushButton" name="labelTransactionsStatus">
<property name="enabled">
- <bool>false</bool>
+ <bool>true</bool>
</property>
<property name="maximumSize">
<size>
diff --git a/src/qt/forms/receiverequestdialog.ui b/src/qt/forms/receiverequestdialog.ui
index 1e484dd9a0..4163f4189c 100644
--- a/src/qt/forms/receiverequestdialog.ui
+++ b/src/qt/forms/receiverequestdialog.ui
@@ -22,7 +22,7 @@
<property name="minimumSize">
<size>
<width>300</width>
- <height>300</height>
+ <height>320</height>
</size>
</property>
<property name="toolTip">
diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui
index 8911b41cbf..06e09074d1 100644
--- a/src/qt/forms/sendcoinsdialog.ui
+++ b/src/qt/forms/sendcoinsdialog.ui
@@ -332,7 +332,7 @@
</widget>
</item>
<item row="1" column="0">
- <widget class="QLabel" name="labelCoinControlPriorityText">
+ <widget class="QLabel" name="labelCoinControlLowOutputText">
<property name="font">
<font>
<weight>75</weight>
@@ -340,12 +340,12 @@
</font>
</property>
<property name="text">
- <string>Priority:</string>
+ <string>Dust:</string>
</property>
</widget>
</item>
<item row="1" column="1">
- <widget class="QLabel" name="labelCoinControlPriority">
+ <widget class="QLabel" name="labelCoinControlLowOutput">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
</property>
@@ -353,7 +353,7 @@
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="text">
- <string notr="true">medium</string>
+ <string notr="true">no</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
@@ -411,36 +411,7 @@
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="labelCoinControlLowOutputText">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Dust:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="labelCoinControlLowOutput">
- <property name="cursor">
- <cursorShape>IBeamCursor</cursorShape>
- </property>
- <property name="contextMenuPolicy">
- <enum>Qt::ActionsContextMenu</enum>
- </property>
- <property name="text">
- <string notr="true">no</string>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
- </property>
- </widget>
- </item>
- </layout>
+ </layout>
</item>
<item>
<layout class="QFormLayout" name="formLayoutCoinControl4">
@@ -617,7 +588,7 @@
<x>0</x>
<y>0</y>
<width>830</width>
- <height>68</height>
+ <height>104</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,1">
@@ -1167,59 +1138,6 @@
</item>
</layout>
</item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayoutFee5" stretch="0,0,0">
- <property name="spacing">
- <number>8</number>
- </property>
- <property name="bottomMargin">
- <number>4</number>
- </property>
- <item>
- <widget class="QCheckBox" name="checkBoxFreeTx">
- <property name="text">
- <string>Send as zero-fee transaction if possible</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="labelFreeTx">
- <property name="text">
- <string>(confirmation may take longer)</string>
- </property>
- <property name="margin">
- <number>5</number>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacerFee5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>1</width>
- <height>1</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacerFee2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>1</width>
- <height>1</height>
- </size>
- </property>
- </spacer>
- </item>
</layout>
</widget>
</item>
diff --git a/src/qt/forms/transactiondescdialog.ui b/src/qt/forms/transactiondescdialog.ui
index 5ae1e12856..3a698cfd1d 100644
--- a/src/qt/forms/transactiondescdialog.ui
+++ b/src/qt/forms/transactiondescdialog.ui
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
- <string>Transaction details</string>
+ <string notr="true">Transaction details</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h
index 216f23f139..bab9923d20 100644
--- a/src/qt/guiconstants.h
+++ b/src/qt/guiconstants.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -29,6 +29,8 @@ static const bool DEFAULT_SPLASHSCREEN = true;
#define COLOR_TX_STATUS_OPENUNTILDATE QColor(64, 64, 255)
/* Transaction list -- TX status decoration - offline */
#define COLOR_TX_STATUS_OFFLINE QColor(192, 192, 192)
+/* Transaction list -- TX status decoration - danger, tx needs attention */
+#define COLOR_TX_STATUS_DANGER QColor(200, 100, 100)
/* Transaction list -- TX status decoration - default color */
#define COLOR_BLACK QColor(0, 0, 0)
@@ -41,7 +43,7 @@ static const int TOOLTIP_WRAP_THRESHOLD = 80;
static const int MAX_URI_LENGTH = 255;
/* QRCodeDialog -- size of exported QR Code image */
-#define EXPORT_IMAGE_SIZE 256
+#define QR_IMAGE_SIZE 300
/* Number of frames in spinner animation */
#define SPINNER_FRAMES 36
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index 6dce9370d7..0beaddf997 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -62,6 +62,10 @@
#include <QUrlQuery>
#endif
+#if QT_VERSION >= 0x50200
+#include <QFontDatabase>
+#endif
+
#if BOOST_FILESYSTEM_VERSION >= 3
static boost::filesystem::detail::utf8_codecvt_facet utf8;
#endif
@@ -90,6 +94,9 @@ QString dateTimeStr(qint64 nTime)
QFont fixedPitchFont()
{
+#if QT_VERSION >= 0x50200
+ return QFontDatabase::systemFont(QFontDatabase::FixedFont);
+#else
QFont font("Monospace");
#if QT_VERSION >= 0x040800
font.setStyleHint(QFont::Monospace);
@@ -97,6 +104,24 @@ QFont fixedPitchFont()
font.setStyleHint(QFont::TypeWriter);
#endif
return font;
+#endif
+}
+
+// Just some dummy data to generate an convincing random-looking (but consistent) address
+static const uint8_t dummydata[] = {0xeb,0x15,0x23,0x1d,0xfc,0xeb,0x60,0x92,0x58,0x86,0xb6,0x7d,0x06,0x52,0x99,0x92,0x59,0x15,0xae,0xb1,0x72,0xc0,0x66,0x47};
+
+// Generate a dummy address with invalid CRC, starting with the network prefix.
+static std::string DummyAddress(const CChainParams &params)
+{
+ std::vector<unsigned char> sourcedata = params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
+ sourcedata.insert(sourcedata.end(), dummydata, dummydata + sizeof(dummydata));
+ for(int i=0; i<256; ++i) { // Try every trailing byte
+ std::string s = EncodeBase58(begin_ptr(sourcedata), end_ptr(sourcedata));
+ if (!CBitcoinAddress(s).IsValid())
+ return s;
+ sourcedata[sourcedata.size()-1] += 1;
+ }
+ return "";
}
void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent)
@@ -107,7 +132,8 @@ void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent)
#if QT_VERSION >= 0x040700
// We don't want translators to use own addresses in translations
// and this is the only place, where this address is supplied.
- widget->setPlaceholderText(QObject::tr("Enter a Bitcoin address (e.g. %1)").arg("1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"));
+ widget->setPlaceholderText(QObject::tr("Enter a Bitcoin address (e.g. %1)").arg(
+ QString::fromStdString(DummyAddress(Params()))));
#endif
widget->setValidator(new BitcoinAddressEntryValidator(parent));
widget->setCheckValidator(new BitcoinAddressCheckValidator(parent));
@@ -217,7 +243,7 @@ QString formatBitcoinURI(const SendCoinsRecipient &info)
if (!info.message.isEmpty())
{
- QString msg(QUrl::toPercentEncoding(info.message));;
+ QString msg(QUrl::toPercentEncoding(info.message));
ret += QString("%1message=%2").arg(paramCount == 0 ? "?" : "&").arg(msg);
paramCount++;
}
@@ -265,17 +291,17 @@ void copyEntryData(QAbstractItemView *view, int column, int role)
}
}
-QString getEntryData(QAbstractItemView *view, int column, int role)
+QVariant getEntryData(QAbstractItemView *view, int column, int role)
{
if(!view || !view->selectionModel())
- return QString();
+ return QVariant();
QModelIndexList selection = view->selectionModel()->selectedRows(column);
if(!selection.isEmpty()) {
// Return first item
- return (selection.at(0).data(role).toString());
+ return (selection.at(0).data(role));
}
- return QString();
+ return QVariant();
}
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir,
@@ -436,9 +462,9 @@ void SubstituteFonts(const QString& language)
#endif
}
-ToolTipToRichTextFilter::ToolTipToRichTextFilter(int size_threshold, QObject *parent) :
+ToolTipToRichTextFilter::ToolTipToRichTextFilter(int _size_threshold, QObject *parent) :
QObject(parent),
- size_threshold(size_threshold)
+ size_threshold(_size_threshold)
{
}
@@ -898,6 +924,15 @@ QString formatServicesStr(quint64 mask)
case NODE_GETUTXO:
strList.append("GETUTXO");
break;
+ case NODE_BLOOM:
+ strList.append("BLOOM");
+ break;
+ case NODE_WITNESS:
+ strList.append("WITNESS");
+ break;
+ case NODE_XTHIN:
+ strList.append("XTHIN");
+ break;
default:
strList.append(QString("%1[%2]").arg("UNKNOWN").arg(check));
}
@@ -920,4 +955,40 @@ QString formatTimeOffset(int64_t nTimeOffset)
return QString(QObject::tr("%1 s")).arg(QString::number((int)nTimeOffset, 10));
}
+QString formateNiceTimeOffset(qint64 secs)
+{
+ // Represent time from last generated block in human readable text
+ QString timeBehindText;
+ const int HOUR_IN_SECONDS = 60*60;
+ const int DAY_IN_SECONDS = 24*60*60;
+ const int WEEK_IN_SECONDS = 7*24*60*60;
+ const int YEAR_IN_SECONDS = 31556952; // Average length of year in Gregorian calendar
+ if(secs < 60)
+ {
+ timeBehindText = QObject::tr("%n seconds(s)","",secs);
+ }
+ else if(secs < 2*HOUR_IN_SECONDS)
+ {
+ timeBehindText = QObject::tr("%n minutes(s)","",secs/60);
+ }
+ else if(secs < 2*DAY_IN_SECONDS)
+ {
+ timeBehindText = QObject::tr("%n hour(s)","",secs/HOUR_IN_SECONDS);
+ }
+ else if(secs < 2*WEEK_IN_SECONDS)
+ {
+ timeBehindText = QObject::tr("%n day(s)","",secs/DAY_IN_SECONDS);
+ }
+ else if(secs < YEAR_IN_SECONDS)
+ {
+ timeBehindText = QObject::tr("%n week(s)","",secs/WEEK_IN_SECONDS);
+ }
+ else
+ {
+ qint64 years = secs / YEAR_IN_SECONDS;
+ qint64 remainder = secs % YEAR_IN_SECONDS;
+ timeBehindText = QObject::tr("%1 and %2").arg(QObject::tr("%n year(s)", "", years)).arg(QObject::tr("%n week(s)","", remainder/WEEK_IN_SECONDS));
+ }
+ return timeBehindText;
+}
} // namespace GUIUtil
diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h
index ec678c4af2..e28f68930f 100644
--- a/src/qt/guiutil.h
+++ b/src/qt/guiutil.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -70,7 +70,7 @@ namespace GUIUtil
@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);
+ QVariant getEntryData(QAbstractItemView *view, int column, int role);
void setClipboard(const QString& str);
@@ -200,6 +200,8 @@ namespace GUIUtil
/* Format a CNodeCombinedStats.nTimeOffset into a user-readable string. */
QString formatTimeOffset(int64_t nTimeOffset);
+ QString formateNiceTimeOffset(qint64 secs);
+
#if defined(Q_OS_MAC) && QT_VERSION >= 0x050000
// workaround for Qt OSX Bug:
// https://bugreports.qt-project.org/browse/QTBUG-15631
diff --git a/src/qt/intro.cpp b/src/qt/intro.cpp
index ab63e98d40..5a336b105e 100644
--- a/src/qt/intro.cpp
+++ b/src/qt/intro.cpp
@@ -1,7 +1,11 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "intro.h"
#include "ui_intro.h"
@@ -15,9 +19,15 @@
#include <QSettings>
#include <QMessageBox>
-/* Minimum free space (in bytes) needed for data directory */
+#include <cmath>
+
static const uint64_t GB_BYTES = 1000000000LL;
-static const uint64_t BLOCK_CHAIN_SIZE = 20LL * GB_BYTES;
+/* Minimum free space (in GB) needed for data directory */
+static const uint64_t BLOCK_CHAIN_SIZE = 80;
+/* Minimum free space (in GB) needed for data directory when pruned; Does not include prune target */
+static const uint64_t CHAIN_STATE_SIZE = 2;
+/* Total required space (in GB) depending on user choice (prune, not prune) */
+static uint64_t requiredSpace;
/* Check free space asynchronously to prevent hanging the UI thread.
@@ -53,9 +63,9 @@ private:
#include "intro.moc"
-FreespaceChecker::FreespaceChecker(Intro *intro)
+FreespaceChecker::FreespaceChecker(Intro *_intro)
{
- this->intro = intro;
+ this->intro = _intro;
}
void FreespaceChecker::check()
@@ -112,7 +122,13 @@ Intro::Intro(QWidget *parent) :
signalled(false)
{
ui->setupUi(this);
- ui->sizeWarningLabel->setText(ui->sizeWarningLabel->text().arg(BLOCK_CHAIN_SIZE/GB_BYTES));
+ ui->welcomeLabel->setText(ui->welcomeLabel->text().arg(tr(PACKAGE_NAME)));
+ ui->storageLabel->setText(ui->storageLabel->text().arg(tr(PACKAGE_NAME)));
+ uint64_t pruneTarget = std::max<int64_t>(0, GetArg("-prune", 0));
+ requiredSpace = BLOCK_CHAIN_SIZE;
+ if (pruneTarget)
+ requiredSpace = CHAIN_STATE_SIZE + std::ceil(pruneTarget * 1024 * 1024.0 / GB_BYTES);
+ ui->sizeWarningLabel->setText(ui->sizeWarningLabel->text().arg(tr(PACKAGE_NAME)).arg(requiredSpace));
startThread();
}
@@ -149,20 +165,20 @@ QString Intro::getDefaultDataDirectory()
return GUIUtil::boostPathToQString(GetDefaultDataDir());
}
-void Intro::pickDataDirectory()
+bool Intro::pickDataDirectory()
{
namespace fs = boost::filesystem;
QSettings settings;
/* If data directory provided on command line, no need to look at settings
or show a picking dialog */
if(!GetArg("-datadir", "").empty())
- return;
+ return true;
/* 1) Default data directory for operating system */
QString dataDir = getDefaultDataDirectory();
/* 2) Allow QSettings to override default dir */
dataDir = settings.value("strDataDir", dataDir).toString();
- if(!fs::exists(GUIUtil::qstringToBoostPath(dataDir)) || GetBoolArg("-choosedatadir", DEFAULT_CHOOSE_DATADIR))
+ if(!fs::exists(GUIUtil::qstringToBoostPath(dataDir)) || GetBoolArg("-choosedatadir", DEFAULT_CHOOSE_DATADIR) || settings.value("fReset", false).toBool() || GetBoolArg("-resetguisettings", false))
{
/* If current default data directory does not exist, let the user choose one */
Intro intro;
@@ -174,20 +190,21 @@ void Intro::pickDataDirectory()
if(!intro.exec())
{
/* Cancel clicked */
- exit(0);
+ return false;
}
dataDir = intro.getDataDirectory();
try {
TryCreateDirectory(GUIUtil::qstringToBoostPath(dataDir));
break;
} catch (const fs::filesystem_error&) {
- QMessageBox::critical(0, tr("Bitcoin Core"),
+ QMessageBox::critical(0, tr(PACKAGE_NAME),
tr("Error: Specified data directory \"%1\" cannot be created.").arg(dataDir));
/* fall through, back to choosing screen */
}
}
settings.setValue("strDataDir", dataDir);
+ settings.setValue("fReset", false);
}
/* Only override -datadir if different from the default, to make it possible to
* override -datadir in the bitcoin.conf file in the default data directory
@@ -195,6 +212,7 @@ void Intro::pickDataDirectory()
*/
if(dataDir != getDefaultDataDirectory())
SoftSetArg("-datadir", GUIUtil::qstringToBoostPath(dataDir).string()); // use OS locale for path setting
+ return true;
}
void Intro::setStatus(int status, const QString &message, quint64 bytesAvailable)
@@ -216,9 +234,9 @@ void Intro::setStatus(int status, const QString &message, quint64 bytesAvailable
ui->freeSpace->setText("");
} else {
QString freeString = tr("%n GB of free space available", "", bytesAvailable/GB_BYTES);
- if(bytesAvailable < BLOCK_CHAIN_SIZE)
+ if(bytesAvailable < requiredSpace * GB_BYTES)
{
- freeString += " " + tr("(of %n GB needed)", "", BLOCK_CHAIN_SIZE/GB_BYTES);
+ freeString += " " + tr("(of %n GB needed)", "", requiredSpace);
ui->freeSpace->setStyleSheet("QLabel { color: #800000 }");
} else {
ui->freeSpace->setStyleSheet("");
diff --git a/src/qt/intro.h b/src/qt/intro.h
index 1d49922e93..ee768a7ad8 100644
--- a/src/qt/intro.h
+++ b/src/qt/intro.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -35,10 +35,13 @@ public:
/**
* Determine data directory. Let the user choose if the current one doesn't exist.
*
+ * @returns true if a data directory was selected, false if the user cancelled the selection
+ * dialog.
+ *
* @note do NOT call global GetDataDir() before calling this function, this
* will cause the wrong path to be cached.
*/
- static void pickDataDirectory();
+ static bool pickDataDirectory();
/**
* Determine default data directory for operating system.
diff --git a/src/qt/locale/bitcoin_af.ts b/src/qt/locale/bitcoin_af.ts
new file mode 100644
index 0000000000..97ada8dd5c
--- /dev/null
+++ b/src/qt/locale/bitcoin_af.ts
@@ -0,0 +1,264 @@
+<TS language="af" version="2.1">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation>Regs-kliek om die adres of etiket te verander</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation>Skep 'n nuwe adres</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Nuut</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>Dupliseer die geselekteerde adres na die sisteem se geheuebord</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Dupliseer</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Verwyder die adres wat u gekies het van die lys</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Voer die inligting op hierdie bladsy uit na 'n leer</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Voer uit</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Vee uit</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation>Wagwoord Dialoog</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation>Tik u wagwoord in</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation>Nuwe wagwoord</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Herhaal nuwe wagwoord</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>Banned Until</source>
+ <translation>Verban tot</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>Synchronizing with network...</source>
+ <translation>Netwerk-sinkronisasie...</translation>
+ </message>
+ <message>
+ <source>&amp;Overview</source>
+ <translation>&amp;Oorsig</translation>
+ </message>
+ <message>
+ <source>Node</source>
+ <translation>Node</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation>Vertoon 'n algemene oorsig van die beursie</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation>&amp;Transaksies</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation>Stop en verlaat die applikasie</translation>
+ </message>
+ <message>
+ <source>&amp;Options...</source>
+ <translation>&amp;Opsies</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet...</source>
+ <translation>&amp;Kodifiseer Beursie</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet...</source>
+ <translation>&amp;Rugsteun-kopie van Beursie</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase...</source>
+ <translation>&amp;Verander Wagwoord</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses...</source>
+ <translation>&amp;Versending adresse...</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>&amp;Ontvanger adresse</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI...</source>
+ <translation>Oop &amp; URI...</translation>
+ </message>
+ <message>
+ <source>Reindexing blocks on disk...</source>
+ <translation>Besig met herindeksering van blokke op hardeskyf...</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation>Stuur munte na 'n Bitcoin adres</translation>
+ </message>
+ <message>
+ <source>Backup wallet to another location</source>
+ <translation>Maak 'n rugsteun-kopié van beursie na 'n ander stoorplek</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation>Verander die wagwoord wat ek vir kodifikasie van my beursie gebruik</translation>
+ </message>
+ <message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>Beursie</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Stuur</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation>&amp;Ontvang</translation>
+ </message>
+ <message>
+ <source>Show or hide the main Window</source>
+ <translation>Wys of versteek die hoofbladsy</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation>Kodifiseer die private sleutes wat aan jou beursie gekoppel is.</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation>Onderteken boodskappe met u Bitcoin adresse om u eienaarskap te bewys</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation>Verifieër boodskappe om seker te maak dat dit met die gespesifiseerde Bitcoin adresse</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Help</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation>Versoek betalings (genereer QR-kodes en bitcoin: URI's)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation>Vertoon die lys van gebruikte versendingsadresse en etikette</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation>Vertoon die lys van gebruikte ontvangers-adresse en etikette</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI or payment request</source>
+ <translation>Skep 'n bitcoin: URI of betalingsversoek</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ </context>
+<context>
+ <name>Intro</name>
+ </context>
+<context>
+ <name>OpenURIDialog</name>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ </context>
+<context>
+ <name>QObject</name>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ </context>
+<context>
+ <name>SplashScreen</name>
+ </context>
+<context>
+ <name>TrafficGraphWidget</name>
+ </context>
+<context>
+ <name>TransactionDescDialog</name>
+ </context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Kern</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Moenie transaksies vir langer as &lt;n&gt; ure in die geheuepoel hou nie (verstek: %u)</translation>
+ </message>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_af_ZA.ts b/src/qt/locale/bitcoin_af_ZA.ts
index d55d2f58ac..e553fc7759 100644
--- a/src/qt/locale/bitcoin_af_ZA.ts
+++ b/src/qt/locale/bitcoin_af_ZA.ts
@@ -13,93 +13,26 @@
<source>&amp;Delete</source>
<translation>&amp;Verwyder</translation>
</message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(geen etiket)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation>Wagfrase Dialoog</translation>
+ </message>
+ <message>
<source>Enter passphrase</source>
- <translation>Tik Wagwoord in</translation>
+ <translation>Tik wagfrase in</translation>
</message>
<message>
<source>New passphrase</source>
- <translation>Nuwe wagwoord</translation>
+ <translation>Nuwe wagfrase</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation>Herhaal nuwe wagwoord</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Enkripteer beursie</translation>
+ <translation>Herhaal nuwe wagfrase</translation>
</message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Hierdie operasie benodig 'n wagwoord om die beursie oop te sluit.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Sluit beursie oop</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Hierdie operasie benodig 'n wagwoord om die beursie oop te sluit.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Sluit beursie oop</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Verander wagwoord</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Bevestig beursie enkripsie.</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Die beursie is nou bewaak</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Die beursie kon nie bewaak word nie</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Beursie bewaaking het misluk as gevolg van 'n interne fout. Die beursie is nie bewaak nie!</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Die wagwoord stem nie ooreen nie</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Beursie oopsluiting het misluk</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Die wagwoord wat ingetik was om die beursie oop te sluit, was verkeerd.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Beursie dekripsie het misluk</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -183,9 +116,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
@@ -199,42 +129,18 @@
<source>Date</source>
<translation>Datum</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Maak kopie van adres</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopieer bedrag</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(geen etiket)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
<message>
- <source>New receiving address</source>
- <translation>Nuwe ontvangende adres</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nuwe stuurende adres</translation>
+ <source>&amp;Label</source>
+ <translation>&amp;Etiket</translation>
</message>
<message>
- <source>Edit receiving address</source>
- <translation>Wysig ontvangende adres</translation>
+ <source>&amp;Address</source>
+ <translation>&amp;Adres</translation>
</message>
- <message>
- <source>Edit sending address</source>
- <translation>Wysig stuurende adres</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Kon nie die beursie oopsluit nie.</translation>
- </message>
- </context>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -261,6 +167,10 @@
<source>Options</source>
<translation>Opsies</translation>
</message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>&amp;Beursie</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
@@ -270,9 +180,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -283,9 +190,6 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
<source>&amp;Information</source>
@@ -295,51 +199,16 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>Copy amount</source>
- <translation>Kopieer bedrag</translation>
- </message>
-</context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Bedrag</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
+ <source>&amp;Amount:</source>
+ <translation>&amp;Bedrag:</translation>
</message>
<message>
- <source>Message</source>
- <translation>Boodskap</translation>
+ <source>&amp;Message:</source>
+ <translation>&amp;Boodskap:</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Boodskap</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Bedrag</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(geen etiket)</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -348,10 +217,18 @@
<translation>Stuur Munstukke</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>Onvoldoende fondse</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>Bedrag:</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Transaksie fooi:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Stuur aan vele ontvangers op eens</translation>
</message>
@@ -363,18 +240,14 @@
<source>S&amp;end</source>
<translation>S&amp;tuur</translation>
</message>
- <message>
- <source>Copy amount</source>
- <translation>Kopieer bedrag</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(geen etiket)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
+ <source>A&amp;mount:</source>
+ <translation>&amp;Bedrag:</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Boodskap:</translation>
</message>
@@ -404,230 +277,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Van</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Na</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>eie adres</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiket</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Krediet</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>nie aanvaar nie</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debiet</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Transaksie fooi</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Netto bedrag</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Boodskap</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transaksie ID</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Bedrag</translation>
- </message>
- <message>
- <source>true</source>
- <translation>waar</translation>
- </message>
- <message>
- <source>false</source>
- <translation>onwaar</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>onbekend</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipe</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ontvang met</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Ontvang van</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Gestuur na</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Betalings Aan/na jouself</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Gemyn</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n.v.t)</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Datum en tyd wat die transaksie ontvang was.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipe transaksie.</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Alles</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Vandag</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Hierdie week</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Hierdie maand</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Verlede maand</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Hierdie jaar</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Reeks...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ontvang met</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Gestuur na</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Aan/na jouself</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Gemyn</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Ander</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Min bedrag</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Maak kopie van adres</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopieer bedrag</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipe</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Reeks:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>aan</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Stuur Munstukke</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -642,10 +297,6 @@
<translation>Informasie</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Hierdie help boodskap</translation>
- </message>
- <message>
<source>Loading addresses...</source>
<translation>Laai adresse...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ar.ts b/src/qt/locale/bitcoin_ar.ts
index 8a54f15791..af62207df2 100644
--- a/src/qt/locale/bitcoin_ar.ts
+++ b/src/qt/locale/bitcoin_ar.ts
@@ -26,10 +26,6 @@
<translation>&amp;اغلاق</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>انسخ العنوان</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>حذ٠العنوان المحدد من القائمة</translation>
</message>
@@ -45,69 +41,6 @@
<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>&amp;اختر</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>هذه هي عناوين Bitcion التابعة لك من أجل إرسال الدÙعات. تحقق دائما من المبلغ Ùˆ عنوان المرسل المستقبل قبل إرسال العملات</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>هذه هي عناوين Bitcion التابعة لك من أجل إستقبال الدÙعات. ينصح استخدام عنوان جديد من أجل كل صÙقة</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>نسخ &amp;الوصÙ</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>
- <message>
- <source>Exporting Failed</source>
- <translation>Ùشل التصدير</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>وصÙ</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>عنوان</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(لا وصÙ)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -127,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>ادخل كلمة المرور الجديدة مرة أخرى</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>تشÙير المحÙظة</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>هذه العملية تحتاج كلمة مرور محÙظتك Ù„Ùتحها</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Ø¥Ùتح المحÙظة</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>هذه العملية تحتاج كلمة مرور محÙظتك Ù„ÙÙƒ تشÙيرها </translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>ÙÙƒ تشÙير المحÙظة</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>تغيير كلمة المرور</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>تحذير: إذا قمت بتشÙير محÙظتك ÙˆÙقدت كلمة المرور الخاص بك, ستÙقد كل عملات BITCOINS الخاصة بك.</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>تحذير: Ù…Ùتاح الحرو٠الكبيرة Ù…Ùعل</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>محÙظة مشÙرة</translation>
- </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>أدخل عبارة مرور جديدة إلى المحÙظة. الرجاء استخدام عبارة مرور تتكون من10 حرو٠عشوائية على الاقل, أو أكثر من 7 كلمات</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>أدخل كلمة المرور القديمة والجديدة للمحÙظة.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Ùشل تشÙير المحÙظة</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Ùشل تشÙير المحÙظة بسبب خطأ داخلي. لم يتم تشÙير محÙظتك.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>كلمتي المرور ليستا متطابقتان</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Ùشل Ùتح المحÙظة</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>كلمة المرور التي تم إدخالها Ù„ÙÙƒ تشÙير المحÙظة غير صحيحة.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Ùشل ÙÙƒ التشÙير المحÙظة</translation>
+ <source>IP/Netmask</source>
+ <translation>عنوان البروتوكول/قناع</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>لقد تم تغير عبارة مرور المحÙظة بنجاح</translation>
+ <source>Banned Until</source>
+ <translation>محظور حتى</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -258,8 +111,12 @@
<translation>الخروج من التطبيق</translation>
</message>
<message>
+ <source>Show information about %1</source>
+ <translation>أظهر المعلومات حولة %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
- <translation>عن</translation>
+ <translation>عن &amp;Qt</translation>
</message>
<message>
<source>Show information about Qt</source>
@@ -294,14 +151,6 @@
<translation>اÙتح &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>عميل bitcion core</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>استيراد كتل من القرص ...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>إعادة الÙهرسة الكتل على القرص ...</translation>
</message>
@@ -322,6 +171,10 @@
<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>
@@ -334,12 +187,12 @@
<translation>محÙظة</translation>
</message>
<message>
- <source>&amp;Receive</source>
- <translation>&amp;استقبل</translation>
+ <source>&amp;Send</source>
+ <translation>&amp;ارسل</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation> اظهار معلومات حول bitcion core</translation>
+ <source>&amp;Receive</source>
+ <translation>&amp;استقبل</translation>
</message>
<message>
<source>&amp;Show / Hide</source>
@@ -354,6 +207,14 @@
<translation>تشÙير المÙتاح الخاص بمحÙظتك</translation>
</message>
<message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation>وقَع الرسائل بواسطة ال: Bitcoin الخاص بك لإثبات امتلاكك لهم</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation>تحقق من الرسائل للتأكد من أنَها ÙˆÙقعت برسائل Bitcoin محدَدة</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation>&amp;ملÙ</translation>
</message>
@@ -370,12 +231,56 @@
<translation>شريط أدوات علامات التبويب</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>جوهر البيت كوين</translation>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation>أطلب دÙعات (يولد كودات الرمز المربع وبيت كوين: العناوين المعطاة)</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 : Bitcoin أو طلب دÙع</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation>&amp;خيارات سطر الأوامر</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk...</source>
+ <translation>ترتيب الÙهرسة الكتل على القرص...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>معالجة الكتل على القرص...</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>لم يتم معالجة أي كتلة سجل المعاملات</numerusform><numerusform>تم معالجة كتلة واحدة سجل المعاملات</numerusform><numerusform>تم معالجة كتلتين سجل المعاملات</numerusform><numerusform>تم معالجة %n كتل سجل المعاملات</numerusform><numerusform>تم معالجة %n كتلة سجل المعاملات</numerusform><numerusform>تم معالجة %n كتلة سجل المعاملات</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation><numerusform>0 ساعة</numerusform><numerusform>%n ساعة</numerusform><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>
- <source>&amp;About Bitcoin Core</source>
- <translation>حول bitcoin core</translation>
+ <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>
@@ -398,6 +303,20 @@
<translation>اللحاق بالركب ...</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation>التاريخ %1
+
+
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>علامه: %1
+</translation>
+ </message>
+ <message>
<source>Sent transaction</source>
<translation>المعاملات المرسلة</translation>
</message>
@@ -415,19 +334,20 @@
</message>
</context>
<context>
- <name>ClientModel</name>
+ <name>CoinControlDialog</name>
<message>
- <source>Network Alert</source>
- <translation>تنبيه من الشبكة</translation>
+ <source>Coin Selection</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>
@@ -440,6 +360,10 @@
<translation>رسوم :</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>غبار:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation>بعد الرسوم :</translation>
</message>
@@ -448,108 +372,44 @@
<translation>تعديل :</translation>
</message>
<message>
- <source>Amount</source>
- <translation>المبلغ</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>التاريخ</translation>
- </message>
- <message>
- <source>Confirmations</source>
- <translation>تأكيد</translation>
+ <source>(un)select all</source>
+ <translation>عدم اختيار الجميع</translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>تأكيد</translation>
+ <source>Tree mode</source>
+ <translation>صيغة الشجرة</translation>
</message>
<message>
- <source>Priority</source>
- <translation>Ø£Ùضلية</translation>
+ <source>List mode</source>
+ <translation>صيغة القائمة</translation>
</message>
<message>
- <source>Copy address</source>
- <translation> انسخ عنوان</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation> انسخ التسمية</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>نسخ الكمية</translation>
- </message>
- <message>
- <source>Copy transaction ID</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 priority</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>low</source>
- <translation>منخÙض</translation>
+ <source>Amount</source>
+ <translation>مبلغ</translation>
</message>
<message>
- <source>lower</source>
- <translation>أدنى</translation>
+ <source>Received with label</source>
+ <translation>مستقبل مع ملصق</translation>
</message>
<message>
- <source>lowest</source>
- <translation>الأدنى</translation>
+ <source>Received with address</source>
+ <translation>مستقبل مع عنوان</translation>
</message>
<message>
- <source>none</source>
- <translation>لا شيء</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>نعم</translation>
+ <source>Date</source>
+ <translation>تاريخ</translation>
</message>
<message>
- <source>no</source>
- <translation>لا</translation>
+ <source>Confirmations</source>
+ <translation>تأكيدات</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(لا وصÙ)</translation>
+ <source>Confirmed</source>
+ <translation>تأكيد</translation>
</message>
<message>
- <source>(change)</source>
- <translation>(تغير)</translation>
+ <source>Priority</source>
+ <translation>Ø£Ùضلية</translation>
</message>
</context>
<context>
@@ -563,36 +423,16 @@
<translation>&amp;وصÙ</translation>
</message>
<message>
- <source>&amp;Address</source>
- <translation>&amp;العنوان</translation>
- </message>
- <message>
- <source>New receiving address</source>
- <translation>عنوان أستلام جديد</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>عنوان إرسال جديد</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>تعديل عنوان الأستلام</translation>
+ <source>The label associated with this address list entry</source>
+ <translation>الملصق المرتبط بقائمة العناوين المدخلة</translation>
</message>
<message>
- <source>Edit sending address</source>
- <translation>تعديل عنوان الارسال</translation>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation>العنوان المرتبط بقائمة العناوين المدخلة. Ùˆ التي يمكن تعديلها Ùقط بواسطة ارسال العناوين</translation>
</message>
<message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>هدا العنوان "%1" موجود مسبقا ÙÙŠ دÙتر العناوين</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation> يمكن Ùتح المحÙظة.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ùشل توليد Ù…Ùتاح جديد.</translation>
+ <source>&amp;Address</source>
+ <translation>&amp;العنوان</translation>
</message>
</context>
<context>
@@ -606,6 +446,14 @@
<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>
+ <message>
<source>Cannot create data directory here.</source>
<translation>لا يمكن انشاء دليل بيانات هنا .</translation>
</message>
@@ -613,22 +461,50 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>جوهر البيت كوين</translation>
- </message>
- <message>
<source>version</source>
<translation>النسخة</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>عن جوهر البيت كوين</translation>
+ <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>
+ <message>
+ <source>UI Options:</source>
+ <translation>خيارات واجهة المستخدم</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>اختر دليل البيانات عند بدء التشغير (اÙتراضي: %u)</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>أضع شهادة بروتوكول الشبقة الأمنية لطلب المدÙوع (اÙتراضي: -نظام-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>أظهر شاشة البداية عند بدء التشغيل (اÙتراضي: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>اعد تعديل جميع النظم المتغيرة ÙÙŠ GUI</translation>
+ </message>
+</context>
<context>
<name>Intro</name>
<message>
@@ -644,10 +520,6 @@
<translation>استخدام دليل بيانات مخصص:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>جوهر البيت كوين</translation>
- </message>
- <message>
<source>Error</source>
<translation>خطأ</translation>
</message>
@@ -655,12 +527,16 @@
<context>
<name>OpenURIDialog</name>
<message>
- <source>Select payment request file</source>
- <translation>حدد مل٠طلب الدÙع</translation>
+ <source>Open URI</source>
+ <translation>اÙتح URL</translation>
+ </message>
+ <message>
+ <source>Open payment request from URI or file</source>
+ <translation>حدد طلب الدÙع من مل٠او URI</translation>
</message>
<message>
- <source>Select payment request file to open</source>
- <translation>حدد مل٠طلب الدÙع Ù„Ùتحه</translation>
+ <source>Select payment request file</source>
+ <translation>حدد مل٠طلب الدÙع</translation>
</message>
</context>
<context>
@@ -714,10 +590,18 @@
<translation>منÙØ° البروكسي (مثلا 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>مستخدم للاتصال بالاصدقاء من خلال:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>ناÙذه</translation>
</message>
<message>
+ <source>Hide tray icon</source>
+ <translation>اخÙاء لوحة الايقون</translation>
+ </message>
+ <message>
<source>&amp;Display</source>
<translation>&amp;عرض</translation>
</message>
@@ -778,9 +662,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -790,36 +671,21 @@
<translation>المبلغ</translation>
</message>
<message>
- <source>N/A</source>
- <translation>غير معروÙ</translation>
- </message>
- </context>
-<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Ø­Ùظ الصورة</translation>
+ <source>%1 h</source>
+ <translation>%1 ساعة</translation>
</message>
<message>
- <source>&amp;Copy Image</source>
- <translation>&amp;نسخ الصورة</translation>
+ <source>%1 m</source>
+ <translation>%1 دقيقة</translation>
</message>
<message>
- <source>Save QR Code</source>
- <translation>Ø­Ùظ رمز الاستجابة السريعة QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>صورة PNG (*.png)</translation>
+ <source>N/A</source>
+ <translation>غير معروÙ</translation>
</message>
-</context>
+ </context>
<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>اسم العميل</translation>
- </message>
- <message>
<source>N/A</source>
<translation>غير معروÙ</translation>
</message>
@@ -832,6 +698,10 @@
<translation>المعلومات</translation>
</message>
<message>
+ <source>Debug window</source>
+ <translation>ناÙذة المعالجة</translation>
+ </message>
+ <message>
<source>General</source>
<translation>عام</translation>
</message>
@@ -860,6 +730,10 @@
<translation>تم الإرسال</translation>
</message>
<message>
+ <source>&amp;Peers</source>
+ <translation>&amp;اصدقاء</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>جهة</translation>
</message>
@@ -900,14 +774,54 @@
<translation>خارج:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>وقت البناء</translation>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;ساعة</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp; يوم</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp; اسبوع</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp; سنة</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>
<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>never</source>
+ <translation>ابدا</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <translation>داخل</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <translation>خارجي</translation>
+ </message>
+ <message>
<source>Yes</source>
<translation>نعم</translation>
</message>
@@ -954,18 +868,6 @@
<source>Remove</source>
<translation>ازل</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation> انسخ التسمية</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>انسخ الرسالة</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>نسخ الكمية</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -985,58 +887,7 @@
<source>&amp;Save Image...</source>
<translation>&amp;Ø­Ùظ الصورة</translation>
</message>
- <message>
- <source>Payment information</source>
- <translation>معلومات الدÙع</translation>
- </message>
- <message>
- <source>URI</source>
- <translation> URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>عنوان</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>المبلغ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>وصÙ</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>رسالة </translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>التاريخ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>وصÙ</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>رسالة </translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>المبلغ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(لا وصÙ)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>( لا رسائل )</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
@@ -1056,6 +907,10 @@
<translation>الكمية :</translation>
</message>
<message>
+ <source>Bytes:</source>
+ <translation>بايت</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>القيمة :</translation>
</message>
@@ -1076,6 +931,22 @@
<translation>تعديل :</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>رسوم المعاملة:</translation>
+ </message>
+ <message>
+ <source>Hide</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>
@@ -1088,6 +959,10 @@
<translation>مسح كل حقول النموذج المطلوبة</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>غبار</translation>
+ </message>
+ <message>
<source>Clear &amp;All</source>
<translation>مسح الكل</translation>
</message>
@@ -1103,64 +978,32 @@
<source>S&amp;end</source>
<translation>&amp;ارسال</translation>
</message>
+</context>
+<context>
+ <name>SendCoinsEntry</name>
<message>
- <source>Confirm send coins</source>
- <translation>تأكيد الإرسال Coins</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 priority</source>
- <translation>نسخ الاÙضلية</translation>
+ <source>A&amp;mount:</source>
+ <translation>&amp;القيمة</translation>
</message>
<message>
- <source>Copy change</source>
- <translation>نسخ التعديل</translation>
+ <source>Pay &amp;To:</source>
+ <translation>ادÙع &amp;الى :</translation>
</message>
<message>
- <source>or</source>
- <translation>أو</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;وص٠:</translation>
</message>
<message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>المبلغ المدÙوع يجب ان يكون اكبر من 0</translation>
+ <source>Choose previously used address</source>
+ <translation>اختر عنوانا مستخدم سابقا</translation>
</message>
<message>
- <source>The amount exceeds your balance.</source>
- <translation>القيمة تتجاوز رصيدك</translation>
+ <source>This is a normal payment.</source>
+ <translation>هذا دÙع اعتيادي</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(لا وصÙ)</translation>
- </message>
- </context>
-<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>Pay &amp;To:</source>
- <translation>ادÙع &amp;الى :</translation>
- </message>
- <message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>إدخال تسمية لهذا العنوان لإضاÙته إلى دÙتر العناوين الخاص بك</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation>&amp;وص٠:</translation>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation>عنوان البت كوين المرسل اليه الدÙع</translation>
</message>
<message>
<source>Alt+A</source>
@@ -1175,9 +1018,17 @@
<translation>Alt+P</translation>
</message>
<message>
+ <source>Remove this entry</source>
+ <translation>ازل هذه المداخله</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>الرسائل</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>ادÙع &amp;الى :</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -1193,6 +1044,10 @@
<translation>&amp;توقيع الرسالة</translation>
</message>
<message>
+ <source>Choose previously used address</source>
+ <translation>اختر عنوانا مستخدم سابقا</translation>
+ </message>
+ <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1232,62 +1087,10 @@
<source>Verify &amp;Message</source>
<translation>تحقق &amp;الرسالة</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>اضغط "توقيع الرسالة" لتوليد التوقيع</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>العنوان المدخل غير صالح</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Ùشل توقيع الرسالة.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>الرسالة موقعة.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Ùضلا تاكد من التوقيع وحاول مرة اخرى</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Ùشلت عملية التأكد من الرسالة.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>تم تأكيد الرسالة.</translation>
- </message>
-</context>
+ </context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>جوهر البيت كوين</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>مطوري جوهر البيت كوين</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1296,342 +1099,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>conflicted</source>
- <translation>يتعارض</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>تأكيد %1</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>الحالة.</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>التاريخ</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>المصدر</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>تم اصداره.</translation>
- </message>
- <message>
- <source>From</source>
- <translation>من</translation>
- </message>
- <message>
- <source>To</source>
- <translation>الى</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>عنوانه</translation>
- </message>
- <message>
- <source>label</source>
- <translation>علامة</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>غير مقبولة</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>دين</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>رسوم المعاملة</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>رسالة </translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>تعليق</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>رقم المعاملة</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>تاجر</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>معاملة</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>المبلغ</translation>
- </message>
- <message>
- <source>true</source>
- <translation>صحيح</translation>
- </message>
- <message>
- <source>false</source>
- <translation>خاطئ</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, لم يتم حتى الآن البث بنجاح</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>غير معروÙ</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>تÙاصيل المعاملة</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>يبين هذا الجزء وصÙا Ù…Ùصلا لهده المعاملة</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>التاريخ</translation>
- </message>
- <message>
- <source>Type</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>
- <message>
- <source>Generated but not accepted</source>
- <translation>ولدت ولكن لم تقبل</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>غير متصل</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>وصÙ</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>استقبل مع</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>استقبل من</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>أرسل إلى</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>دÙع لنÙسك</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Mined</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>غير متوÙر</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>حالة المعاملة. تحوم حول هذا الحقل لعرض عدد التأكيدات.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>التاريخ والوقت الذي تم Ùيه تلقي المعاملة.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>نوع المعاملات</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>المبلغ الذي أزيل أو أضي٠الى الرصيد</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>الكل</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>اليوم</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>هدا الاسبوع</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>هدا الشهر</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>الشهر الماضي</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>هدا العام</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>المدى...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>استقبل مع</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>أرسل إلى</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>إليك</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Mined</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>اخرى</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>ادخل عنوان أووص٠للبحث</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>الحد الأدنى</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation> انسخ عنوان</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation> انسخ التسمية</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>نسخ الكمية</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>نسخ رقم العملية</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>عدل الوصÙ</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>عرض تÙاصيل المعاملة</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Ùشل التصدير</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>نجح التصدير</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>مل٠مÙصول بÙواصل (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>تأكيد</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>التاريخ</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>النوع</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>وصÙ</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>عنوان</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>العنوان</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>المدى:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>الى</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>إرسال Coins</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;تصدير</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>تحميل البيانات ÙÙŠ علامة التبويب الحالية إلى ملÙ.</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>نسخ احتياط للمحÙظة</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Ùشل النسخ الاحتياطي</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>نجاح النسخ الاحتياطي</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1646,6 +1123,10 @@
<translation>قبول الاتصالات من خارج</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>جوهر البيت كوين</translation>
+ </message>
+ <message>
<source>Error: Disk space is low!</source>
<translation>تحذير: مساحة القرص منخÙضة</translation>
</message>
@@ -1690,34 +1171,34 @@
<translation>تحذير</translation>
</message>
<message>
- <source>This help message</source>
- <translation>رسالة المساعدة هذه</translation>
- </message>
- <message>
<source>Loading addresses...</source>
<translation>تحميل العنوان</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>خطأ عند تنزيل wallet.dat: المحÙظة تالÙØ©</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>خطأ عند تنزيل wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>عنوان البروكسي غير صحيح : '%s'</translation>
</message>
<message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>إنتاج معاملات بث المحÙظة</translation>
+ </message>
+ <message>
<source>Insufficient funds</source>
<translation>اموال غير كاÙية</translation>
</message>
<message>
+ <source>Loading block index...</source>
+ <translation>تحميل مؤشر الكتلة</translation>
+ </message>
+ <message>
<source>Loading wallet...</source>
<translation>تحميل المحÙظه</translation>
</message>
<message>
+ <source>Cannot downgrade wallet</source>
+ <translation>لا يمكن تخÙيض قيمة المحÙظة</translation>
+ </message>
+ <message>
<source>Cannot write default address</source>
<translation>لايمكن كتابة العنوان الاÙتراضي</translation>
</message>
diff --git a/src/qt/locale/bitcoin_be_BY.ts b/src/qt/locale/bitcoin_be_BY.ts
index 3343781b76..5894148fe0 100644
--- a/src/qt/locale/bitcoin_be_BY.ts
+++ b/src/qt/locale/bitcoin_be_BY.ts
@@ -26,10 +26,6 @@
<translation>Зачыніць</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>КапіÑваць адраÑ</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Выдаліць абраны Ð°Ð´Ñ€Ð°Ñ Ñа ÑпіÑу</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>Выдаліць</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>
- <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>
- <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>
- <message>
- <source>Exporting Failed</source>
- <translation>ЭкÑпартаванне нÑўдалае</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдраÑ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>непазначаны</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Паўтарыце новую кодавую фразу</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Зашыфраваць гаманец.</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>ГÑÑ‚Ð°Ñ Ð°Ð¿ÐµÑ€Ð°Ñ†Ñ‹Ñ Ð¿Ð°Ñ‚Ñ€Ð°Ð±ÑƒÐµ кодавую фразу, каб рзблакаваць гаманец.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Разблакаваць гаманец</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>ГÑÑ‚Ð°Ñ Ð°Ð¿ÐµÑ€Ð°Ñ†Ñ‹Ñ Ð¿Ð°Ñ‚Ñ€Ð°Ð±ÑƒÐµ пароль каб раÑшыфраваць гаманец.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Рачшыфраваць гаманец</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>ЗмÑніць пароль</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Wallet encrypted</source>
- <translation>Гаманец зашыфраваны</translation>
- </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>УвÑдзіце новы пароль Ð´Ð»Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ð°.&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>
- <translation>Шыфраванне гаманца нÑўдалае</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Шыфраванне гаманца не адбылоÑÑ Ð·-за ўнутранай памылкі. Гаманец незашыфраваны.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Ð£Ð²ÐµÐ´Ð´Ð·ÐµÐ½Ñ‹Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ– не Ñупадаюць</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Разблакаванне гаманца нÑўдалае</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Уведзены пароль Ð´Ð»Ñ Ñ€Ð°ÑÑˆÑ‹Ñ„Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ð° памылковы</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>РаÑшыфраванне гаманца нÑўдалае</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° гаманца паÑпÑхова зменена.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -298,14 +139,6 @@
<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>
@@ -350,10 +183,6 @@
<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>
@@ -386,22 +215,10 @@
<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>
@@ -417,10 +234,6 @@
<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><numerusform>%n актыўных злучÑннÑÑž з Ñецівам Bitcoin</numerusform><numerusform>%n актыўных злучÑннÑÑž з Ñецівам Bitcoin</numerusform></translation>
@@ -533,13 +346,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Трывога Сеціва</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -609,111 +415,7 @@
<source>Priority</source>
<translation>ПрыÑрытÑÑ‚</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>КапіÑваць адраÑ</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>КапіÑваць пазнаку</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>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>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -728,34 +430,6 @@
<source>&amp;Address</source>
<translation>ÐдраÑ</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Ðовы Ð°Ð´Ñ€Ð°Ñ Ð´Ð»Ñ Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½Ð½Ñ</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Ðовы Ð°Ð´Ñ€Ð°Ñ Ð´Ð»Ñ Ð´Ð°ÑыланнÑ</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>РÑдагаваць Ð°Ð´Ñ€Ð°Ñ Ð¿Ñ€Ñ‹Ð¼Ð°Ð½Ð½Ñ</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>РÑдагаваць Ð°Ð´Ñ€Ð°Ñ Ð´Ð°ÑыланнÑ</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Уведзены Ð°Ð´Ñ€Ð°Ñ "%1" ужо Ñž кніге адраÑоў</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ðемагчыма разблакаваць гаманец</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ‹Ñ Ð½Ð¾Ð²Ð°Ð³Ð° ключа нÑўдалаÑ</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -775,18 +449,10 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</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>
@@ -798,7 +464,7 @@
<source>command-line options</source>
<translation>опцыі каманднага радка</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -806,14 +472,6 @@
<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>
@@ -843,6 +501,10 @@
<source>MB</source>
<translation>Мб</translation>
</message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>Гаманец</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
@@ -852,9 +514,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -865,66 +524,32 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
- </context>
-<context>
- <name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>Метка:</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>КапіÑваць пазнаку</translation>
+ <source>&amp;Information</source>
+ <translation>ІнфармацыÑ</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>КапіÑваць колькаÑць</translation>
+ <source>Debug window</source>
+ <translation>Вакно адладкі</translation>
</message>
-</context>
+ </context>
<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>ÐдраÑ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>КолькаÑць</translation>
- </message>
+ <name>ReceiveCoinsDialog</name>
<message>
- <source>Label</source>
- <translation>Метка</translation>
+ <source>&amp;Amount:</source>
+ <translation>&amp;КолькаÑць:</translation>
</message>
<message>
- <source>Message</source>
- <translation>Паведамленне</translation>
+ <source>&amp;Label:</source>
+ <translation>Метка:</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Метка</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Паведамленне</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>КолькаÑць</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
<message>
- <source>(no label)</source>
- <translation>непазначаны</translation>
+ <source>Copy &amp;Address</source>
+ <translation>КапіÑваць адраÑ</translation>
</message>
</context>
<context>
@@ -934,6 +559,10 @@
<translation>ДаÑлаць Манеты</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>ÐедаÑтаткова Ñродкаў</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>КолькаÑць:</translation>
</message>
@@ -973,46 +602,6 @@
<source>Confirm the send action</source>
<translation>Пацвердзіць даÑыланне</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <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>
- <message>
- <source>(no label)</source>
- <translation>непазначаны</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>КапіÑваць пыл</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1025,10 +614,6 @@
<translation>Заплаціць да:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>УвÑдзіце пазнаку гÑтаму адраÑу, каб дадаць Ñго Ñž адраÑную кнігу</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>Метка:</translation>
</message>
@@ -1045,6 +630,14 @@
<translation>Alt+P</translation>
</message>
<message>
+ <source>Message:</source>
+ <translation>Паведамленне:</translation>
+ </message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Заплаціць да:</translation>
+ </message>
+ <message>
<source>Memo:</source>
<translation>ПамÑтка:</translation>
</message>
@@ -1070,14 +663,6 @@
<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>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1090,274 +675,16 @@
</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>
- <message>
- <source>%1 confirmations</source>
- <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>
- <message>
- <source>Amount</source>
- <translation>КолькаÑць</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, пакуль не было паÑпÑхова транÑлÑвана</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>невÑдома</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>ДÑталі транзакцыі</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>ГÑÑ‚Ð°Ñ Ð¿Ð°Ð½Ñль паказвае дÑтальнае апіÑанне транзакцыі</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тып</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Пацверджана (%1 пацверджаннÑÑž)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>ГÑÑ‚Ñ‹ блок не быў прынÑÑ‚Ñ‹ іншымі вузламі Ñ– магчыма не будзе ўхвалены!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Згенеравана, але не прынÑта</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Метка</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>ПрынÑта з</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>ПрынÑта ад</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>ДаÑлана да</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Плацёж Ñамому Ñабе</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Здабыта</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ‹Ñ–. ÐавÑдзіце курÑар на гÑтае поле, каб паказаць колькаÑць пацверджаннÑÑž.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Дата Ñ– чаÑ, калі Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ‹Ñ Ð±Ñ‹Ð»Ð° прынÑта.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Тып транзакцыі</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>КолькаÑць аднÑÑ‚Ð°Ñ Ñ†Ñ– Ð´Ð°Ð´Ð°Ð½Ð°Ñ Ð´Ð° баланÑу.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>УÑÑ‘</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>СённÑ</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>ГÑÑ‚Ñ‹ тыдзень</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>ГÑÑ‚Ñ‹ меÑÑц</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Мінулы меÑÑц</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>ГÑÑ‚Ñ‹ год</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Прамежак...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>ПрынÑта з</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>ДаÑлана да</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Да ÑÑбе</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Здабыта</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>ІншыÑ</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>УвÑдзіце Ð°Ð´Ñ€Ð°Ñ Ñ†Ñ– пазнаку Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Мін. колькаÑць</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>КапіÑваць адраÑ</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>КапіÑваць пазнаку</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>КапіÑваць колькаÑць</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>КапіÑваць ID транзакцыі</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>РÑдагаваць пазнаку</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ЭкÑпартаванне нÑўдалае</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>КоÑкамі падзелены файл (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Пацверджана</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тып</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Метка</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдраÑ</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Прамежак:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>да</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>ДаÑлаць Манеты</translation>
- </message>
-</context>
-<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>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1376,6 +703,10 @@
<translation>ЗапуÑціць у фоне Ñк дÑман Ñ– прымаць каманды</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation>Ці жадаеце вы перабудаваць зараз базу звеÑтак блокаў?</translation>
</message>
@@ -1424,10 +755,6 @@
<translation>Опцыі гаманца:</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>ÐÐºÑ‚Ñ‹Ð²Ð°Ñ†Ñ‹Ñ Ð»ÐµÐ¿ÑˆÐ°Ð³Ð° ланцуга...</translation>
- </message>
- <message>
<source>Information</source>
<translation>ІнфармацыÑ</translation>
</message>
@@ -1476,14 +803,6 @@
<translation>Загружаем адраÑÑ‹...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Памылка загрузкі wallet.dat: гаманец пашкоджаны</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Памылка загрузкі wallet.dat</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>ÐедаÑтаткова Ñродкаў</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts
index be5aec371b..acb60cf41c 100644
--- a/src/qt/locale/bitcoin_bg.ts
+++ b/src/qt/locale/bitcoin_bg.ts
@@ -26,10 +26,6 @@
<translation>Затвори</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Копирай адреÑ</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Изтрий Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑ Ð¾Ñ‚ ÑпиÑъка</translation>
</message>
@@ -45,73 +41,6 @@
<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>
- <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>
- <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>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Редактирай</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>ИзнаÑÑне на ÑпиÑъка Ñ Ð°Ð´Ñ€ÐµÑи</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>CSV файл (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Грешка при изнаÑÑнето</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без име)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,91 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Въведете новата парола повторно</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Шифриране на портфейла</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Тази Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¸Ñква Вашата парола за отключване на портфейла.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Отключване на портфейла</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Тази Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¸Ñква Вашата парола за дешифриране на портфейла.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Дешифриране на портфейла</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>СмÑна на паролата</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Внимание: Caps Lock (главни букви) е включен.</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Портфейлът е шифриран</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Шифрирането беше неуÑпешно</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Шифрирането на портфейла беше неуÑпешно, поради Ñофтуерен проблем. Портфейлът не е шифриран.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Паролите не Ñъвпадат</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>ÐеуÑпешно отключване на портфейла</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Паролата въведена за дешифриране на портфейла е грешна.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Дешифрирането на портфейла беше неуÑпешно</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Netmask</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Паролата на портфейла беше променена уÑпешно.</translation>
+ <source>Banned Until</source>
+ <translation>Ð¡ÑŠÑ Ð·Ð°Ð±Ñ€Ð°Ð½ÐµÐ½ доÑтъп до</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -254,6 +111,14 @@
<translation>Изход от приложението</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>ОтноÑно %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Покажи Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>За &amp;Qt</translation>
</message>
@@ -266,6 +131,10 @@
<translation>&amp;Опции...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Промени наÑтройки за %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>&amp;Шифриране на портфейла...</translation>
</message>
@@ -290,8 +159,8 @@
<translation>Отвори &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core клиент</translation>
+ <source>Reindexing blocks on disk...</source>
+ <translation>Повторно индекÑиране на блоковете на диÑка...</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -334,10 +203,6 @@
<translation>&amp;Получаване</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Покажете Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Биткойн Ñдрото</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Показване / Скриване</translation>
</message>
@@ -374,18 +239,10 @@
<translation>Раздели</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Биткойн Ñдро</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>ИзиÑкване на плащаниÑ(генерира QR кодове и биткойн: URIs)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;ОтноÑно Bitcoin Core</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Показване на ÑпиÑъка Ñ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸ адреÑи и имена</translation>
</message>
@@ -401,18 +258,46 @@
<source>&amp;Command-line options</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>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Покажи помощните ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° Биткойн за да видиш наличните и валидни команди</translation>
+ <source>Indexing blocks on disk...</source>
+ <translation>ИндекÑиране на блокове на диÑка...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Обработване на блокове на диÑка...</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></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>
@@ -442,10 +327,48 @@
<translation>Синхронизиран</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Покажи %1 помощно Ñъобщение за да получиш лиÑÑ‚ Ñ Ð²ÑŠÐ·Ð¼Ð¾Ð¶Ð½Ð¸ Биткойн команди</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 клиент</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<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>
@@ -463,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Мрежови проблем</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -547,134 +463,6 @@
<source>Priority</source>
<translation>Приоритет</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Копирай адреÑ</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Копирай име</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Този етикет Ñтава червен, когато размера на транзакциÑта е по-голÑма от 1000 бита.</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>Can vary +/- 1 byte per input.</source>
- <translation>Може да варира Ñ +-1 байт</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без име)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>реÑто от %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(промени)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -687,40 +475,16 @@
<translation>&amp;Име</translation>
</message>
<message>
- <source>&amp;Address</source>
- <translation>&amp;ÐдреÑ</translation>
- </message>
- <message>
- <source>New receiving address</source>
- <translation>Ðов Ð°Ð´Ñ€ÐµÑ Ð·Ð° получаване</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Ðов Ð°Ð´Ñ€ÐµÑ Ð·Ð° изпращане</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Редактиране на Ð°Ð´Ñ€ÐµÑ Ð·Ð° получаване</translation>
+ <source>The label associated with this address list entry</source>
+ <translation>Етикетът Ñвързан Ñ Ñ‚Ð¾Ð²Ð° въведение в лиÑта Ñ Ð°Ð´Ñ€ÐµÑи</translation>
</message>
<message>
- <source>Edit sending address</source>
- <translation>Редактиране на Ð°Ð´Ñ€ÐµÑ Ð·Ð° изпращане</translation>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation>ÐдреÑÑŠÑ‚ Ñвързан Ñ Ñ‚Ð¾Ð²Ð° въведение в лиÑта Ñ Ð°Ð´Ñ€ÐµÑи. Това може да бъде променено Ñамо за адреÑи за изпращане.</translation>
</message>
<message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Вече има Ð°Ð´Ñ€ÐµÑ "%1" в ÑпиÑъка Ñ Ð°Ð´Ñ€ÐµÑи.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>"%1" не е валиден Биткоин адреÑ.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Отключването на портфейла беше неуÑпешно.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Създаването на ключ беше неуÑпешно.</translation>
+ <source>&amp;Address</source>
+ <translation>&amp;ÐдреÑ</translation>
</message>
</context>
<context>
@@ -749,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Биткойн Ñдро</translation>
- </message>
- <message>
<source>version</source>
<translation>верÑиÑ</translation>
</message>
@@ -761,8 +521,8 @@
<translation>(%1-битов)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>ОтноÑно Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>ОтноÑно %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -776,6 +536,34 @@
<source>command-line options</source>
<translation>СпиÑък Ñ Ð½Ð°Ð»Ð¸Ñ‡Ð½Ð¸ команди</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>Опции на интерфейÑ:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Избери Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° данни при Ñтартирване (по подразбиране: %u)</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>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Задай SSL root Ñертификат за молба за изплащане (по подразбиране: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Покажи splash екран при Ñтартирване (по подразбиране %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Ðулиране на вÑички наÑтройки променени в GUI</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -784,12 +572,8 @@
<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>
+ <source>Welcome to %1.</source>
+ <translation>Добре дошли в %1.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -800,20 +584,32 @@
<translation>Използване на Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ€ÑŠÑ‡Ð½Ð¾</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Биткойн Ñдро</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><numerusform>%n GB Ñвободно проÑтранÑтво на разположение</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(%n GB е нужен)</numerusform><numerusform>(%n GB Ñа нужни)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
<source>Open URI</source>
<translation>ОтварÑне на URI</translation>
</message>
+ <message>
+ <source>Open payment request from URI or file</source>
+ <translation>Отвори молба за изплащане от URI или файл</translation>
+ </message>
+ <message>
+ <source>URI:</source>
+ <translation>URI:</translation>
+ </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -834,6 +630,10 @@
<translation>Мегабайта</translation>
</message>
<message>
+ <source>Number of script &amp;verification threads</source>
+ <translation>Брой на Ñкриптове и &amp;нишки за потвърждение</translation>
+ </message>
+ <message>
<source>Accept connections from outside</source>
<translation>Приемай връзки отвън</translation>
</message>
@@ -862,10 +662,6 @@
<translation>&amp;Мрежа</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Ðвтоматично Ñтартиране на Bitcoin Core Ñлед влизане в ÑиÑтемата.</translation>
- </message>
- <message>
<source>W&amp;allet</source>
<translation>По&amp;ртфейл</translation>
</message>
@@ -874,6 +670,10 @@
<translation>ЕкÑперт</translation>
</message>
<message>
+ <source>Enable coin &amp;control features</source>
+ <translation>ПозволÑване на монетите и &amp;техните възможноÑти</translation>
+ </message>
+ <message>
<source>&amp;Spend unconfirmed change</source>
<translation>&amp;Похарчете непотвърденото реÑто</translation>
</message>
@@ -1030,73 +830,6 @@
</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>Payment request expired.</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>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>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Грешка в мрежата по време на заÑвката</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1147,31 +880,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <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>
- <source>Client name</source>
- <translation>Име на клиента</translation>
- </message>
- <message>
<source>N/A</source>
<translation>ÐеÑъщеÑтвуващ</translation>
</message>
@@ -1192,10 +902,6 @@
<translation>ОÑновни</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Използване на OpenSSL верÑиÑ</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Използване на база данни BerkeleyDB </translation>
</message>
@@ -1300,10 +1006,6 @@
<translation>ИзходÑщи</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Дата на Ñъздаване</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Лог файл,Ñъдържащ грешките</translation>
</message>
@@ -1410,18 +1112,6 @@
<source>Remove</source>
<translation>Премахване</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Копирай име</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Копиране на Ñъобщението</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Копирай Ñума</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1441,65 +1131,6 @@
<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>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сума</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Име</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Съобщение</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Грешка при Ñъздаването на QR Code от URI.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Име</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Съобщение</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сума</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без име)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(без Ñъобщение)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(липÑва Ñума)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1623,86 +1254,6 @@
<source>S&amp;end</source>
<translation>И&amp;зпрати</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <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>Copy change</source>
- <translation>Копирай реÑтото</translation>
- </message>
- <message>
- <source>or</source>
- <translation>или</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Сумата Ñ‚Ñ€Ñбва да е по-голÑма от 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <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>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>ЗаÑвката за плащане е изтекла.</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>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1715,10 +1266,6 @@
<translation>Плати &amp;Ðа:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Въведете име за този адреÑ, за да го добавите в ÑпиÑъка Ñ Ð°Ð´Ñ€ÐµÑи</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Име:</translation>
</message>
@@ -1762,10 +1309,6 @@
<context>
<name>ShutdownWindow</name>
<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>
@@ -1832,70 +1375,10 @@
<source>Verify &amp;Message</source>
<translation>Потвърди &amp;Ñъобщението</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>ÐатиÑнете "ПодпиÑване на Ñъобщение" за да Ñъздадете подпиÑ</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>ВъведениÑÑ‚ Ð°Ð´Ñ€ÐµÑ Ðµ невалиден.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>ПодпиÑването на Ñъобщение беше неуÑпешно.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Съобщението е подпиÑано.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>ПодпиÑÑŠÑ‚ не може да бъде декодиран.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Проверете подпиÑа и опитайте отново.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>ПодпиÑÑŠÑ‚ не Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° комбинациÑта от Ñъобщение и адреÑ.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Проверката на Ñъобщението беше неуÑпешна.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Съобщението е потвърдено.</translation>
- </message>
-</context>
+ </context>
<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>
@@ -1908,434 +1391,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Подлежи на промÑна до %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>припокриващ Ñе</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/офлайн</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/непотвърдени</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>включена в %1 блока</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>СтатуÑ</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Източник</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Издадени</translation>
- </message>
- <message>
- <source>From</source>
- <translation>От</translation>
- </message>
- <message>
- <source>To</source>
- <translation>За</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>ÑобÑтвен адреÑ</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>Ñамо гледане</translation>
- </message>
- <message>
- <source>label</source>
- <translation>име</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Кредит</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>не е приет</translation>
- </message>
- <message>
- <source>Debit</source>
- <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>
- <message>
- <source>Net amount</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>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>ТранзакциÑ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сума</translation>
- </message>
- <message>
- <source>true</source>
- <translation>true</translation>
- </message>
- <message>
- <source>false</source>
- <translation>false</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, вÑе още не е изпратено</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>неизвеÑтен</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>ТранзакциÑ</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>ОпиÑание на транзакциÑта</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тип</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>Ðеплатим (%1 потвърждениÑ, ще бъде платим Ñлед %2)</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Подлежи на промÑна до %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Потвърдени (%1 потвърждениÑ)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Блокът не е получен от оÑтаналите учаÑтници и най-вероÑтно нÑма да бъде одобрен.</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Генерирана, но отхвърлена от мрежата</translation>
- </message>
- <message>
- <source>Offline</source>
- <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>Потвърждаване (%1 от %2 препоръчвани потвърждениÑ)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Конфликтно</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Получени</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Получен от</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Изпратени на</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Плащане към Ñебе Ñи</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Емитирани</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>Ñамо гледане</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>СъÑтоÑние на транзакциÑта. Задръжте върху това поле за брой потвърждениÑ.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Дата и Ñ‡Ð°Ñ Ð½Ð° получаване на транзакциÑта.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Вид транзакциÑ.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Сума извадена или добавена към баланÑа.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Ð’Ñички</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>ДнеÑ</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Тази Ñедмица</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Този меÑец</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>ÐŸÑ€ÐµÐ´Ð½Ð¸Ñ Ð¼ÐµÑец</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Тази година</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>От - до...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Получени</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Изпратени на</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>СобÑтвени</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Емитирани</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Други</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>ТърÑене по Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ име</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Минимална Ñума</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Копирай адреÑ</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Копирай име</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>ИзнаÑÑне иÑториÑта на транзакциите</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Грешка при изнаÑÑнето</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>Потвърдени</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тип</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Име</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ИД</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>От:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>до</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>ÐÑма зареден портфейл.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Изпращане</translation>
- </message>
-</context>
-<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>
- <message>
- <source>Backup Wallet</source>
- <translation>Запазване на портфейла</translation>
- </message>
- <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>
<source>Options:</source>
@@ -2358,6 +1423,10 @@
<translation>Приемайте връзки отвън.(по подразбиране:1 в противен Ñлучай -proxy или -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Биткойн Ñдро</translation>
+ </message>
+ <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Сложете в бÑл ÑпиÑък пиъри,Ñвързващи Ñе от дадената интернет маÑка или айпи адреÑ.Може да бъде заложено неколкократно.</translation>
</message>
@@ -2402,30 +1471,14 @@
<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>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>
</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>
@@ -2458,22 +1511,10 @@
<translation>Парола за JSON-RPC връзките</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Това помощно Ñъобщение</translation>
- </message>
- <message>
<source>Loading addresses...</source>
<translation>Зареждане на адреÑи...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Грешка при зареждане на wallet.dat: портфейлът е повреден</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Грешка при зареждане на wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Ðевалиден -proxy address: '%s'</translation>
</message>
@@ -2490,10 +1531,6 @@
<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_bg_BG.ts b/src/qt/locale/bitcoin_bg_BG.ts
index d1157a8e44..4bddb5ff4a 100644
--- a/src/qt/locale/bitcoin_bg_BG.ts
+++ b/src/qt/locale/bitcoin_bg_BG.ts
@@ -14,6 +14,10 @@
<translation>Ðов</translation>
</message>
<message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>Копирай текущо Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑ ÐºÑŠÐ¼ клипборда</translation>
+ </message>
+ <message>
<source>&amp;Copy</source>
<translation>Копирай</translation>
</message>
@@ -21,29 +25,143 @@
<source>C&amp;lose</source>
<translation>Затвори</translation>
</message>
- </context>
-<context>
- <name>AddressTableModel</name>
- </context>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Изтрий текущо Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑ Ð¾Ñ‚ лиÑта</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>ИзнеÑи данните в Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð´ÐµÐ» към файл</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>ИзнеÑи</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>Изтрий</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
- </context>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation>Диалог за пропуÑк</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation>Въведи парола</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation>Ðова парола</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Повтори парола</translation>
+ </message>
+</context>
<context>
<name>BanTableModel</name>
- </context>
+ <message>
+ <source>IP/Netmask</source>
+ <translation>IP/Мрежова маÑка</translation>
+ </message>
+ <message>
+ <source>Banned Until</source>
+ <translation>Блокиран до</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Биткойн Ñдро</translation>
+ <source>Sign &amp;message...</source>
+ <translation>Подпиши Ñъобщение...</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>За Биткойн Ñдрото</translation>
+ <source>Synchronizing with network...</source>
+ <translation>Синхронизиране Ñ Ð¼Ñ€ÐµÐ¶Ð°Ñ‚Ð°...</translation>
+ </message>
+ <message>
+ <source>&amp;Overview</source>
+ <translation>Преглед</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>Транзакции</translation>
+ </message>
+ <message>
+ <source>Browse transaction history</source>
+ <translation>Разгледай иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° транзакциите</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation>Изход</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation>Излез от приложението</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation>За %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Покажи Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° %1</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>ОтноÑно Qt</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation>Покажи Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñтно Qt</translation>
+ </message>
+ <message>
+ <source>&amp;Options...</source>
+ <translation>ÐаÑтройки...</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation>Промени конфигурации за %1</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet...</source>
+ <translation>Криптирай портфейл</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet...</source>
+ <translation>Ðаправи резервно копие на портфейла...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase...</source>
+ <translation>Промени паролата...</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>Отвори URI</translation>
+ </message>
+ <message>
+ <source>Reindexing blocks on disk...</source>
+ <translation>Повторно индекÑиране на блоковете на диÑка...</translation>
</message>
- </context>
-<context>
- <name>ClientModel</name>
</context>
<context>
<name>CoinControlDialog</name>
@@ -56,17 +174,9 @@
</context>
<context>
<name>HelpMessageDialog</name>
- <message>
- <source>Bitcoin Core</source>
- <translation>Биткойн Ñдро</translation>
- </message>
</context>
<context>
<name>Intro</name>
- <message>
- <source>Bitcoin Core</source>
- <translation>Биткойн Ñдро</translation>
- </message>
</context>
<context>
<name>OpenURIDialog</name>
@@ -78,18 +188,12 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -99,9 +203,6 @@
<name>ReceiveRequestDialog</name>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- </context>
-<context>
<name>SendCoinsDialog</name>
</context>
<context>
@@ -115,39 +216,21 @@
</context>
<context>
<name>SplashScreen</name>
- <message>
- <source>Bitcoin Core</source>
- <translation>Биткойн Ñдро</translation>
- </message>
</context>
<context>
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- </context>
-<context>
- <name>TransactionView</name>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Биткойн Ñдро</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts
index 5a0e36de9e..ed259c4d08 100644
--- a/src/qt/locale/bitcoin_ca.ts
+++ b/src/qt/locale/bitcoin_ca.ts
@@ -26,10 +26,6 @@
<translation>&amp;Tanca</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copia l'adreça</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Elimina l'adreça sel·leccionada actualment de la llista</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Elimina</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Trieu una adreça on voleu enviar monedes</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Trieu l'adreça on voleu rebre monedes</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>T&amp;ria</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>S'estan enviant les adreces</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>S'estan rebent les adreces</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>Aquestes són les vostres adreces de Bitcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes.</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>Aquestes són les vostres adreces Bitcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copia l'&amp;etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Edita</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exporta la llista d'adreces</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fitxer de separació amb comes (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>L'exportació ha fallat</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>S'ha produït un error en desar la llista d'adreces a %1. Torneu-ho a provar.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Repetiu la nova contrasenya</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Encripta el moneder</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Aquesta operació requereix la contrasenya del moneder per a desbloquejar-lo.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloqueja el moneder</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Aquesta operació requereix la contrasenya del moneder per desencriptar-lo.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desencripta el moneder</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Canvia la contrasenya</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirma l'encriptació del moneder</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>Avís: si encripteu el vostre moneder i perdeu la contrasenya, &lt;b&gt;PERDREU TOTS ELS VOSTRES BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Esteu segur que voleu encriptar el vostre moneder?</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>Ara es tancarà el Bitcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres bitcoins no puguin ser robades per programari maliciós que infecti l'ordinador.</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: Tota copia de seguretat que hàgiu realitzat hauria de ser reemplaçada pel, recentment generat, fitxer encriptat del moneder.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Avís: Les lletres majúscules estan activades!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Moneder encriptat</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Introduïu la contrasenya antiga i la contrasenya nova al moneder.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>L'encriptació del moneder ha fallat</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>L'encriptació del moneder ha fallat per un error intern. El moneder no ha estat encriptat.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>La contrasenya introduïda no coincideix.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>El desbloqueig del moneder ha fallat</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contrasenya introduïda per a desencriptar el moneder és incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>La desencriptació del moneder ha fallat</translation>
+ <source>IP/Netmask</source>
+ <translation>IP / Màscara de xarxa</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>La contrasenya del moneder ha estat modificada correctament.</translation>
+ <source>Banned Until</source>
+ <translation>Bandejat fins</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -298,14 +147,6 @@
<translation>Obre un &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Client del Bitcoin Core</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>S'estan important els blocs del disc...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>S'estan reindexant els blocs al disc...</translation>
</message>
@@ -350,10 +191,6 @@
<translation>&amp;Rep</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Mostra informació del Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Mostra / Amaga</translation>
</message>
@@ -390,22 +227,10 @@
<translation>Barra d'eines de les pestanyes</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Sol·licita pagaments (genera codis QR i bitcoin: URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Quant al Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Modifica les opcions de configuració del Bitcoin Core</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Mostra la llista d'adreces d'enviament i etiquetes utilitzades</translation>
</message>
@@ -421,10 +246,6 @@
<source>&amp;Command-line options</source>
<translation>Opcions de la &amp;línia d'ordres</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Mostra el missatge d'ajuda del Bitcoin Core per obtenir una llista amb les possibles opcions de línia d'ordres de Bitcoin</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n connexió activa a la xarxa Bitcoin</numerusform><numerusform>%n connexions actives a la xarxa Bitcoin</numerusform></translation>
@@ -537,13 +358,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta de xarxa</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -621,150 +435,6 @@
<source>Priority</source>
<translation>Prioritat</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar adreça </translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de transacció</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloqueja sense gastar</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Desbloqueja sense gastar</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copia la quantitat</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copia la comissió</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia la comissió posterior</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copia els bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia la prioritat</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copia el polsim</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia el canvi</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>El més alt</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>Més alt</translation>
- </message>
- <message>
- <source>high</source>
- <translation>Alt</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>mig-alt</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>mig</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>baix-mig</translation>
- </message>
- <message>
- <source>low</source>
- <translation>baix</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>més baix</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>el més baix</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloquejada)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>cap</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Aquesta etiqueta es torna en vermell si la transacció és superior a 1000 bytes.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>Aquesta etiqueta es torna en vermell si la propietat és inferior que la «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 el destinatari rep un import inferior de %1.</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Pot variar +/- %1 satoshi(s) per entrada.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>sí</translation>
- </message>
- <message>
- <source>no</source>
- <translation>no</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Pot variar +/- 1 byte per entrada.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Les transaccions amb una major prioritat són més propenses a ser incloses en un bloc.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>canvia de %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(canvia)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -788,38 +458,6 @@
<source>&amp;Address</source>
<translation>&amp;Adreça</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nova adreça de recepció.</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nova adreça d'enviament</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Edita les adreces de recepció</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Edita les adreces d'enviament</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>L'adreça introduïda «%1» ja és present a la llibreta d'adreces.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>L'adreça introduïda «%1» no és una adreça de Bitcoin vàlida.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>No s'ha pogut desbloquejar el moneder.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ha fallat la generació d'una nova clau.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -847,10 +485,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>versió</translation>
</message>
@@ -859,10 +493,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Quant al Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Opcions de línia d'ordres</translation>
</message>
@@ -874,24 +504,36 @@
<source>command-line options</source>
<translation>Opcions de la línia d'ordres</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Us donem la benviguda</translation>
+ <source>UI Options:</source>
+ <translation>Opcions d'interfície d'usuari:</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Us donem la benvinguda al Bitcoin Core.</translation>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Trieu el directori de dades a l'inici (per defecte: %u)</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>Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Bitcoin Core les dades.</translation>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Defineix la llengua, per exemple «de_DE» (per defecte: la definida pel sistema)</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>El Bitcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Bitcoin. Com a mínim s'emmagatzemaran %1 GB de dades en aquest directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder.</translation>
+ <source>Start minimized</source>
+ <translation>Inicia minimitzat</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Defineix els certificats arrel SSL per a la sol·licitud de pagament (per defecte: els del sistema)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Mostra la pantalla de benvinguda a l'inici (per defecte: %u)</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>Us donem la benviguda</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -902,10 +544,6 @@
<translation>Utilitza un directori de dades personalitzat:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Error: el directori de dades «%1» especificat no pot ser creat.</translation>
</message>
@@ -940,10 +578,6 @@
<source>Select payment request file</source>
<translation>Selecciona un fitxer de sol·licitud de pagament</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Selecciona el fitxer de sol·licitud de pagament per obrir</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -984,10 +618,6 @@
<translation>Minimitza en comptes de sortir de l'aplicació quan la finestra es tanca. Quan s'habilita aquesta opció l'aplicació es tancara només quan se selecciona Surt del menú. </translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>La interfície d'usuari pot definir-se des d'aquí. El paràmetre tindrà efecte després de reiniciar el 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 de terceres parts (p. ex. explorador de blocs) que apareix en la pestanya de transaccions com elements del menú contextual. %s en l'URL es reemplaçat pel resum de la transacció. Diferents URL estan separades per una barra vertical |.</translation>
</message>
@@ -1012,14 +642,6 @@
<translation>&amp;Xarxa</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Inicia el Bitcoin Core automàticament després d'iniciar una sessió en el sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Inicia el Bitcoin Core en inciar el sistema</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt;0 = deixa tants nuclis lliures)</translation>
</message>
@@ -1072,6 +694,34 @@
<translation>Port del proxy (per exemple 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Utilitzat per arribar als iguals mitjançant:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Mostra si el proxy SOCKS5 per defecte proporcionat s'utilitza per arribar als iguals mitjançant aquest tipus de xarxa.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Conectar a la red de Bitcoin a través de un proxy SOCKS5 per als serveis ocults de Tor</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Utilitza un proxy SOCKS4 apart per a arribar als iguals a través de serveis ocults de Tor:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Finestra</translation>
</message>
@@ -1220,97 +870,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Gestió d'URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Adreça de pagament no vàlida %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>La sol·licitud de pagament s'ha rebutjat</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>La xarxa de la sol·licitud de pagament no coincideix amb la xarxa del client.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>La sol·licitud de pagament no està inicialitzada.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>L'import de pagament sol·licitat %1 és massa petit (es considera polsim).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Error en la sol·licitud de pagament</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>No es pot iniciar bitcoin: gestor clica-per-pagar</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>L'URL de recuperació de la sol·licitud de pagament no és vàlida: %1</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>L'URI no pot ser analitzat! Això pot ser a causa d'una adreça de Bitcoin no vàlida o per paràmetres URI amb mal format.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Gestió de fitxers de les sol·licituds de pagament</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>No es pot llegir el fitxer de la sol·licitud de pagament. Això pot ser causat per un fitxer de sol·licitud de pagament no vàlid.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>La sol·licitud de pagament ha vençut.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>No s'accepten sol·licituds de pagament no verificades a scripts de pagament personalitzats.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Sol·licitud de pagament no vàlida.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <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>Error communicating with %1: %2</source>
- <translation>Error en comunicar amb %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>No es pot analitzar la sol·licitud de pagament!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Mala resposta del servidor %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pagament reconegut</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Error en la sol·licitud de xarxa</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1365,31 +924,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>De&amp;sa la imatge...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copia la imatge</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Desa el codi QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Imatge PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nom del client</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1410,10 +946,6 @@
<translation>General</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Utilitzant OpenSSL versió</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Utilitzant BerkeleyDB versió</translation>
</message>
@@ -1442,8 +974,16 @@
<translation>Nombre de blocs actuals</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>Obre el fitxer de registre de depuració del Bitcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans.</translation>
+ <source>Memory Pool</source>
+ <translation>Reserva de memòria</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Nombre actual de transaccions</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Us de memoria</translation>
</message>
<message>
<source>Received</source>
@@ -1458,10 +998,18 @@
<translation>&amp;Iguals</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>Iguals bandejats</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>Seleccioneu un igual per mostrar informació detallada.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>A la llista blanca</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Direcció</translation>
</message>
@@ -1470,6 +1018,18 @@
<translation>Versió</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Bloc d'inici</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Capçaleres sincronitzades</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Blocs sincronitzats</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Agent d'usuari</translation>
</message>
@@ -1498,6 +1058,14 @@
<translation>Temps de ping</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>La duració d'un ping més destacat actualment.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Espera de ping</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Diferència horària</translation>
</message>
@@ -1534,10 +1102,6 @@
<translation>Fora:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Data de compilació</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Fitxer de registre de depuració</translation>
</message>
@@ -1546,8 +1110,32 @@
<translation>Neteja la consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Us donem la benviguda a la consola RPC del Bitcoin Core.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Desconnecta el node</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Bandeja el node durant</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;hora</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;dia</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;setmana</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;any</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Desbandeja el node</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>
@@ -1574,6 +1162,10 @@
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(id del node: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>a través de %1</translation>
</message>
@@ -1672,18 +1264,6 @@
<source>Remove</source>
<translation>Esborra</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copia l'etiqueta</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copia el missatge</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1703,73 +1283,6 @@
<source>&amp;Save Image...</source>
<translation>De&amp;sa la imatge...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Sol·licita un pagament a %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informació de pagament</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI resultant massa llarga, intenta reduir el text per a la etiqueta / missatge</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Error en codificar l'URI en un codi QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(sense missatge)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(sense import)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1890,14 +1403,6 @@
<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>
@@ -1929,110 +1434,6 @@
<source>S&amp;end</source>
<translation>E&amp;nvia</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirma l'enviament de monedes</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 a %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copia la quantitat</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copia la comissió</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia la comissió posterior</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copia els bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia la prioritat</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia el canvi</translation>
- </message>
- <message>
- <source>or</source>
- <translation>o</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>L'import supera el vostre balanç.</translation>
- </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 comissió a la transacció %1.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Ha fallat la creació de la transacció!</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>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>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Una comissió superior a %1 es considera una comissió absurdament alta.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>La sol·licitud de pagament ha vençut.</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>Estimat per començar la confirmació en %n bloc.</numerusform><numerusform>Estimat per començar la confirmació en %n blocs.</numerusform></translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>L'adreça de destinatari no és vàlida. Torneu-la a comprovar.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation>S'ha trobat una adreça duplicada: cal utilitzar les adreces només un cop cada vegada.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Avís: adreça Bitcoin no vàlida</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Avís: adreça de canvi desconeguda</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copia el polsim</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Esteu segur que ho voleu enviar?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>S'ha afegit una taxa de transacció</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2045,10 +1446,6 @@
<translation>Paga &amp;a:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Introduïu una etiqueta per a aquesta adreça per afegir-la a la llibreta d'adreces</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -2120,10 +1517,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>S'està aturant el Bitcoin Core...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>No apagueu l'ordinador fins que no desaparegui aquesta finestra.</translation>
</message>
@@ -2214,70 +1607,10 @@
<source>Reset all verify message fields</source>
<translation>Neteja tots els camps de verificació de missatge</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Feu clic a «Signa el missatge» per a generar una signatura</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>L'adreça introduïda no és vàlida.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Comproveu l'adreça i torneu-ho a provar.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>L'adreça introduïda no referencia a cap clau.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>El desbloqueig del moneder ha estat cancelat.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>La clau privada per a la adreça introduïda no està disponible.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>La signatura del missatge ha fallat.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Missatge signat.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>La signatura no s'ha pogut descodificar.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Comproveu la signatura i torneu-ho a provar.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>La signatura no coincideix amb el resum del missatge.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Ha fallat la verificació del missatge.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Missatge verificat.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Els desenvolupadors del Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2290,418 +1623,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Obert fins %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>en conflicte</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/fora de línia</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/sense confirmar</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmacions</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Estat</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, difusió a través de %n node</numerusform><numerusform>, difusió a través de %n nodes</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Font</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generat</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Des de</translation>
- </message>
- <message>
- <source>To</source>
- <translation>A</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>Adreça pròpia</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>només lectura</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiqueta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Crèdit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>disponible en %n bloc més</numerusform><numerusform>disponibles en %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>no acceptat</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Dèbit</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Dèbit total</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Crèdit total</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Comissió de transacció</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Import net</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID de transacció</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Mercader</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>Les monedes generades han de madurar %1 blocs abans de poder ser gastades. Quan genereu aquest bloc, es farà saber a la xarxa per tal d'afegir-lo a la cadena de blocs. Si no pot fer-se lloc a la cadena, el seu estat canviarà a «no acceptat» i no es podrà gastar. Això pot passar ocasionalment si un altre node genera un bloc en un marge de segons respecte al vostre.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Informació de depuració</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transacció</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Entrades</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>true</source>
- <translation>cert</translation>
- </message>
- <message>
- <source>false</source>
- <translation>fals</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, encara no ha estat emès correctement</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Obre per %n bloc més</numerusform><numerusform>Obre per %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconegut</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detall de la transacció</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Aquest panell mostra una descripció detallada de la transacció</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipus</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Obre per %n bloc més</numerusform><numerusform>Obre per %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Obert fins %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmat (%1 confirmacions)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Aquest bloc no ha estat rebut per cap altre node i probablement no serà acceptat!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generat però no acceptat</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Fora de línia</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Sense confirmar</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Confirmant (%1 de %2 confirmacions recomanades)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>En conflicte</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Rebut amb</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Rebut de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviat a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pagament a un mateix</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minat</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>només lectura</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Estat de la transacció. Desplaceu-vos sobre aquest camp per mostrar el nombre de confirmacions.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Data i hora en que la transacció va ser rebuda.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipus de transacció.</translation>
- </message>
- <message>
- <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>User-defined intent/purpose of the transaction.</source>
- <translation>Intenció/propòsit de la transacció definida per l'usuari.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Import extret o afegit del balanç.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Tot</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Avui</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Aquesta setmana</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Aquest mes</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>El mes passat</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Enguany</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Rang...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Rebut amb</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviat a</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>A un mateix</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minat</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Altres</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Introduïu una adreça o una etiqueta per cercar</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Import mínim</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copia l'adreça</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de transacció</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Editar etiqueta</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Mostra detalls de la transacció</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <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>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>S'ha produït un error en provar de desar l'historial de transacció a %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exportació amb èxit</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>L'historial de transaccions s'ha desat correctament a %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fitxer separat per comes (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmat</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipus</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Rang:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>a</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2709,85 +1637,80 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>No s'ha carregat cap moneder.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
+ <name>bitcoin-core</name>
<message>
- <source>Send Coins</source>
- <translation>Envia monedes</translation>
+ <source>Options:</source>
+ <translation>Opcions:</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Exporta</translation>
+ <source>Specify data directory</source>
+ <translation>Especifica el directori de dades</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporta les dades de la pestanya actual a un fitxer</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Connecta al node per obtenir les adreces de les connexions, i desconnecta</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Còpia de seguretat del moneder</translation>
+ <source>Specify your own public address</source>
+ <translation>Especifiqueu la vostra adreça pública</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Dades del moneder (*.dat)</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Accepta la línia d'ordres i ordres JSON-RPC </translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Ha fallat la còpia de seguretat</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Si no es proporciona &lt;category&gt; o si &lt;category&gt; = 1, treu a la sortida tota la informació de depuració.</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>S'ha produït un error en provar de desar les dades del moneder a %1.</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>Poda configurada per sota el mínim de %d MiB. Utilitzeu un nombre superior.</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>S'han desat les dades del moneder correctament a %1.</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Poda: la darrera sincronització del moneder va més enllà de les dades podades. Cal que activeu -reindex (baixeu tota la cadena de blocs de nou en cas de node podat)</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>La còpia de seguretat s'ha realitzat correctament</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>Reduïu els requisits d'emmagatzematge podant (suprimint) els blocs antics. Aquest mode és incompatible amb -txindex i -rescan. Avís: la reversió d'aquest paràmetre implica haver de tornar a baixar la cadena de blocs sencera. (per defecte: 0 = inhabilita la poda de blocs, &gt;%u = mida objectiu en MiB per utilitzar en els fitxers de blocs)</translation>
</message>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Opcions:</translation>
- </message>
- <message>
- <source>Specify data directory</source>
- <translation>Especifica el directori de dades</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Els rescanejos no són possible en el mode de poda. Caldrà que utilitzeu -reindex, que tornarà a baixar la cadena de blocs sencera.</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Connecta al node per obtenir les adreces de les connexions, i desconnecta</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Error: s'ha produït un error intern fatal. Vegeu debug.log per a més detalls</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Especifiqueu la vostra adreça pública</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Comissió (en %s/kB) per afegir a les transaccions que envieu (per defecte: %s)</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Accepta la línia d'ordres i ordres JSON-RPC </translation>
+ <source>Pruning blockstore...</source>
+ <translation>S'està podant la cadena de blocs...</translation>
</message>
<message>
<source>Run in the background as a daemon and accept commands</source>
<translation>Executa en segon pla com a programa dimoni i accepta ordres</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>No s'ha pogut iniciar el servidor HTTP. Vegeu debug.log per a més detalls.</translation>
+ </message>
+ <message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Accepta connexions de fora (per defecte: 1 si no -proxy o -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee és molt elevat. Aquesta és la comissió de transacció que podeu pagar quan les estimacions de comissions no estan disponibles.</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>
@@ -2812,18 +1735,6 @@
<translation>Aquesta és una versió de pre-llançament - utilitza-la sota la teva responsabilitat - No usar per a minería o aplicacions de compra-venda</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>No es pot enllaçar %s a aquest ordinador. El Bitcoin Core probablement ja estigui executant-s'hi.</translation>
- </message>
- <message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVÃS: s'ha generat un nombre anòmalament alt de blocs, %d blocs rebuts en les darreres %d hores (se n'esperaven %d)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVÃS: comproveu la vostra connexió a la xarxa, %d blocs rebuts en les darreres %d hores (se n'esperaven %d)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Avís: la xarxa no sembla que hi estigui plenament d'acord. Alguns miners sembla que estan experimentant problemes.</translation>
</message>
@@ -2832,10 +1743,6 @@
<translation>Avís: sembla que no estem plenament d'acord amb els nostres iguals! Podria caler que actualitzar l'aplicació, o potser que ho facin altres nodes.</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>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>
@@ -2956,14 +1863,6 @@
<translation>Opcions de moneder:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Avís: aquesta versió és obsoleta; cal actualitzar-la!</translation>
- </message>
- <message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Cal que reconstruïu la base de dades fent servir -reindex per canviar -txindex</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>Permet les connexions JSON-RPC d'una font específica. Vàlid per a &lt;ip&gt; són una IP individual (p. ex., 1.2.3.4), una xarxa / màscara de xarxa (p. ex., 1.2.3.4/255.255.255.0) o una xarxa/CIDR (p. ex., 1.2.3.4/24). Es pot especificar aquesta opció moltes vegades</translation>
</message>
@@ -2976,10 +1875,6 @@
<translation>Vincula a l'adreça donada per a escoltar les connexions JSON-RPC. Feu servir la notació [host]:port per a IPv6. Aquesta opció pot ser especificada moltes vegades (per defecte: vincula a totes les interfícies)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>No es pot obtenir un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estigui executant.</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Crea fitxers nous amb els permisos per defecte del sistema, en comptes de l'umask 077 (només efectiu amb la funcionalitat de moneder inhabilitada)</translation>
</message>
@@ -3020,10 +1915,6 @@
<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>The transaction amount is too small to send after the fee has been deducted</source>
<translation>L'import de la transacció és massa petit per enviar-la després que se'n dedueixi la comissió</translation>
</message>
@@ -3048,26 +1939,10 @@
<translation>Accepta sol·licituds REST públiques (per defecte: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>S'està activant la millor cadena...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connecta a través del proxy SOCKS5</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Els desenvolupadors del Bitcoin Core</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>
@@ -3076,22 +1951,6 @@
<translation>&amp;Informació</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Import no vàlid per a -mintxfee=&lt;amount&gt;: «%s»</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s» (ha de ser com a mínim %s)</translation>
</message>
@@ -3116,14 +1975,6 @@
<translation>Opcions del servidor RPC:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers blk000??.dat actuals a l'inici.</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Rep i mostra avisos de la xarxa P2P (per defecte: %u)</translation>
- </message>
- <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation>
</message>
@@ -3176,10 +2027,6 @@
<translation>Nom d'usuari per a connexions JSON-RPC</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Cal reescriure el moneder: reiniceu el Bitcoin Core per completar-ho.</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Avís</translation>
</message>
@@ -3188,10 +2035,6 @@
<translation>Se suprimeixen totes les transaccions del moneder...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>El fitxer wallet.data és corrupte. El rescat de les dades ha fallat</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Contrasenya per a connexions JSON-RPC</translation>
</message>
@@ -3200,10 +2043,6 @@
<translation>Executa l'ordre quan el millor bloc canviï (%s en cmd es reemplaça per un resum de bloc)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Aquest misatge d'ajuda</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permet consultes DNS per a -addnode, -seednode i -connect</translation>
</message>
@@ -3212,10 +2051,6 @@
<translation>S'estan carregant les adreces...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
@@ -3248,14 +2083,6 @@
<translation>Demana sempre les adreces dels iguals a través de consultes DNS (per defecte: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Error en carregar wallet.dat</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>
@@ -3340,18 +2167,6 @@
<translation>Xarxa desconeguda especificada a -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>No es pot resoldre l'adreça -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>No es pot resoldre l'adreça -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s»</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Balanç insuficient</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ca@valencia.ts b/src/qt/locale/bitcoin_ca@valencia.ts
index 353e80ca18..df0f750a61 100644
--- a/src/qt/locale/bitcoin_ca@valencia.ts
+++ b/src/qt/locale/bitcoin_ca@valencia.ts
@@ -26,10 +26,6 @@
<translation>&amp;Tanca</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copia l'adreça</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Elimina l'adreça sel·leccionada actualment de la llista</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Elimina</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Trieu una adreça on voleu enviar monedes</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Trieu l'adreça on voleu rebre monedes</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>T&amp;ria</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>S'estan enviant les adreces</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>S'estan rebent les adreces</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>Estes són les vostres adreces de Bitcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes.</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>Estes són les vostres adreces Bitcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copia l'&amp;etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Edita</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exporta la llista d'adreces</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fitxer de separació amb comes (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>L'exportació ha fallat</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>S'ha produït un error en guardar la llista d'adreces a %1. Torneu-ho a provar.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Repetiu la nova contrasenya</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Encripta el moneder</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operació requereix la contrasenya del moneder per a desbloquejar-lo.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloqueja el moneder</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operació requereix la contrasenya del moneder per desencriptar-lo.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desencripta el moneder</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Canvia la contrasenya</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirma l'encriptació del moneder</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>Avís: si encripteu el vostre moneder i perdeu la contrasenya, &lt;b&gt;PERDREU TOTS ELS VOSTRES BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Esteu segur que voleu encriptar el vostre moneder?</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>Ara es tancarà el Bitcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres bitcoins no puguen ser robades per programari maliciós que infecti l'ordinador.</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: Tota copia de seguretat que hàgeu realitzat hauria de ser reemplaçada pel, recentment generat, fitxer encriptat del moneder.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Avís: Les lletres majúscules estan activades!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Moneder encriptat</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Introduïu la contrasenya antiga i la contrasenya nova al moneder.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>L'encriptació del moneder ha fallat</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>L'encriptació del moneder ha fallat per un error intern. El moneder no ha estat encriptat.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>La contrasenya introduïda no coincideix.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>El desbloqueig del moneder ha fallat</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contrasenya introduïda per a desencriptar el moneder és incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>La desencriptació del moneder ha fallat</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>La contrasenya del moneder ha estat modificada correctament.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -298,14 +139,6 @@
<translation>Obri un &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Client del Bitcoin Core</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>S'estan important els blocs del disc...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>S'estan reindexant els blocs al disc...</translation>
</message>
@@ -350,10 +183,6 @@
<translation>&amp;Rep</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Mostra informació del Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Mostra / Amaga</translation>
</message>
@@ -390,22 +219,10 @@
<translation>Barra d'eines de les pestanyes</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Sol·licita pagaments (genera codis QR i bitcoin: URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Quant al Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Modifica les opcions de configuració del Bitcoin Core</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Mostra la llista d'adreces d'enviament i etiquetes utilitzades</translation>
</message>
@@ -421,10 +238,6 @@
<source>&amp;Command-line options</source>
<translation>Opcions de la &amp;línia d'ordes</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Mostra el missatge d'ajuda del Bitcoin Core per obtindre una llista amb les possibles opcions de línia d'ordes de Bitcoin</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n connexió activa a la xarxa Bitcoin</numerusform><numerusform>%n connexions actives a la xarxa Bitcoin</numerusform></translation>
@@ -434,6 +247,10 @@
<translation>No hi ha cap font de bloc disponible...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>Proccessats %n bloc de l'historial de transaccions.</numerusform><numerusform>Proccessats %n blocs de l'historial de transaccions.</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n hora</numerusform><numerusform>%n hores</numerusform></translation>
</message>
@@ -533,13 +350,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta de xarxa</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -617,150 +427,6 @@
<source>Priority</source>
<translation>Prioritat</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar adreça </translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de transacció</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloqueja sense gastar</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Desbloqueja sense gastar</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copia la quantitat</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copia la comissió</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia la comissió posterior</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copia els bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia la prioritat</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copia el polsim</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia el canvi</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>El més alt</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>Més alt</translation>
- </message>
- <message>
- <source>high</source>
- <translation>Alt</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>mig-alt</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>mig</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>baix-mig</translation>
- </message>
- <message>
- <source>low</source>
- <translation>baix</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>més baix</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>el més baix</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloquejada)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>cap</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Esta etiqueta es torna en roig si la transacció és superior a 1000 bytes.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>Esta etiqueta es torna en roig si la propietat és inferior que la «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 el destinatari rep un import inferior de %1.</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Pot variar +/- %1 satoshi(s) per entrada.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>sí</translation>
- </message>
- <message>
- <source>no</source>
- <translation>no</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Pot variar +/- 1 byte per entrada.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Les transaccions amb una major prioritat són més propenses a ser incloses en un bloc.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>canvia de %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(canvia)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -784,38 +450,6 @@
<source>&amp;Address</source>
<translation>&amp;Adreça</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nova adreça de recepció.</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nova adreça d'enviament</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Edita les adreces de recepció</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Edita les adreces d'enviament</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>L'adreça introduïda «%1» ja és present a la llibreta d'adreces.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>L'adreça introduïda «%1» no és una adreça de Bitcoin vàlida.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>No s'ha pogut desbloquejar el moneder.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ha fallat la generació d'una nova clau.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -843,10 +477,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>versió</translation>
</message>
@@ -855,10 +485,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Quant al Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Opcions de línia d'ordes</translation>
</message>
@@ -870,7 +496,7 @@
<source>command-line options</source>
<translation>Opcions de la línia d'ordes</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -878,18 +504,6 @@
<translation>Vos donem la benviguda</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Vos donem la benvinguda al Bitcoin Core.</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>Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Bitcoin Core les dades.</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>El Bitcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Bitcoin. Com a mínim s'emmagatzemaran %1 GB de dades en este directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder.</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>Utilitza el directori de dades per defecte</translation>
</message>
@@ -898,10 +512,6 @@
<translation>Utilitza un directori de dades personalitzat:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Error: el directori de dades «%1» especificat no pot ser creat.</translation>
</message>
@@ -936,10 +546,6 @@
<source>Select payment request file</source>
<translation>Selecciona un fitxer de sol·licitud de pagament</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Selecciona el fitxer de sol·licitud de pagament per obrir</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -980,10 +586,6 @@
<translation>Minimitza en comptes d'eixir de l'aplicació quan la finestra es tanca. Quan s'habilita esta opció l'aplicació es tancara només quan se selecciona Ix del menú. </translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>La interfície d'usuari pot definir-se des d'ací. El paràmetre tindrà efecte després de reiniciar el 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 de terceres parts (p. ex. explorador de blocs) que apareix en la pestanya de transaccions com elements del menú contextual. %s en l'URL es reemplaçat pel resum de la transacció. Diferents URL estan separades per una barra vertical |.</translation>
</message>
@@ -1008,14 +610,6 @@
<translation>&amp;Xarxa</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Inicia el Bitcoin Core automàticament després d'iniciar una sessió en el sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Inicia el Bitcoin Core en inciar el sistema</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt;0 = deixa tants nuclis lliures)</translation>
</message>
@@ -1068,6 +662,10 @@
<translation>Port del proxy (per exemple 9050)</translation>
</message>
<message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Utilitza un proxy SOCKS4 apart per a arribar als iguals a través de serveis ocults de Tor:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Finestra</translation>
</message>
@@ -1216,97 +814,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Gestió d'URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Adreça de pagament no vàlida %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>La sol·licitud de pagament s'ha rebutjat</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>La xarxa de la sol·licitud de pagament no coincideix amb la xarxa del client.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>La sol·licitud de pagament no està inicialitzada.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>L'import de pagament sol·licitat %1 és massa petit (es considera polsim).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Error en la sol·licitud de pagament</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>No es pot iniciar bitcoin: gestor clica-per-pagar</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>L'URL de recuperació de la sol·licitud de pagament no és vàlida: %1</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>L'URI no pot ser analitzat! Això pot ser a causa d'una adreça de Bitcoin no vàlida o per paràmetres URI amb mal format.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Gestió de fitxers de les sol·licituds de pagament</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>No es pot llegir el fitxer de la sol·licitud de pagament. Això pot ser causat per un fitxer de sol·licitud de pagament no vàlid.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>La sol·licitud de pagament ha vençut.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>No s'accepten sol·licituds de pagament no verificades a scripts de pagament personalitzats.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Sol·licitud de pagament no vàlida.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <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>Error communicating with %1: %2</source>
- <translation>Error en comunicar amb %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>No es pot analitzar la sol·licitud de pagament!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Mala resposta del servidor %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pagament reconegut</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Error en la sol·licitud de xarxa</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1361,31 +868,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Guarda la imatge...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copia la imatge</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Guarda el codi QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Imatge PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nom del client</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1406,10 +890,6 @@
<translation>General</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Utilitzant OpenSSL versió</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Utilitzant BerkeleyDB versió</translation>
</message>
@@ -1438,10 +918,6 @@
<translation>Nombre de blocs actuals</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>Obri el fitxer de registre de depuració del Bitcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans.</translation>
- </message>
- <message>
<source>Received</source>
<translation>Rebut</translation>
</message>
@@ -1530,10 +1006,6 @@
<translation>Fora:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Data de compilació</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Fitxer de registre de depuració</translation>
</message>
@@ -1542,10 +1014,6 @@
<translation>Neteja la consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Vos donem la benviguda a la consola RPC del 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>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,18 +1136,6 @@
<source>Remove</source>
<translation>Esborra</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copia l'etiqueta</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copia el missatge</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1699,73 +1155,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Guarda la imatge...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Sol·licita un pagament a %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informació de pagament</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI resultant massa llarga, intenta reduir el text per a la etiqueta / missatge</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Error en codificar l'URI en un codi QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(sense missatge)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(sense import)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1886,14 +1275,6 @@
<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>
@@ -1925,110 +1306,6 @@
<source>S&amp;end</source>
<translation>E&amp;nvia</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirma l'enviament de monedes</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 a %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copia la quantitat</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copia la comissió</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia la comissió posterior</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copia els bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia la prioritat</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia el canvi</translation>
- </message>
- <message>
- <source>or</source>
- <translation>o</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>L'import supera el vostre balanç.</translation>
- </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'afig la comissió a la transacció %1.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Ha fallat la creació de la transacció!</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>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'hagueren gastat monedes de la còpia però sense marcar-les-hi com a gastades.</translation>
- </message>
- <message>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Una comissió superior a %1 es considera una comissió absurdament alta.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>La sol·licitud de pagament ha vençut.</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>Estimat per començar la confirmació en %n bloc.</numerusform><numerusform>Estimat per començar la confirmació en %n blocs.</numerusform></translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>L'adreça de destinatari no és vàlida. Torneu-la a comprovar.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation>S'ha trobat una adreça duplicada: cal utilitzar les adreces només un cop cada vegada.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Avís: adreça Bitcoin no vàlida</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Avís: adreça de canvi desconeguda</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copia el polsim</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Esteu segur que ho voleu enviar?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>S'ha afegit una taxa de transacció</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2041,10 +1318,6 @@
<translation>Paga &amp;a:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Introduïu una etiqueta per a esta adreça per afegir-la a la llibreta d'adreces</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -2116,10 +1389,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>S'està parant el Bitcoin Core...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>No apagueu l'ordinador fins que no desaparegui esta finestra.</translation>
</message>
@@ -2210,70 +1479,10 @@
<source>Reset all verify message fields</source>
<translation>Neteja tots els camps de verificació de missatge</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Feu clic a «Signa el missatge» per a generar una signatura</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>L'adreça introduïda no és vàlida.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Comproveu l'adreça i torneu-ho a provar.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>L'adreça introduïda no referencia a cap clau.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>El desbloqueig del moneder ha estat cancelat.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>La clau privada per a la adreça introduïda no està disponible.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>La signatura del missatge ha fallat.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Missatge signat.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>La signatura no s'ha pogut descodificar.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Comproveu la signatura i torneu-ho a provar.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>La signatura no coincideix amb el resum del missatge.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Ha fallat la verificació del missatge.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Missatge verificat.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Els desenvolupadors del Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2286,418 +1495,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Obert fins %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>en conflicte</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/fora de línia</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/sense confirmar</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmacions</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Estat</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, difusió a través de %n node</numerusform><numerusform>, difusió a través de %n nodes</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Font</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generat</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Des de</translation>
- </message>
- <message>
- <source>To</source>
- <translation>A</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>Adreça pròpia</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>només lectura</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiqueta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Crèdit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>madura en %n bloc més</numerusform><numerusform>madura en %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>no acceptat</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Dèbit</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Dèbit total</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Crèdit total</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Comissió de transacció</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Import net</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID de transacció</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Mercader</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>Les monedes generades han de madurar %1 blocs abans de poder ser gastades. Quan genereu este bloc, es farà saber a la xarxa per tal d'afegir-lo a la cadena de blocs. Si no pot fer-se lloc a la cadena, el seu estat canviarà a «no acceptat» i no es podrà gastar. Això pot passar ocasionalment si un altre node genera un bloc en un marge de segons respecte al vostre.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Informació de depuració</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transacció</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Entrades</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>true</source>
- <translation>cert</translation>
- </message>
- <message>
- <source>false</source>
- <translation>fals</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, encara no ha estat emés correctement</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Obri per %n bloc més</numerusform><numerusform>Obri per %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconegut</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detall de la transacció</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Este panell mostra una descripció detallada de la transacció</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipus</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Obri per %n bloc més</numerusform><numerusform>Obri per %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Obert fins %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmat (%1 confirmacions)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Este bloc no ha estat rebut per cap altre node i probablement no serà acceptat!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generat però no acceptat</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Fora de línia</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Sense confirmar</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Confirmant (%1 de %2 confirmacions recomanades)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>En conflicte</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Rebut amb</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Rebut de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviat a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pagament a un mateix</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minat</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>només lectura</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Estat de la transacció. Desplaceu-vos sobre este camp per mostrar el nombre de confirmacions.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Data i hora en que la transacció va ser rebuda.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipus de transacció.</translation>
- </message>
- <message>
- <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>User-defined intent/purpose of the transaction.</source>
- <translation>Intenció/propòsit de la transacció definida per l'usuari.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Import extret o afegit del balanç.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Tot</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Hui</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Esta setmana</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Este mes</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>El mes passat</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Enguany</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Rang...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Rebut amb</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviat a</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>A un mateix</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minat</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Altres</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Introduïu una adreça o una etiqueta per cercar</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Import mínim</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copia l'adreça</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de transacció</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Editar etiqueta</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Mostra detalls de la transacció</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <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>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>S'ha produït un error en provar de guardar l'historial de transacció a %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exportació amb èxit</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>L'historial de transaccions s'ha guardat correctament a %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fitxer separat per comes (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmat</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipus</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Rang:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>a</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2705,55 +1509,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>No s'ha carregat cap moneder.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Envia monedes</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exporta</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporta les dades de la pestanya actual a un fitxer</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Còpia de seguretat del moneder</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Dades del moneder (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Ha fallat la còpia de seguretat</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>S'ha produït un error en provar de guardar les dades del moneder a %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>S'han guardat les dades del moneder correctament a %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>La còpia de seguretat s'ha realitzat correctament</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2784,6 +1539,10 @@
<translation>Accepta connexions de fora (per defecte: 1 si no -proxy o -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</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>
@@ -2808,18 +1567,6 @@
<translation>Esta és una versió de pre-llançament - utilitza-la sota la teva responsabilitat - No usar per a minería o aplicacions de compra-venda</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>No es pot enllaçar %s a este ordinador. El Bitcoin Core probablement ja estiga executant-s'hi.</translation>
- </message>
- <message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVÃS: s'ha generat un nombre anòmalament alt de blocs, %d blocs rebuts en les darreres %d hores (se n'esperaven %d)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVÃS: comproveu la vostra connexió a la xarxa, %d blocs rebuts en les darreres %d hores (se n'esperaven %d)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Avís: la xarxa no pareix que hi estiga plenament d'acord. Alguns miners pareix que estan experimentant problemes.</translation>
</message>
@@ -2828,10 +1575,6 @@
<translation>Avís: pareix que no estem plenament d'acord amb els nostres iguals! Podria caldre que actualitzar l'aplicació, o potser que ho facen altres nodes.</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>Avís: el fitxer wallet.dat és corrupte, dades rescatades! L'arxiu wallet.dat original ha estat guardat 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>Afig 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>
@@ -2952,14 +1695,6 @@
<translation>Opcions de moneder:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Avís: esta versió és obsoleta; cal actualitzar-la!</translation>
- </message>
- <message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Cal que reconstruïu la base de dades fent servir -reindex per canviar -txindex</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>Permet les connexions JSON-RPC d'una font específica. Vàlid per a &lt;ip&gt; són una IP individual (p. ex., 1.2.3.4), una xarxa / màscara de xarxa (p. ex., 1.2.3.4/255.255.255.0) o una xarxa/CIDR (p. ex., 1.2.3.4/24). Es pot especificar esta opció moltes vegades</translation>
</message>
@@ -2972,10 +1707,6 @@
<translation>Vincula a l'adreça donada per a escoltar les connexions JSON-RPC. Feu servir la notació [host]:port per a IPv6. Esta opció pot ser especificada moltes vegades (per defecte: vincula a totes les interfícies)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>No es pot obtindre un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estiga executant.</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Crea fitxers nous amb els permisos per defecte del sistema, en comptes de l'umask 077 (només efectiu amb la funcionalitat de moneder inhabilitada)</translation>
</message>
@@ -3016,10 +1747,6 @@
<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>The transaction amount is too small to send after the fee has been deducted</source>
<translation>L'import de la transacció és massa petit per enviar-la després que se'n deduïsca la comissió</translation>
</message>
@@ -3044,26 +1771,10 @@
<translation>Accepta sol·licituds REST públiques (per defecte: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>S'està activant la millor cadena...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connecta a través del proxy SOCKS5</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Els desenvolupadors del Bitcoin Core</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>
@@ -3072,22 +1783,6 @@
<translation>&amp;Informació</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <translation>Ha fallat la inicialització de la comprovació de validesa. El Bitcoin Core s'està parant.</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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Import no vàlid per a -mintxfee=&lt;amount&gt;: «%s»</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s» (ha de ser com a mínim %s)</translation>
</message>
@@ -3112,14 +1807,6 @@
<translation>Opcions del servidor RPC:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers blk000??.dat actuals a l'inici.</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Rep i mostra avisos de la xarxa P2P (per defecte: %u)</translation>
- </message>
- <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation>
</message>
@@ -3172,10 +1859,6 @@
<translation>Nom d'usuari per a connexions JSON-RPC</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Cal reescriure el moneder: reiniceu el Bitcoin Core per completar-ho.</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Avís</translation>
</message>
@@ -3184,10 +1867,6 @@
<translation>Se suprimeixen totes les transaccions del moneder...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>El fitxer wallet.data és corrupte. El rescat de les dades ha fallat</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Contrasenya per a connexions JSON-RPC</translation>
</message>
@@ -3196,10 +1875,6 @@
<translation>Executa l'orde quan el millor bloc canvie (%s en cmd es reemplaça per un resum de bloc)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Este misatge d'ajuda</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permet consultes DNS per a -addnode, -seednode i -connect</translation>
</message>
@@ -3208,10 +1883,6 @@
<translation>S'estan carregant les adreces...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
@@ -3244,14 +1915,6 @@
<translation>Demana sempre les adreces dels iguals a través de consultes DNS (per defecte: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Error en carregar wallet.dat</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>
@@ -3336,18 +1999,6 @@
<translation>Xarxa desconeguda especificada a -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>No es pot resoldre l'adreça -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>No es pot resoldre l'adreça -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s»</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Balanç insuficient</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ca_ES.ts b/src/qt/locale/bitcoin_ca_ES.ts
index bf4be89a03..f985a6928d 100644
--- a/src/qt/locale/bitcoin_ca_ES.ts
+++ b/src/qt/locale/bitcoin_ca_ES.ts
@@ -26,10 +26,6 @@
<translation>&amp;Tanca</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copia l'adreça</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Elimina l'adreça sel·leccionada actualment de la llista</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Elimina</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Trieu una adreça on voleu enviar monedes</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Trieu l'adreça on voleu rebre monedes</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>T&amp;ria</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>S'estan enviant les adreces</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>S'estan rebent les adreces</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>Aquestes són les vostres adreces de Bitcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes.</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>Aquestes són les vostres adreces Bitcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copia l'&amp;etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Edita</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exporta la llista d'adreces</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fitxer de separació amb comes (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>L'exportació ha fallat</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>S'ha produït un error en desar la llista d'adreces a %1. Torneu-ho a provar.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Repetiu la nova contrasenya</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Encripta el moneder</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Aquesta operació requereix la contrasenya del moneder per a desbloquejar-lo.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloqueja el moneder</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Aquesta operació requereix la contrasenya del moneder per desencriptar-lo.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desencripta el moneder</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Canvia la contrasenya</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirma l'encriptació del moneder</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>Avís: si encripteu el vostre moneder i perdeu la contrasenya, &lt;b&gt;PERDREU TOTS ELS VOSTRES BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Esteu segur que voleu encriptar el vostre moneder?</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>Ara es tancarà el Bitcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres bitcoins no puguin ser robades per programari maliciós que infecti l'ordinador.</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: Tota copia de seguretat que hàgiu realitzat hauria de ser reemplaçada pel, recentment generat, fitxer encriptat del moneder.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Avís: Les lletres majúscules estan activades!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Moneder encriptat</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Introduïu la contrasenya antiga i la contrasenya nova al moneder.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>L'encriptació del moneder ha fallat</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>L'encriptació del moneder ha fallat per un error intern. El moneder no ha estat encriptat.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>La contrasenya introduïda no coincideix.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>El desbloqueig del moneder ha fallat</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contrasenya introduïda per a desencriptar el moneder és incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>La desencriptació del moneder ha fallat</translation>
+ <source>IP/Netmask</source>
+ <translation>IP / Màscara de xarxa</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>La contrasenya del moneder ha estat modificada correctament.</translation>
+ <source>Banned Until</source>
+ <translation>Bandejat fins</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -298,14 +147,6 @@
<translation>Obre un &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Client del Bitcoin Core</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>S'estan important els blocs del disc...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>S'estan reindexant els blocs al disc...</translation>
</message>
@@ -350,10 +191,6 @@
<translation>&amp;Rep</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Mostra informació del Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Mostra / Amaga</translation>
</message>
@@ -390,22 +227,10 @@
<translation>Barra d'eines de les pestanyes</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Sol·licita pagaments (genera codis QR i bitcoin: URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Quant al Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Modifica les opcions de configuració del Bitcoin Core</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Mostra la llista d'adreces d'enviament i etiquetes utilitzades</translation>
</message>
@@ -421,10 +246,6 @@
<source>&amp;Command-line options</source>
<translation>Opcions de la &amp;línia d'ordres</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Mostra el missatge d'ajuda del Bitcoin Core per obtenir una llista amb les possibles opcions de línia d'ordres de Bitcoin</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n connexió activa a la xarxa Bitcoin</numerusform><numerusform>%n connexions actives a la xarxa Bitcoin</numerusform></translation>
@@ -537,13 +358,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta de xarxa</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -621,150 +435,6 @@
<source>Priority</source>
<translation>Prioritat</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar adreça </translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de transacció</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloqueja sense gastar</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Desbloqueja sense gastar</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copia la quantitat</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copia la comissió</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia la comissió posterior</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copia els bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia la prioritat</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copia el polsim</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia el canvi</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>El més alt</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>Més alt</translation>
- </message>
- <message>
- <source>high</source>
- <translation>Alt</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>mig-alt</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>mig</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>baix-mig</translation>
- </message>
- <message>
- <source>low</source>
- <translation>baix</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>més baix</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>el més baix</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloquejada)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>cap</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Aquesta etiqueta es torna en vermell si la transacció és superior a 1000 bytes.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>Aquesta etiqueta es torna en vermell si la propietat és inferior que la «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 el destinatari rep un import inferior de %1.</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Pot variar +/- %1 satoshi(s) per entrada.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>sí</translation>
- </message>
- <message>
- <source>no</source>
- <translation>no</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Pot variar +/- 1 byte per entrada.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Les transaccions amb una major prioritat són més propenses a ser incloses en un bloc.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>canvia de %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(canvia)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -788,38 +458,6 @@
<source>&amp;Address</source>
<translation>&amp;Adreça</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nova adreça de recepció.</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nova adreça d'enviament</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Edita les adreces de recepció</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Edita les adreces d'enviament</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>L'adreça introduïda «%1» ja és present a la llibreta d'adreces.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>L'adreça introduïda «%1» no és una adreça de Bitcoin vàlida.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>No s'ha pogut desbloquejar el moneder.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ha fallat la generació d'una nova clau.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -847,10 +485,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>versió</translation>
</message>
@@ -859,10 +493,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Quant al Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Opcions de línia d'ordres</translation>
</message>
@@ -874,24 +504,36 @@
<source>command-line options</source>
<translation>Opcions de la línia d'ordres</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Us donem la benviguda</translation>
+ <source>UI Options:</source>
+ <translation>Opcions d'interfície d'usuari:</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Us donem la benvinguda al Bitcoin Core.</translation>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Trieu el directori de dades a l'inici (per defecte: %u)</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>Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Bitcoin Core les dades.</translation>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Defineix la llengua, per exemple «de_DE» (per defecte: la definida pel sistema)</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>El Bitcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Bitcoin. Com a mínim s'emmagatzemaran %1 GB de dades en aquest directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder.</translation>
+ <source>Start minimized</source>
+ <translation>Inicia minimitzat</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Defineix els certificats arrel SSL per a la sol·licitud de pagament (per defecte: els del sistema)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Mostra la pantalla de benvinguda a l'inici (per defecte: %u)</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>Us donem la benviguda</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -902,10 +544,6 @@
<translation>Utilitza un directori de dades personalitzat:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucli de Bitcoin</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Error: el directori de dades «%1» especificat no pot ser creat.</translation>
</message>
@@ -940,10 +578,6 @@
<source>Select payment request file</source>
<translation>Selecciona un fitxer de sol·licitud de pagament</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Selecciona el fitxer de sol·licitud de pagament per obrir</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -984,10 +618,6 @@
<translation>Minimitza en comptes de sortir de l'aplicació quan la finestra es tanca. Quan s'habilita aquesta opció l'aplicació es tancara només quan se selecciona Surt del menú. </translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>La interfície d'usuari pot definir-se des d'aquí. El paràmetre tindrà efecte després de reiniciar el 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 de terceres parts (p. ex. explorador de blocs) que apareix en la pestanya de transaccions com elements del menú contextual. %s en l'URL es reemplaçat pel resum de la transacció. Diferents URL estan separades per una barra vertical |.</translation>
</message>
@@ -1012,14 +642,6 @@
<translation>&amp;Xarxa</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Inicia el Bitcoin Core automàticament després d'iniciar una sessió en el sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Inicia el Bitcoin Core en inciar el sistema</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt;0 = deixa tants nuclis lliures)</translation>
</message>
@@ -1072,6 +694,34 @@
<translation>Port del proxy (per exemple 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Utilitzat per arribar als iguals mitjançant:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Mostra si el proxy SOCKS5 per defecte proporcionat s'utilitza per arribar als iguals mitjançant aquest tipus de xarxa.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Conectar a la red de Bitcoin a través de un proxy SOCKS5 per als serveis ocults de Tor</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Utilitza un proxy SOCKS4 apart per a arribar als iguals a través de serveis ocults de Tor:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Finestra</translation>
</message>
@@ -1220,97 +870,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Gestió d'URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Adreça de pagament no vàlida %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>La sol·licitud de pagament s'ha rebutjat</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>La xarxa de la sol·licitud de pagament no coincideix amb la xarxa del client.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>La sol·licitud de pagament no està inicialitzada.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>L'import de pagament sol·licitat %1 és massa petit (es considera polsim).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Error en la sol·licitud de pagament</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>No es pot iniciar bitcoin: gestor clica-per-pagar</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>L'URL de recuperació de la sol·licitud de pagament no és vàlida: %1</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>L'URI no pot ser analitzat! Això pot ser a causa d'una adreça de Bitcoin no vàlida o per paràmetres URI amb mal format.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Gestió de fitxers de les sol·licituds de pagament</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>No es pot llegir el fitxer de la sol·licitud de pagament. Això pot ser causat per un fitxer de sol·licitud de pagament no vàlid.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>La sol·licitud de pagament ha vençut.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>No s'accepten sol·licituds de pagament no verificades a scripts de pagament personalitzats.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Sol·licitud de pagament no vàlida.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <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>Error communicating with %1: %2</source>
- <translation>Error en comunicar amb %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>No es pot analitzar la sol·licitud de pagament!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Mala resposta del servidor %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pagament reconegut</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Error en la sol·licitud de xarxa</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1365,31 +924,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>De&amp;sa la imatge...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copia la imatge</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Desa el codi QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Imatge PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nom del client</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1410,10 +946,6 @@
<translation>General</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Utilitzant OpenSSL versió</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Utilitzant BerkeleyDB versió</translation>
</message>
@@ -1442,8 +974,16 @@
<translation>Nombre de blocs actuals</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>Obre el fitxer de registre de depuració del Bitcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans.</translation>
+ <source>Memory Pool</source>
+ <translation>Reserva de memòria</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Nombre actual de transaccions</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Us de memoria</translation>
</message>
<message>
<source>Received</source>
@@ -1458,10 +998,18 @@
<translation>&amp;Iguals</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>Iguals bandejats</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>Seleccioneu un igual per mostrar informació detallada.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>A la llista blanca</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Direcció</translation>
</message>
@@ -1470,6 +1018,18 @@
<translation>Versió</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Bloc d'inici</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Capçaleres sincronitzades</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Blocs sincronitzats</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Agent d'usuari</translation>
</message>
@@ -1498,6 +1058,14 @@
<translation>Temps de ping</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>La duració d'un ping més destacat actualment.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Espera de ping</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Diferència horària</translation>
</message>
@@ -1534,10 +1102,6 @@
<translation>Fora:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Data de compilació</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Fitxer de registre de depuració</translation>
</message>
@@ -1546,8 +1110,32 @@
<translation>Neteja la consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Us donem la benviguda a la consola RPC del Bitcoin Core.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Desconnecta el node</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Bandeja el node durant</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;hora</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;dia</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;setmana</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;any</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Desbandeja el node</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>
@@ -1574,6 +1162,10 @@
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(id del node: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>a través de %1</translation>
</message>
@@ -1672,18 +1264,6 @@
<source>Remove</source>
<translation>Esborra</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copia l'etiqueta</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copia el missatge</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1703,73 +1283,6 @@
<source>&amp;Save Image...</source>
<translation>De&amp;sa la imatge...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Sol·licita un pagament a %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informació de pagament</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI resultant massa llarga, intenta reduir el text per a la etiqueta / missatge</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Error en codificar l'URI en un codi QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(sense missatge)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(sense import)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1890,14 +1403,6 @@
<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>
@@ -1929,110 +1434,6 @@
<source>S&amp;end</source>
<translation>E&amp;nvia</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirma l'enviament de monedes</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 a %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copia la quantitat</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copia la comissió</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia la comissió posterior</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copia els bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia la prioritat</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia el canvi</translation>
- </message>
- <message>
- <source>or</source>
- <translation>o</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>L'import supera el vostre balanç.</translation>
- </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 comissió a la transacció %1.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Ha fallat la creació de la transacció!</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>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>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Una comissió superior a %1 es considera una comissió absurdament alta.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>La sol·licitud de pagament ha vençut.</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>Estimat per començar la confirmació en %n bloc.</numerusform><numerusform>Estimat per començar la confirmació en %n blocs.</numerusform></translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>L'adreça de destinatari no és vàlida. Torneu-la a comprovar.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation>S'ha trobat una adreça duplicada: cal utilitzar les adreces només un cop cada vegada.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Avís: adreça Bitcoin no vàlida</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sense etiqueta)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Avís: adreça de canvi desconeguda</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copia el polsim</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Esteu segur que ho voleu enviar?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>S'ha afegit una taxa de transacció</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2045,10 +1446,6 @@
<translation>Paga &amp;a:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Introduïu una etiqueta per a aquesta adreça per afegir-la a la llibreta d'adreces</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -2120,10 +1517,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>S'està aturant el Bitcoin Core...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>No apagueu l'ordinador fins que no desaparegui aquesta finestra.</translation>
</message>
@@ -2214,70 +1607,10 @@
<source>Reset all verify message fields</source>
<translation>Neteja tots els camps de verificació de missatge</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Feu clic a «Signa el missatge» per a generar una signatura</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>L'adreça introduïda no és vàlida.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Comproveu l'adreça i torneu-ho a provar.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>L'adreça introduïda no referencia a cap clau.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>El desbloqueig del moneder ha estat cancelat.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>La clau privada per a la adreça introduïda no està disponible.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>La signatura del missatge ha fallat.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Missatge signat.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>La signatura no s'ha pogut descodificar.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Comproveu la signatura i torneu-ho a provar.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>La signatura no coincideix amb el resum del missatge.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Ha fallat la verificació del missatge.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Missatge verificat.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Els desenvolupadors del Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2290,418 +1623,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Obert fins %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>en conflicte</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/fora de línia</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/sense confirmar</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmacions</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Estat</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, difusió a través de %n node</numerusform><numerusform>, difusió a través de %n nodes</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Font</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generat</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Des de</translation>
- </message>
- <message>
- <source>To</source>
- <translation>A</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>Adreça pròpia</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>només lectura</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiqueta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Crèdit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>disponible en %n bloc més</numerusform><numerusform>disponibles en %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>no acceptat</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Dèbit</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Dèbit total</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Crèdit total</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Comissió de transacció</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Import net</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Missatge</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID de transacció</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Mercader</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>Les monedes generades han de madurar %1 blocs abans de poder ser gastades. Quan genereu aquest bloc, es farà saber a la xarxa per tal d'afegir-lo a la cadena de blocs. Si no pot fer-se lloc a la cadena, el seu estat canviarà a «no acceptat» i no es podrà gastar. Això pot passar ocasionalment si un altre node genera un bloc en un marge de segons respecte al vostre.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Informació de depuració</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transacció</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Entrades</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Import</translation>
- </message>
- <message>
- <source>true</source>
- <translation>cert</translation>
- </message>
- <message>
- <source>false</source>
- <translation>fals</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, encara no ha estat emès correctement</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Obre per %n bloc més</numerusform><numerusform>Obre per %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconegut</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detall de la transacció</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Aquest panell mostra una descripció detallada de la transacció</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipus</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Obre per %n bloc més</numerusform><numerusform>Obre per %n blocs més</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Obert fins %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmat (%1 confirmacions)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Aquest bloc no ha estat rebut per cap altre node i probablement no serà acceptat!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generat però no acceptat</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Fora de línia</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Sense confirmar</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Confirmant (%1 de %2 confirmacions recomanades)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>En conflicte</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Rebut amb</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Rebut de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviat a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pagament a un mateix</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minat</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>només lectura</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Estat de la transacció. Desplaceu-vos sobre aquest camp per mostrar el nombre de confirmacions.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Data i hora en que la transacció va ser rebuda.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipus de transacció.</translation>
- </message>
- <message>
- <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>User-defined intent/purpose of the transaction.</source>
- <translation>Intenció/propòsit de la transacció definida per l'usuari.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Import extret o afegit del balanç.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Tot</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Avui</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Aquesta setmana</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Aquest mes</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>El mes passat</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Enguany</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Rang...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Rebut amb</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviat a</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>A un mateix</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minat</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Altres</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Introduïu una adreça o una etiqueta per cercar</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Import mínim</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copia l'adreça</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'import</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de transacció</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Editar etiqueta</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Mostra detalls de la transacció</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <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>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>S'ha produït un error en provar de desar l'historial de transacció a %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exportació amb èxit</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>L'historial de transaccions s'ha desat correctament a %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fitxer separat per comes (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmat</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipus</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Rang:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>a</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2709,85 +1637,76 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
+ <name>bitcoin-core</name>
<message>
- <source>No wallet has been loaded.</source>
- <translation>No s'ha carregat cap moneder.</translation>
+ <source>Options:</source>
+ <translation>Opcions:</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>Envia monedes</translation>
+ <source>Specify data directory</source>
+ <translation>Especifica el directori de dades</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Exporta</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Connecta al node per obtenir les adreces de les connexions, i desconnecta</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporta les dades de la pestanya actual a un fitxer</translation>
+ <source>Specify your own public address</source>
+ <translation>Especifiqueu la vostra adreça pública</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Còpia de seguretat del moneder</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Accepta la línia d'ordres i ordres JSON-RPC </translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Dades del moneder (*.dat)</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Si no es proporciona &lt;category&gt; o si &lt;category&gt; = 1, treu a la sortida tota la informació de depuració.</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Ha fallat la còpia de seguretat</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>Poda configurada per sota el mínim de %d MiB. Utilitzeu un nombre superior.</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>S'ha produït un error en provar de desar les dades del moneder a %1.</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Poda: la darrera sincronització del moneder va més enllà de les dades podades. Cal que activeu -reindex (baixeu tota la cadena de blocs de nou en cas de node podat)</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>S'han desat les dades del moneder correctament a %1.</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>Reduïu els requisits d'emmagatzematge podant (suprimint) els blocs antics. Aquest mode és incompatible amb -txindex i -rescan. Avís: la reversió d'aquest paràmetre implica haver de tornar a baixar la cadena de blocs sencera. (per defecte: 0 = inhabilita la poda de blocs, &gt;%u = mida objectiu en MiB per utilitzar en els fitxers de blocs)</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>La còpia de seguretat s'ha realitzat correctament</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Els rescanejos no són possible en el mode de poda. Caldrà que utilitzeu -reindex, que tornarà a baixar la cadena de blocs sencera.</translation>
</message>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Opcions:</translation>
- </message>
- <message>
- <source>Specify data directory</source>
- <translation>Especifica el directori de dades</translation>
- </message>
- <message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Connecta al node per obtenir les adreces de les connexions, i desconnecta</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Error: s'ha produït un error intern fatal. Vegeu debug.log per a més detalls</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Especifiqueu la vostra adreça pública</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Comissió (en %s/kB) per afegir a les transaccions que envieu (per defecte: %s)</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Accepta la línia d'ordres i ordres JSON-RPC </translation>
+ <source>Pruning blockstore...</source>
+ <translation>S'està podant la cadena de blocs...</translation>
</message>
<message>
<source>Run in the background as a daemon and accept commands</source>
<translation>Executa en segon pla com a programa dimoni i accepta ordres</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>No s'ha pogut iniciar el servidor HTTP. Vegeu debug.log per a més detalls.</translation>
+ </message>
+ <message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Accepta connexions de fora (per defecte: 1 si no -proxy o -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Nucli de Bitcoin</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>
@@ -2812,18 +1731,6 @@
<translation>Aquesta és una versió de pre-llançament - utilitza-la sota la teva responsabilitat - No usar per a minería o aplicacions de compra-venda</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>No es pot enllaçar %s a aquest ordinador. El Bitcoin Core probablement ja estigui executant-s'hi.</translation>
- </message>
- <message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVÃS: s'ha generat un nombre anòmalament alt de blocs, %d blocs rebuts en les darreres %d hores (se n'esperaven %d)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVÃS: comproveu la vostra connexió a la xarxa, %d blocs rebuts en les darreres %d hores (se n'esperaven %d)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Avís: la xarxa no sembla que hi estigui plenament d'acord. Alguns miners sembla que estan experimentant problemes.</translation>
</message>
@@ -2832,10 +1739,6 @@
<translation>Avís: sembla que no estem plenament d'acord amb els nostres iguals! Podria caler que actualitzar l'aplicació, o potser que ho facin altres nodes.</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>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>
@@ -2956,14 +1859,6 @@
<translation>Opcions de moneder:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Avís: aquesta versió és obsoleta; cal actualitzar-la!</translation>
- </message>
- <message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Cal que reconstruïu la base de dades fent servir -reindex per canviar -txindex</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>Permet les connexions JSON-RPC d'una font específica. Vàlid per a &lt;ip&gt; són una IP individual (p. ex., 1.2.3.4), una xarxa / màscara de xarxa (p. ex., 1.2.3.4/255.255.255.0) o una xarxa/CIDR (p. ex., 1.2.3.4/24). Es pot especificar aquesta opció moltes vegades</translation>
</message>
@@ -2976,10 +1871,6 @@
<translation>Vincula a l'adreça donada per a escoltar les connexions JSON-RPC. Feu servir la notació [host]:port per a IPv6. Aquesta opció pot ser especificada moltes vegades (per defecte: vincula a totes les interfícies)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>No es pot obtenir un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estigui executant.</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Crea fitxers nous amb els permisos per defecte del sistema, en comptes de l'umask 077 (només efectiu amb la funcionalitat de moneder inhabilitada)</translation>
</message>
@@ -3020,10 +1911,6 @@
<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>The transaction amount is too small to send after the fee has been deducted</source>
<translation>L'import de la transacció és massa petit per enviar-la després que se'n dedueixi la comissió</translation>
</message>
@@ -3048,26 +1935,10 @@
<translation>Accepta sol·licituds REST públiques (per defecte: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>S'està activant la millor cadena...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connecta a través del proxy SOCKS5</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Els desenvolupadors del Bitcoin Core</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>
@@ -3076,22 +1947,6 @@
<translation>&amp;Informació</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Import no vàlid per a -mintxfee=&lt;amount&gt;: «%s»</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s» (ha de ser com a mínim %s)</translation>
</message>
@@ -3116,14 +1971,6 @@
<translation>Opcions del servidor RPC:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers blk000??.dat actuals a l'inici.</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Rep i mostra avisos de la xarxa P2P (per defecte: %u)</translation>
- </message>
- <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation>
</message>
@@ -3176,10 +2023,6 @@
<translation>Nom d'usuari per a connexions JSON-RPC</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Cal reescriure el moneder: reiniceu el Bitcoin Core per completar-ho.</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Avís</translation>
</message>
@@ -3188,10 +2031,6 @@
<translation>Se suprimeixen totes les transaccions del moneder...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>El fitxer wallet.data és corrupte. El rescat de les dades ha fallat</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Contrasenya per a connexions JSON-RPC</translation>
</message>
@@ -3200,10 +2039,6 @@
<translation>Executa l'ordre quan el millor bloc canviï (%s en cmd es reemplaça per un resum de bloc)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Aquest misatge d'ajuda</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permet consultes DNS per a -addnode, -seednode i -connect</translation>
</message>
@@ -3212,10 +2047,6 @@
<translation>S'estan carregant les adreces...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
@@ -3248,14 +2079,6 @@
<translation>Demana sempre les adreces dels iguals a través de consultes DNS (per defecte: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Error en carregar wallet.dat</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>
@@ -3340,18 +2163,6 @@
<translation>Xarxa desconeguda especificada a -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>No es pot resoldre l'adreça -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>No es pot resoldre l'adreça -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s»</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Balanç insuficient</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts
index d791d9d98d..2dfa295ce0 100644
--- a/src/qt/locale/bitcoin_cs.ts
+++ b/src/qt/locale/bitcoin_cs.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation>Pravým tlaÄítkem myÅ¡i zaÄneÅ¡ upravovat oznaÄení adresy</translation>
+ <translation>Pravým tlaÄítkem myÅ¡i můžeÅ¡ upravit oznaÄení adresy</translation>
</message>
<message>
<source>Create a new address</source>
@@ -26,10 +26,6 @@
<translation>&amp;Zavřít</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopíruj adresu</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Smaž zvolenou adresu ze seznamu</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>S&amp;maž</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Zvol adresu, na kterou pošleš mince</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Zvol adres na příjem mincí</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Zvol</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Odesílací adresy</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Přijímací adresy</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Tohle jsou tvé Bitcoinové adresy pro posílání plateb. PÅ™ed odesláním mincí si vždy zkontroluj Äástku a cílovou adresu.</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation>Tohle jsou tvé Bitcoinové adresy pro příjem plateb. Je doporuÄené používat pokaždé novou adresu pro každou transakci.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopíruj &amp;oznaÄení</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Uprav</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportuj seznam adres</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>CSV formát (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportování selhalo</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Při ukládání seznamu adres do %1 se přihodila nějaká chyba. Zkus to prosím znovu.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>OznaÄení</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez oznaÄení)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Totéž heslo ještě jednou</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Zašifruj peněženku</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>K provedení této operace musíš zadat heslo k peněžence, aby se mohla odemknout.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Odemkni peněženku</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>K provedení této operace musíš zadat heslo k peněžence, aby se mohla dešifrovat.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dešifruj peněženku</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Změň heslo</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>PotvrÄ zaÅ¡ifrování peněženky</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>UpozornÄ›ní: Pokud si zaÅ¡ifrujeÅ¡ peněženku a ztratíš Äi zapomeneÅ¡ heslo, &lt;b&gt;PŘIJDEÅ  O VÅ ECHNY BITCOINY&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Jsi si jistý, že chceš peněženku zašifrovat?</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 teÄ ukonÄí, aby dokonÄil zaÅ¡ifrování. Pamatuj vÅ¡ak, že pouhé zaÅ¡ifrování peněženky nemůže zabránit krádeži tvých bitcoinů malwarem, kterým se může poÄítaÄ nakazit.</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>DÅ®LEŽITÉ: VÅ¡echny pÅ™edchozí zálohy peněženky by mÄ›ly být nahrazeny novÄ› vygenerovanou, zaÅ¡ifrovanou peněženkou. Z bezpeÄnostních důvodů budou pÅ™edchozí zálohy neÅ¡ifrované peněženky nepoužitelné, jakmile zaÄneÅ¡ používat novou zaÅ¡ifrovanou peněženku.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Upozornění: Caps Lock je zapnutý!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Peněženka je zašifrována</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Zadej staré a nové heslo k peněžence.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Zašifrování peněženky selhalo</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Zašifrování peněženky selhalo kvůli vnitřní chybě. Tvá peněženka tedy nebyla zašifrována.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Zadaná hesla nejsou shodná.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Nepodařilo se odemknout peněženku</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Nezadal jsi správné heslo pro dešifrování peněženky.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Nepodařilo se dešifrovat peněženku</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Heslo k peněžence bylo v pořádku změněno.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -298,14 +139,6 @@
<translation>NaÄíst &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core klient</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importuji bloky z disku...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Vytvářím nový index bloků na disku...</translation>
</message>
@@ -343,17 +176,13 @@
</message>
<message>
<source>&amp;Send</source>
- <translation>&amp;Pošli</translation>
+ <translation>P&amp;ošli</translation>
</message>
<message>
<source>&amp;Receive</source>
<translation>Při&amp;jmi</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Zobraz informace o Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Zobraz/Skryj</translation>
</message>
@@ -383,29 +212,17 @@
</message>
<message>
<source>&amp;Help</source>
- <translation>Ná&amp;pověda</translation>
+ <translation>Nápověd&amp;a</translation>
</message>
<message>
<source>Tabs toolbar</source>
<translation>Panel s listy</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Požaduj platby (generuje QR kódy a bitcoin: URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>O &amp;Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Uprav nastavení Bitcoin Core</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Ukaž seznam použitých odesílacích adres a jejich oznaÄení</translation>
</message>
@@ -419,11 +236,7 @@
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>Ar&amp;gumenty z příkazové řádky</translation>
- </message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Seznam argumentů Bitcoinu pro příkazovou řádku získáš v nápovědě Bitcoinu Core</translation>
+ <translation>Ar&amp;gumenty příkazové řádky</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
@@ -467,7 +280,7 @@
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation>Následné transakce ještě nebudou vidět.</translation>
+ <translation>Novější transakce zatím nejsou vidět.</translation>
</message>
<message>
<source>Error</source>
@@ -537,13 +350,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Upozornění sítě</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -621,150 +427,6 @@
<source>Priority</source>
<translation>Priorita</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopíruj adresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopíruj její oznaÄení</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopíruj Äástku</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopíruj ID transakce</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Zamkni neutracené</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Odemkni k utracení</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopíruj poÄet</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopíruj poplatek</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopíruj Äistou Äástku</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopíruj bajty</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopíruj prioritu</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopíruj prach</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopíruj drobné</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>nejvyšší</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>vyšší</translation>
- </message>
- <message>
- <source>high</source>
- <translation>vysoká</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>vyšší střední</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>střední</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>nižší střední</translation>
- </message>
- <message>
- <source>low</source>
- <translation>nízká</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>nižší</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>nejnižší</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 zamÄeno)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>žádná</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 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>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Může se lišit o +/– %1 satoshi na každý vstup.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>ano</translation>
- </message>
- <message>
- <source>no</source>
- <translation>ne</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Může se lišit o +/– 1 bajt na každý vstup.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transakce s vyšší prioritou mají větší šanci na zařazení do bloku.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez oznaÄení)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>drobné z %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(drobné)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -788,38 +450,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresa</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nová přijímací adresa</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nová odesílací adresa</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Uprav přijímací adresu</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Uprav odesílací adresu</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Zadaná adresa "%1" už v adresáři je.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Zadaná adresa "%1" není platná Bitcoinová adresa.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Nemohu odemknout peněženku.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>NepodaÅ™ilo se mi vygenerovat nový klíÄ.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -847,10 +477,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>verze</translation>
</message>
@@ -859,12 +485,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>O Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
- <translation>Argumenty z příkazové řádky</translation>
+ <translation>Argumenty příkazové řádky</translation>
</message>
<message>
<source>Usage:</source>
@@ -874,24 +496,36 @@
<source>command-line options</source>
<translation>možnosti příkazové řádky</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Vítej</translation>
+ <source>UI Options:</source>
+ <translation>Možnosti UI:</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Vítej v Bitcoin Core.</translation>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Zvolit při startu adresář pro data (výchozí: %u)</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>Tohle je poprvé, co spouštíš Bitcoin Core, takže si můžeš zvolit, kam bude ukládat svá data.</translation>
+ <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>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 bude stahovat kopii Å™etÄ›zce bloků. Proto bude potÅ™eba do tohoto adresáře uložit nejménÄ› %1 GB dat – toto Äíslo bude navíc v průbÄ›hu Äasu pomalu růst. Tvá peněženka bude rovněž uložena v tomto adresáři.</translation>
+ <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: %u)</source>
+ <translation>Zobrazit startovací obrazovku (výchozí: %u)</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>Vítej</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -902,10 +536,6 @@
<translation>Použij tento adresář pro data:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Chyba: Nejde vytvořit požadovaný adresář pro data „%1“.</translation>
</message>
@@ -940,10 +570,6 @@
<source>Select payment request file</source>
<translation>Vyber soubor platebního požadavku</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Vyber soubor platebního požadavku k naÄtení</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -984,12 +610,8 @@
<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>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>Tady lze nastavit jazyk uživatelského rozhraní. Nastavení se projeví až po restartování 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 třetích stran (např. block exploreru), které se zobrazí v kontextovém menu v záložce Transakce. %s v URL se nahradí hashem transakce. Více URL odděl svislítkem |.</translation>
+ <translation>URL třetích stran (např. block exploreru), která se zobrazí v kontextovém menu v záložce Transakce. %s v URL se nahradí hashem transakce. Více URL odděl svislítkem |.</translation>
</message>
<message>
<source>Third party transaction URLs</source>
@@ -997,7 +619,7 @@
</message>
<message>
<source>Active command-line options that override above options:</source>
- <translation>Aktivní argumenty z příkazové řádky, které přetloukly tato nastavení:</translation>
+ <translation>Aktivní argumenty z příkazové řádky, které mají přednost před nastavením výše:</translation>
</message>
<message>
<source>Reset all client options to default.</source>
@@ -1012,14 +634,6 @@
<translation>&amp;Síť</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Automaticky spustí Bitcoin Core po přihlášení do systému.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>S&amp;pustit Bitcoin Core po přihlášení do systému</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = automaticky, &lt;0 = nechat daný poÄet jader volný, výchozí: 0)</translation>
</message>
@@ -1029,7 +643,7 @@
</message>
<message>
<source>Expert</source>
- <translation>Odborník</translation>
+ <translation>PokroÄilá nastavení</translation>
</message>
<message>
<source>Enable coin &amp;control features</source>
@@ -1072,6 +686,34 @@
<translation>Port proxy (napÅ™. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Použije se k připojování k protějškům přes:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Ukazuje, jestli se zadaná výchozí SOCKS5 proxy používá k připojování k peerům v rámci tohoto typu sítě.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Připojí se do Bitcoinové sítě přes SOCKS5 proxy vyhrazenou pro skryté služby v Tor síti.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Použít samostatnou SOCKS5 proxy ke spojení s protějšky přes skryté služby v Toru:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>O&amp;kno</translation>
</message>
@@ -1097,7 +739,7 @@
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
- <translation>J&amp;ednotka pro Äástky:</translation>
+ <translation>Je&amp;dnotka pro Äástky:</translation>
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
@@ -1109,7 +751,7 @@
</message>
<message>
<source>&amp;OK</source>
- <translation>&amp;Budiž</translation>
+ <translation>&amp;Použít</translation>
</message>
<message>
<source>&amp;Cancel</source>
@@ -1137,7 +779,7 @@
</message>
<message>
<source>This change would require a client restart.</source>
- <translation>Tahle změna bude chtít restartovat klienta.</translation>
+ <translation>Tato změna vyžaduje restart aplikace.</translation>
</message>
<message>
<source>The supplied proxy address is invalid.</source>
@@ -1184,7 +826,7 @@
</message>
<message>
<source>Balances</source>
- <translation>Stavy úÄtů</translation>
+ <translation>Stav úÄtů</translation>
</message>
<message>
<source>Total:</source>
@@ -1220,97 +862,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Zpracování URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Neplatná platební adresa %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Platební požadavek byl odmítnut</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Síť platebního požadavku neodpovídá síti klienta.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Platební požadavek není zahájený.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Požadovaná platební Äástka %1 je příliÅ¡ malá (je považována za prach).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Chyba platebního požadavku</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Nemůžu spustit bitcoin: obsluha click-to-pay</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Zdrojová URL platebního požadavku není platná: %1</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>Nepodařilo se analyzovat URI! Důvodem může být neplatná Bitcoinová adresa nebo poškozené parametry URI.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Zpracování souboru platebního požadavku</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Soubor platebního požadavku nejde pÅ™eÄíst nebo zpracovat! PříÄinou může být Å¡patný soubor platebního požadavku.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Platební požadavek vypršel.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>Neověřené platební požadavky k uživatelským platebním skriptům nejsou podporované.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Neplatný platební požadavek.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <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>Error communicating with %1: %2</source>
- <translation>Chyba při komunikaci s %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Platební požadavek je neÄitelný!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Chybná odpovÄ›Ä ze serveru %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Platba potvrzena</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Chyba síťového požadavku</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1365,31 +916,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Ulož obrázek...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopíruj obrázek</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Ulož QR kód</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG obrázek (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Název klienta</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1410,10 +938,6 @@
<translation>Obecné</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Používaná verze OpenSSL</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Používaná verze BerkeleyDB</translation>
</message>
@@ -1442,8 +966,8 @@
<translation>Aktuální poÄet bloků</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>Otevři soubor s ladicími záznamy Bitcoin Core z aktuálního datového adresáře. U velkých logů to může pár vteřin zabrat.</translation>
+ <source>Memory usage</source>
+ <translation>Využití paměti</translation>
</message>
<message>
<source>Received</source>
@@ -1534,10 +1058,6 @@
<translation>Ven:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Datum kompilace</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Soubor s ladicími záznamy</translation>
</message>
@@ -1546,8 +1066,32 @@
<translation>VyÄistit konzoli</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Vítej v RPC konzoli Bitcoin Core.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Odpojit uzel</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Uvalit na uzel klatbu na</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;hodinu</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;den</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;týden</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;rok</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Zbavit uzel klatby</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>
@@ -1574,6 +1118,10 @@
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(id uzlu: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>via %1</translation>
</message>
@@ -1626,7 +1174,7 @@
</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>Volitelná zpráva, která se připojí k platebnímu požadavku a která se zobrazí, když se požadavek otevře. Poznámka: Tahle zpráva se neposílá s platbou po Bitcoinové síti.</translation>
+ <translation>Volitelná zpráva, která se připojí k platebnímu požadavku a která se zobrazí, když se požadavek otevře. Poznámka: tahle zpráva se neposílá s platbou po Bitcoinové síti.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
@@ -1634,7 +1182,7 @@
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation>Tímto formulář můžeš požadovat platby. Všechna pole jsou &lt;b&gt;volitelná&lt;/b&gt;.</translation>
+ <translation>Tímto formulářem můžeš požadovat platby. Všechna pole jsou &lt;b&gt;volitelná&lt;/b&gt;.</translation>
</message>
<message>
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
@@ -1672,18 +1220,6 @@
<source>Remove</source>
<translation>Smazat</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopíruj její oznaÄení</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopíruj zprávu</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopíruj Äástku</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1703,73 +1239,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Ulož obrázek...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Platební požadavek: %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informace o platbÄ›</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Částka</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>OznaÄení</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Zpráva</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Výsledná URI je příliÅ¡ dlouhá, zkus zkrátit text oznaÄení/zprávy.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Chyba při kódování URI do QR kódu.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>OznaÄení</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Zpráva</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Částka</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez oznaÄení)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(bez zprávy)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(bez Äástky)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1890,14 +1359,6 @@
<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>
@@ -1927,111 +1388,7 @@
</message>
<message>
<source>S&amp;end</source>
- <translation>P&amp;ošli</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation>PotvrÄ odeslání mincí</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 pro %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopíruj poÄet</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopíruj Äástku</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopíruj poplatek</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopíruj Äistou Äástku</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopíruj bajty</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopíruj prioritu</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopíruj drobné</translation>
- </message>
- <message>
- <source>or</source>
- <translation>nebo</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Částka pÅ™ekraÄuje stav úÄtu.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Celková Äástka pÅ™i pÅ™ipoÄítání poplatku %1 pÅ™ekroÄí stav úÄtu.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Vytvoření transakce selhalo!</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>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>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Poplatek vyšší než %1 je považován za absurdně vysoký.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Platební požadavek vypršel.</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>Potvrzování by podle odhadu mÄ›lo zaÄít bÄ›hem %n bloku.</numerusform><numerusform>Potvrzování by podle odhadu mÄ›lo zaÄít bÄ›hem %n bloků.</numerusform><numerusform>Potvrzování by podle odhadu mÄ›lo zaÄít bÄ›hem %n bloků.</numerusform></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>Duplicate address found: addresses should only be used once each.</source>
- <translation>Zaznamenána duplicitní adresa: každá adresa by ale měla být použita vždy jen jednou.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Upozornění: Neplatná Bitcoinová adresa</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez oznaÄení)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Upozornění: Neznámá adresa pro drobné</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopíruj prach</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Jsi si jistý, že to chceš poslat?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>pÅ™idán jako transakÄní poplatek</translation>
+ <translation>Pošl&amp;i</translation>
</message>
</context>
<context>
@@ -2045,10 +1402,6 @@
<translation>&amp;Komu:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Zadej oznaÄení této adresy; obojí se ti pak uloží do adresáře</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>O&amp;znaÄení:</translation>
</message>
@@ -2086,7 +1439,7 @@
</message>
<message>
<source>S&amp;ubtract fee from amount</source>
- <translation>&amp;OdeÄíst poplatek od Äástky</translation>
+ <translation>Od&amp;eÄíst poplatek od Äástky</translation>
</message>
<message>
<source>Message:</source>
@@ -2120,10 +1473,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core se ukonÄuje...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Nevypínej poÄítaÄ, dokud toto okno nezmizí.</translation>
</message>
@@ -2172,7 +1521,7 @@
</message>
<message>
<source>Copy the current signature to the system clipboard</source>
- <translation>Zkopíruj aktuálně vybraný podpis do systémové schránky</translation>
+ <translation>Zkopíruj tento podpis do schránky</translation>
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
@@ -2214,70 +1563,10 @@
<source>Reset all verify message fields</source>
<translation>Vymaž všechna pole formuláře pro ověření zrávy</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Kliknutím na "Podepiš zprávu" vygeneruješ podpis</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Zadaná adresa je neplatná.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Zkontroluj ji prosím a zkus to pak znovu.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Zadaná adresa nepasuje ke klíÄi.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>OdemÄení peněženky bylo zruÅ¡eno.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Soukromý klÃ­Ä pro zadanou adresu není dostupný.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Nepodařilo se podepsat zprávu.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Zpráv podepsána.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Podpis nejde dekódovat.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Zkontroluj ho prosím a zkus to pak znovu.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Podpis se neshoduje s hašem zprávy.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Nepodařilo se ověřit zprávu.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Zpráva ověřena.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Vývojáři Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2290,502 +1579,100 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Otřevřeno dokud %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>kolidující</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/nepotvrzeno</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 potvrzení</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Stav</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, rozesláno přes %n uzel</numerusform><numerusform>, rozesláno přes %n uzly</numerusform><numerusform>, rozesláno přes %n uzlů</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Zdroj</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Vygenerováno</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Od</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Pro</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>vlastní adresa</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>sledovaná</translation>
- </message>
- <message>
- <source>label</source>
- <translation>oznaÄení</translation>
- </message>
- <message>
- <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>
- </message>
- <message>
- <source>Debit</source>
- <translation>Výdaj</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Celkové výdaje</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Celkové příjmy</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>TransakÄní poplatek</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>ÄŒistá Äástka</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Zpráva</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Komentář</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID transakce</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Obchodník</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>Vygenerované mince musí Äekat %1 bloků, než mohou být utraceny. Když jsi vygeneroval tenhle blok, tak byl rozposlán do sítÄ›, aby byl pÅ™idán do Å™etÄ›zce bloků. Pokud se mu nepodaří dostat se do Å™etÄ›zce, zmÄ›ní se na "neakceptovaný" a nepůjde utratit. To se obÄas může stát, pokud jiný uzel vygeneruje blok zhruba ve stejném okamžiku jako ty.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Ladicí informace</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transakce</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Vstupy</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Částka</translation>
- </message>
- <message>
- <source>true</source>
- <translation>true</translation>
- </message>
- <message>
- <source>false</source>
- <translation>false</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ještě nebylo rozesláno</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Otevřeno pro %n další blok</numerusform><numerusform>Otevřeno pro %n další bloky</numerusform><numerusform>Otevřeno pro %n dalších bloků</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>neznámo</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detaily transakce</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Toto okno zobrazuje detailní popis transakce</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Otevřeno pro %n další blok</numerusform><numerusform>Otevřeno pro %n další bloky</numerusform><numerusform>Otevřeno pro %n dalších bloků</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Otřevřeno dokud %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Potvrzeno (%1 potvrzení)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Tento blok nedostal žádný jiný uzel a pravděpodobně nebude akceptován!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Vygenerováno, ale neakceptováno</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>OznaÄení</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Nepotvrzeno</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Potvrzuje se (%1 z %2 doporuÄených potvrzení)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>V kolizi</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Přijato do</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Přijato od</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Posláno na</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Platba sama sobÄ›</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Vytěženo</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>sledovací</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Stav transakce. Najetím myÅ¡i na toto políÄko si zobrazíš poÄet potvrzení.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Datum a Äas pÅ™ijetí transakce.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Druh transakce.</translation>
- </message>
- <message>
- <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>User-defined intent/purpose of the transaction.</source>
- <translation>Uživatelsky urÄený úÄel transakce.</translation>
- </message>
+ <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Amount removed from or added to balance.</source>
- <translation>Částka odeÄtená z nebo pÅ™iÄtená k úÄtu.</translation>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Jednotka pro Äástky. Klikni pro výbÄ›r nÄ›jaké jiné.</translation>
</message>
</context>
<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>VÅ¡e</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Dnes</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Tento týden</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Tento měsíc</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Minulý měsíc</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Letos</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Rozsah...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Přijato</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Posláno</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Sám sobě</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Vytěženo</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Ostatní</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Zadej adresu nebo oznaÄení pro její vyhledání</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimální Äástka</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopíruj adresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopíruj její oznaÄení</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopíruj Äástku</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopíruj ID transakce</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Uprav oznaÄení</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Zobraz detaily transakce</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <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>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>PÅ™i ukládání transakÄní historie do %1 se pÅ™ihodila nÄ›jaká chyba.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Úspěšně vyexportováno</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>TransakÄní historie byla v pořádku uložena do %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>CSV formát (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Potvrzeno</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>OznaÄení</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
+ <name>bitcoin-core</name>
<message>
- <source>ID</source>
- <translation>ID</translation>
+ <source>Options:</source>
+ <translation>Možnosti:</translation>
</message>
<message>
- <source>Range:</source>
- <translation>Rozsah:</translation>
+ <source>Specify data directory</source>
+ <translation>Adresář pro data</translation>
</message>
<message>
- <source>to</source>
- <translation>až</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Připojit se k uzlu, získat adresy jeho protějšků a odpojit se</translation>
</message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation>Jednotka pro Äástky. Klikni pro výbÄ›r nÄ›jaké jiné.</translation>
+ <source>Specify your own public address</source>
+ <translation>Udej svou veřejnou adresu</translation>
</message>
-</context>
-<context>
- <name>WalletFrame</name>
<message>
- <source>No wallet has been loaded.</source>
- <translation>Žádná peněženka se nenaÄetla.</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Akceptovat příkazy z příkazové řádky a přes JSON-RPC</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>Pošli mince</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Pokud není &lt;category&gt; zadána nebo je &lt;category&gt; = 1, bude tisknout veškeré ladicí informace.</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Export</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>ProÅ™ezávání je nastaveno pod minimum %d MiB. Použij, prosím, nÄ›jaké vyšší Äíslo.</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportuj data z tohoto panelu do souboru</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Prořezávání: poslední synchronizace peněženky proběhla před už prořezanými daty. Je třeba provést -reindex (tedy v případě prořezávacího režimu stáhnout znovu celý řetězec bloků)</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Záloha peněženky</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>Omezit nároky na úložný prostor proÅ™ezáváním (mazáním) starých bloků. Tento režim není sluÄitelný s -txindex ani -rescan. UpozornÄ›ní: opÄ›tovná zmÄ›na tohoto nastavení bude vyžadovat nové stažení celého Å™etÄ›zce bloků. (výchozí: 0 = bloky neproÅ™ezávat, &gt;%u = cílová velikost souborů s bloky, v MiB)</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Data peněženky (*.dat)</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>V prořezávacím režimu není možné přeskenovávat řetězec bloků. Musíš provést -reindex, což znovu stáhne celý řetězec bloků.</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Zálohování selhalo</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Chyba: Přihodila se závažná vnitřní chyba, podrobnosti viz v debug.log</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Při ukládání peněženky do %1 se přihodila nějaká chyba.</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Poplatek (v %s/kB), který se přidá ke každé odeslané transakci (výchozí: %s)</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Data z peněženky byla v pořádku uložena do %1.</translation>
+ <source>Pruning blockstore...</source>
+ <translation>Prořezávám úložiště bloků...</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>Úspěšně zazálohováno</translation>
+ <source>Run in the background as a daemon and accept commands</source>
+ <translation>Běžet na pozadí jako démon a přijímat příkazy</translation>
</message>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Možnosti:</translation>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Nemohu spustit HTTP server. Detaily viz v debug.log.</translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>Adresář pro data</translation>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <translation>PÅ™ijímat spojení zvenÄí (výchozí: 1, pokud není zadáno -proxy nebo -connect)</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Připojit se k uzlu, získat adresy jeho protějšků a odpojit se</translation>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Udej svou veřejnou adresu</translation>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee je nastaveno velmi vysoko! Toto je transakÄní poplatek, který bys platil, pokud nebude k dispozici odhad poplatků.</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Akceptovat příkazy z příkazové řádky a přes JSON-RPC</translation>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>Sazba poplatku (v %s/kB), která se použije, pokud nebude k dispozici dostatek dat pro automatický odhad poplatku (výchozí: %s)</translation>
</message>
<message>
- <source>Run in the background as a daemon and accept commands</source>
- <translation>Běžet na pozadí jako démon a akceptovat příkazy</translation>
- </message>
- <message>
- <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>PÅ™ijímat spojení zvenÄí (výchozí: 1, pokud není zadáno -proxy nebo -connect)</translation>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Přijímat přeposílané transakce obdržené od vždy vítaných protějšků, i když transakce nepřeposíláme (výchozí: %d)</translation>
</message>
<message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
@@ -2804,24 +1691,24 @@
<translation>Spustit příkaz, když se objeví transakce týkající se peněženky (%s se v příkazu nahradí za 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>Nastavení poÄtu vláken pro verifikaci skriptů (%u až %d, 0 = automaticky, &lt;0 = nechat daný poÄet jader volný, výchozí: %d)</translation>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Vynutit přeposílání transakcí od vždy vítaných protějšků (tj. těch na bílé listině), i když porušují místní zásady pro přeposílání (výchozí: %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>Tohle je testovací verze – používej ji jen na vlastní riziko, ale rozhodně ji nepoužívej k těžbě nebo pro obchodní aplikace</translation>
+ <source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
+ <translation>Nastavení poÄtu vláken pro verifikaci skriptů (%u až %d, 0 = automaticky, &lt;0 = nechat daný poÄet jader volný, výchozí: %d)</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Nedaří se mi pÅ™ipojit na %s na tomhle poÄítaÄi. Bitcoin Core už pravdÄ›podobnÄ› jednou běží.</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>Databáze bloků obsahuje blok, který vypadá jako z budoucnosti, což může být kvůli Å¡patnÄ› nastavenému datu a Äasu na tvém poÄítaÄi. Nech databázi bloků pÅ™estavÄ›t pouze v případÄ›, že si jsi jistý, že máš na poÄítaÄi správný datum a Äas</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>UPOZORNÄšNÃ: vygenerováno nezvykle mnoho bloků – pÅ™ijato %d bloků jen za posledních %d hodin (oÄekáváno %d)</translation>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation>Tohle je testovací verze – používej ji jen na vlastní riziko, ale rozhodně ji nepoužívej k těžbě nebo pro obchodní aplikace</translation>
</message>
<message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>UPOZORNÄšNÃ: zkontroluj své spojení do sítÄ› – bylo pÅ™ijato %d bloků za posledních %d hodin (oÄekáváno %d)</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Použít UPnP k namapování naslouchacího portu (výchozí: 1, pokud naslouchá a nepoužívá -proxy)</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
@@ -2832,18 +1719,22 @@
<translation>Upozornění: Nesouhlasím zcela se svými protějšky! Možná potřebuji aktualizovat nebo ostatní uzly potřebují aktualizovat.</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>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>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Vždy vítat protÄ›jÅ¡ky pÅ™ipojující se z dané podsítÄ› Äi IP adresy. Lze zadat i vícekrát.</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>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool musí být alespoň %d MB</translation>
</message>
<message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;category&gt; může být:</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>Připojit komentář k typu klienta</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Možnosti vytváření bloku:</translation>
</message>
@@ -2908,6 +1799,22 @@
<translation>Neplatná -onion adresa: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Neplatná Äástka pro -fallbackfee=&lt;Äástka&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Udržovat zasobník transakcí menší než &lt;n&gt; megabajtů (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Místo pro autentizaÄní cookie (výchozí: adresář pro data)</translation>
+ </message>
+ <message>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Minimální poÄet bajtů na každý sigop v transakcích, které pÅ™eposíláme a těžíme (výchozí: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>Je nedostatek deskriptorů souborů.</translation>
</message>
@@ -2916,6 +1823,10 @@
<translation>Připojovat se pouze k uzlům v &lt;net&gt; síti (ipv4, ipv6 nebo onion)</translation>
</message>
<message>
+ <source>Print version and exit</source>
+ <translation>Vypsat verzi a skonÄit</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>Prořezávání nemůže být zkonfigurováno s negativní hodnotou.</translation>
</message>
@@ -2936,10 +1847,26 @@
<translation>Udej název souboru s peněženkou (v rámci datového adresáře)</translation>
</message>
<message>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Nepodporovaný argument -benchmark se ignoruje, použij -debug=bench.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Nepodporovaný argument -debugnet se ignoruje, použij -debug=net.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Argument -tor již není podporovaný, použij -onion.</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>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>Komentář u typu klienta (%s) obsahuje riskantní znaky.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Ověřuji bloky...</translation>
</message>
@@ -2956,30 +1883,18 @@
<translation>Možnosti peněženky:</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>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Je třeba přestavět databázi použitím -reindex, aby bylo možné změnit -txindex</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>Povolit JSON-RPC spojení ze specifikovaného zdroje. Platnou hodnotou &lt;ip&gt; je jednotlivá IP adresa (např. 1.2.3.4), síť/maska (např. 1.2.3.4/255.255.255.0) nebo síť/CIDR (např. 1.2.3.4/24). Tuto volbu lze použít i vícekrát</translation>
</message>
<message>
<source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source>
- <translation>Obsadit zadanou adresu a protějšky, které se na ní připojí, umístit na bílou listinu. Pro zápis IPv6 adresy použij notaci [adresa]:port</translation>
+ <translation>Obsadit zadanou adresu a vždy vítat protějšky, které se na ni připojí. Pro zápis IPv6 adresy použij notaci [adresa]: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>Čekat na zadané adrese na JSON-RPC spojení. Pro zápis IPv6 adresy použij notaci [adresa]:port. Tuto volbu lze použít i vícekrát (výchozí: poslouchat na všech rozhraních)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Nedaří se mi získat zámek na datový adresář %s. Bitcoin Core pravděpodobně už jednou běží.</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Vytvářet nové soubory s výchozími systémovými právy namísto umask 077 (uplatní se, pouze pokud je vypnutá funkce peněženky)</translation>
</message>
@@ -2996,6 +1911,10 @@
<translation>Spustit příkaz, když přijde relevantní upozornění nebo když dojde k opravdu dlouhému rozštěpení řetezce bloků (%s se v příkazu nahradí zprávou)</translation>
</message>
<message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Poplatky (v %s/kB) menší než tato hodnota jsou považovány za nulové pro úÄely pÅ™eposílání, těžení a 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 zaÄaly být transakce potvrzovány v průmÄ›ru bÄ›hem n bloků (výchozí: %u)</translation>
</message>
@@ -3020,10 +1939,6 @@
<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>The transaction amount is too small to send after the fee has been deducted</source>
<translation>Částka v transakci po odeÄtení poplatku je příliÅ¡ malá na odeslání</translation>
</message>
@@ -3033,7 +1948,7 @@
</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>Na protÄ›jÅ¡ky na bílé listinÄ› se nevztahuje DoS klatba a jejich transakce jsou vždy pÅ™eposílány, i když už tÅ™eba jsou v mempoolu, což je užiteÄné napÅ™. pro bránu</translation>
+ <translation>Na vždy vítané protÄ›jÅ¡ky se nevztahuje DoS klatba a jejich transakce jsou vždy pÅ™eposílány, i když už tÅ™eba jsou v transakÄním zásobníku, což je užiteÄné napÅ™. pro bránu</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>
@@ -3048,48 +1963,24 @@
<translation>Přijímat veřejné REST požadavky (výchozí: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Aktivuji nejlepší řetězec...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Nemohu přeložit -whitebind adresu: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Automaticky v Toru vytvářet skryté služby (výchozí: %d)</translation>
</message>
<message>
<source>Connect through SOCKS5 proxy</source>
<translation>Připojit se přes SOCKS5 proxy</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Vývojáři Bitcoin Core</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>Information</source>
- <translation>Informace</translation>
- </message>
- <message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <translation>Selhala úvodní zevrubná provÄ›rka. Bitcoin Core se ukonÄuje.</translation>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Importovat při startu bloky z externího souboru blk000??.dat</translation>
</message>
<message>
- <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neplatná Äástka pro -maxtxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neplatná Äástka pro -minrelaytxfee=&lt;Äástka&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neplatná Äástka pro -mintxfee=&lt;Äástka&gt;: '%s'</translation>
+ <source>Information</source>
+ <translation>Informace</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3116,12 +2007,12 @@
<translation>Možnosti RPC serveru:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>Při startu znovu vytvořit index řetězce bloků z aktuálních blk000??.dat souborů</translation>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Omezuji -maxconnections z %d na %d kvůli systémovým omezením.</translation>
</message>
<message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Přijímat a zobrazovat poplachy z P2P sítě (výchozí: %u)</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Přeskenovat při startu řetězec bloků na chybějící transakce tvé pěněženky</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
@@ -3152,6 +2043,14 @@
<translation>Tohle je experimentální program.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Heslo ovládacího portu Toru (výchozí: prázdné)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Ovládací port Toru, je-li zapnuté onion naslouchání (výchozí: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Částka v transakci je příliš malá</translation>
</message>
@@ -3172,24 +2071,28 @@
<translation>Nedaří se mi pÅ™ipojit na %s na tomhle poÄítaÄi (operace bind vrátila chybu %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Uživatelské jméno pro JSON-RPC spojení</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Převést při startu peněženku na nejnovější formát</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Soubor s peněženkou potÅ™eboval pÅ™epsat: restartuj Bitcoin Core, aby se operace dokonÄila</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Uživatelské jméno pro JSON-RPC spojení</translation>
</message>
<message>
<source>Warning</source>
<translation>Upozornění</translation>
</message>
<message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Zda fungovat v ÄistÄ› blokovém režimu (výchozí: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Vymazat všechny transakce z peněženky...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>Soubor wallet.dat je poškozen, jeho záchrana se nezdařila</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>Možnosti ZeroMQ oznámení:</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3200,10 +2103,6 @@
<translation>Spustit příkaz, když se změní nejlepší blok (%s se v příkazu nahradí hashem bloku)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Tato nápověda</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Povolit DNS dotazy pro -addnode (přidání uzlu), -seednode a -connect (připojení)</translation>
</message>
@@ -3212,14 +2111,26 @@
<translation>NaÄítám adresy...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee je nastaveno velmi vysoko! Takto vysoký poplatek může být zaplacen v jednotlivé transakci.</translation>
+ </message>
+ <message>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee je nastaveno velmi vysoko! Toto je transakÄní poplatek, který zaplatíš za každou poslanou transakci.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Nedržet transakce v zásobníku déle než &lt;n&gt; hodin (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Poplatky (v %s/kB) menší než tato hodnota jsou považovány za nulové pro úÄely vytváření transakcí (výchozí: %s)</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>
@@ -3236,10 +2147,34 @@
<translation>Tisknout ladicí informace (výchozí: %u, zadání &lt;category&gt; je volitelné)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Umožnit filtrování bloků a transakcí pomocí Bloomova filtru (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>Celková délka síťového identifikaÄního Å™etÄ›zce (%i) pÅ™ekroÄila svůj horní limit (%i). Omez poÄet nebo velikost voleb uacomment.</translation>
+ </message>
+ <message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Pokusit se udržet odchozí provoz pod stanovenou hodnotou (v MiB za 24 hodin), 0 = bez omezení (výchozí: %d)</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Byl použit nepodporovaný argument -socks. Nastavení verze SOCKS už není možné, podporovány jsou pouze SOCKS5 proxy.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Nepodporovaný argument -whitelistalwaysrelay se ignoruje, použij -whitelistrelay a/nebo -whitelistforcerelay.</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>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Uživatelské jméno a zahašované heslo pro JSON-RPC spojení. Pole &lt;userpw&gt; má formát: &lt;UŽIVATELSKÉ_JMÉNO&gt;:&lt;SŮL&gt;$&lt;HAŠ&gt;. Pomocný pythonní skript je přiložen v share/rpcuser. Tuto volbu lze použít i vícekrát</translation>
+ </message>
+ <message>
<source>(default: %s)</source>
<translation>(výchozí: %s)</translation>
</message>
@@ -3248,14 +2183,6 @@
<translation>Vždy získávat adresy dalších protějšků přes DNS (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>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>
@@ -3336,18 +2263,6 @@
<translation>V -onlynet byla uvedena neznámá síť: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Nemohu přeložit -bind adresu: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Nemohu přeložit -externalip adresu: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neplatná Äástka pro -paytxfee=&lt;Äástka&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nedostatek prostředků</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cs_CZ.ts b/src/qt/locale/bitcoin_cs_CZ.ts
index 026247e7c6..70aa981f50 100644
--- a/src/qt/locale/bitcoin_cs_CZ.ts
+++ b/src/qt/locale/bitcoin_cs_CZ.ts
@@ -2,6 +2,10 @@
<context>
<name>AddressBookPage</name>
<message>
+ <source>Right-click to edit address or label</source>
+ <translation>Pravým klikem editujte adresu nebo popisek</translation>
+ </message>
+ <message>
<source>Create a new address</source>
<translation>Vytvořit novou adresu</translation>
</message>
@@ -10,27 +14,20 @@
<translation>Kopírovat aktuálně vybrané adresy do schránky</translation>
</message>
<message>
- <source>&amp;Delete</source>
- <translation>&amp;Odstranit</translation>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Odstraní aktuálně vybrané adresy ze seznamu</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Textový soubor oddělený středníkem (*.csv)</translation>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Exportovat aktuální pohled do souboru</translation>
</message>
- </context>
-<context>
- <name>AddressTableModel</name>
<message>
- <source>Label</source>
- <translation>Popis</translation>
+ <source>&amp;Export</source>
+ <translation>&amp;Exportovat</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez popisu)</translation>
+ <source>&amp;Delete</source>
+ <translation>&amp;Odstranit</translation>
</message>
</context>
<context>
@@ -47,63 +44,7 @@
<source>Repeat new passphrase</source>
<translation>Zopakujte nové heslo</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Zašifrovat peněženku</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Tato operace vyžaduje heslo k odemknutí peněženky.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Odemknout peněženku</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Tato operace vyžaduje heslo k dešifrování peněženky.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dešifrovat peněženku</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Změnit heslo</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>PotvrÄte zaÅ¡ifrování peněženky</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Peněženka zašifrována</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Zašifrování peněženky selhalo</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Šifrování peněženky selhalo vinou vnitřní chyby. Vaše peněženka nebyla zašifrována.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Zadaná hesla nejsou shodná.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>OdemÄení peněženky selhalo</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Heslo zadané k dešifrování peněženky nebylo správné</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Deěifrování peněženky selhalo</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -187,11 +128,12 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
+ <source>Amount:</source>
+ <translation>Množství:</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>Množství</translation>
</message>
@@ -203,18 +145,6 @@
<source>Confirmed</source>
<translation>Potvrzeno</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopírovat sdresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopírovat popis</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez popisu)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -230,34 +160,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresa</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nová adresa pro příjem</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nová adresa k odeslání</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Upravit adresu pro příjem</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Upravit adresu k odeslání</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Zadaná adresa "%1" se již v seznamu adres nachází.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Nemohu odemknout peněženku</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Generování nového klíÄe selhalo.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -298,9 +200,6 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -311,9 +210,6 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
<source>Name</source>
@@ -323,62 +219,35 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>Copy label</source>
- <translation>Kopírovat popis</translation>
- </message>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Množství</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;Popisek:</translation>
</message>
<message>
- <source>Label</source>
- <translation>Popis</translation>
+ <source>&amp;Message:</source>
+ <translation>Zpráva:</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Popis</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Množství</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez popisu)</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
</context>
<context>
<name>SendCoinsDialog</name>
<message>
- <source>Balance:</source>
- <translation>Zůstatek:</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Částka k zaplacení musí být větší než 0.</translation>
+ <source>Amount:</source>
+ <translation>Množství:</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(bez popisu)</translation>
+ <source>Balance:</source>
+ <translation>Zůstatek:</translation>
</message>
</context>
<context>
<name>SendCoinsEntry</name>
<message>
+ <source>&amp;Label:</source>
+ <translation>&amp;Popisek:</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Zpráva:</translation>
</message>
@@ -400,194 +269,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1 potvrzeno</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 potvrzení</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Stav</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Množství</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detaily transakce</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Toto podokno zobrazuje detailní popis transakce</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Potvrzeno (%1 potvrzení)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Tento blok nebyl přijat žádným dalším uzlem a pravděpodobně nebude akceptován!</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Popis</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Přijato s</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Odesláno na</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Platba sobě samému</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Vytěženo</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Typ transakce.</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>VÅ¡e</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Dnes</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Tento týden</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Tento měsíc</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Minulý měsíc</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Tento rok</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Rozsah...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Přijato s</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Odesláno na</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Sobě samému</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Vytěženo</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Ostatní</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Min. množství</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopírovat sdresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopírovat popis</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Upravit popis</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Textový soubor oddělený středníkem (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Potvrzeno</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Popis</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Rozsah:</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
diff --git a/src/qt/locale/bitcoin_cy.ts b/src/qt/locale/bitcoin_cy.ts
index eba0363334..38bc45775b 100644
--- a/src/qt/locale/bitcoin_cy.ts
+++ b/src/qt/locale/bitcoin_cy.ts
@@ -22,10 +22,6 @@
<translation>C&amp;au</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Cyfeiriad Copi</translation>
- </message>
- <message>
<source>&amp;Export</source>
<translation>&amp;Allforio</translation>
</message>
@@ -33,49 +29,6 @@
<source>&amp;Delete</source>
<translation>&amp;Dileu</translation>
</message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Dewis</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Cyfeiriadau anfon</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Cyfeiriadau derbyn</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copïo &amp;Label</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Golygu</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Allforio Rhestr Cyfeiriad</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Methodd Allfor</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Cyfeiriad</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(heb label)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -91,63 +44,7 @@
<source>Repeat new passphrase</source>
<translation>Ailadroddwch gyfrinymadrodd newydd</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Amgryptio'r waled</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Mae angen i'r gweithred hon ddefnyddio'ch cyfrinymadrodd er mwyn datgloi'r waled.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Datgloi'r waled</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Mae angen i'r gweithred hon ddefnyddio'ch cyfrinymadrodd er mwyn dadgryptio'r waled.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dadgryptio'r waled</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Newid cyfrinymadrodd</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Cadarnau amgryptiad y waled</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Ydych chi'n siwr eich bod chi eisiau amgryptio dy waled di?</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Waled wedi'i amgryptio</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Amgryptiad waled wedi methu</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Methodd amgryptiad y waled oherwydd gwall mewnol. Ni amgryptwyd eich waled.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Dydy'r cyfrinymadroddion a ddarparwyd ddim yn cyd-fynd â'u gilydd.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Methodd ddatgloi'r waled</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Methodd dadgryptiad y waled</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -230,10 +127,6 @@
<translation>&amp;Derbyn</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Dangos gwybodaeth am Graidd Bitcoin</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Dangos / Cuddio</translation>
</message>
@@ -253,14 +146,6 @@
<source>Tabs toolbar</source>
<translation>Bar offer tabiau</translation>
</message>
- <message>
- <source>Bitcoin Core</source>
- <translation>Craidd Bitcoin</translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Ynghylch Craidd Bitcoin</translation>
- </message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n awr</numerusform><numerusform>%n awr</numerusform><numerusform>%n awr</numerusform><numerusform>%n awr</numerusform></translation>
@@ -343,31 +228,16 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
- <source>Date</source>
- <translation>Dyddiad</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Cyfeiriad copi</translation>
+ <source>Amount:</source>
+ <translation>Maint</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Copïo label</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(heb label)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(newid)</translation>
+ <source>Date</source>
+ <translation>Dyddiad</translation>
</message>
-</context>
+ </context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -382,34 +252,6 @@
<source>&amp;Address</source>
<translation>&amp;Cyfeiriad</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Cyfeiriad derbyn newydd</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Cyfeiriad anfon newydd</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Golygu'r cyfeiriad derbyn</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Golygu'r cyfeiriad anfon</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Mae'r cyfeiriad "%1" sydd newydd gael ei geisio gennych yn y llyfr cyfeiriad yn barod.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Methodd ddatgloi'r waled.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Methodd gynhyrchu allwedd newydd.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -421,14 +263,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Craidd Bitcoin</translation>
- </message>
- <message>
- <source>About Bitcoin Core</source>
- <translation>Ynghylch Craidd Bitcoin</translation>
- </message>
- <message>
<source>Usage:</source>
<translation>Cynefod:</translation>
</message>
@@ -440,14 +274,6 @@
<translation>Croeso</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Croeso i Graidd Bitcoin</translation>
- </message>
- <message>
- <source>Bitcoin Core</source>
- <translation>Craidd Bitcoin</translation>
- </message>
- <message>
<source>Error</source>
<translation>Gwall</translation>
</message>
@@ -506,18 +332,12 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
<source>&amp;Information</source>
@@ -538,43 +358,12 @@
<source>&amp;Label:</source>
<translation>&amp;Label:</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copïo label</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Cyfeiriad</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Neges</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dyddiad</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Neges</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(heb label)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Cyfeiriad Copi</translation>
</message>
</context>
<context>
@@ -584,6 +373,10 @@
<translation>Anfon arian</translation>
</message>
<message>
+ <source>Amount:</source>
+ <translation>Maint</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Anfon at pobl lluosog ar yr un pryd</translation>
</message>
@@ -595,14 +388,6 @@
<source>Confirm the send action</source>
<translation>Cadarnhau'r gweithrediad anfon</translation>
</message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 i %2</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(heb label)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -626,6 +411,10 @@
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
+ <message>
+ <source>Message:</source>
+ <translation>Neges:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -648,14 +437,6 @@
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Craidd Bitcoin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Datblygwyr Graidd Bitcoin</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -664,103 +445,21 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Agor tan %1</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dyddiad</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Neges</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dyddiad</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Math</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>
- <message>
- <source>Today</source>
- <translation>Heddiw</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Eleni</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Cyfeiriad copi</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copïo label</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Methodd Allfor</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dyddiad</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Math</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Cyfeiriad</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
+ <name>bitcoin-core</name>
<message>
- <source>Send Coins</source>
- <translation>Anfon arian</translation>
+ <source>Options:</source>
+ <translation>Opsiynau:</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Allforio</translation>
+ <source>Bitcoin Core</source>
+ <translation>Craidd Bitcoin</translation>
</message>
- </context>
-<context>
- <name>bitcoin-core</name>
<message>
<source>Information</source>
<translation>Gwybodaeth</translation>
diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts
index edcd9b3b03..d298c81bd4 100644
--- a/src/qt/locale/bitcoin_da.ts
+++ b/src/qt/locale/bitcoin_da.ts
@@ -26,10 +26,6 @@
<translation>&amp;Luk</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopiér adresse</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Slet den markerede adresse fra listen</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Slet</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Vælg adresse at sende bitcoins til</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Vælg adresse at modtage bitcoins med</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Vælg</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Afsendelsesadresser</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Modtagelsesadresser</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Disse er dine Bitcoin-adresser for at sende betalinger. Tjek altid beløb og modtageradresse, inden du sender bitcoins.</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>Dette er dine Bitcoin-adresser til at modtage betalinger med. Det anbefales are bruge en ny modtagelsesadresse for hver transaktion.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopiér &amp;mærkat</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Redigér</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Eksportér adresseliste</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommasepareret fil (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Eksport mislykkedes</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Der opstod en fejl under gemning af adresselisten til %1. Prøv venligst igen.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Mærkat</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen mærkat)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Gentag ny adgangskode</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Kryptér tegnebog</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Denne funktion har brug for din tegnebogs adgangskode for at låse tegnebogen op.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>LÃ¥s tegnebog op</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Denne funktion har brug for din tegnebogs adgangskode for at dekryptere tegnebogen.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dekryptér tegnebog</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Skift adgangskode</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Bekræft tegnebogskryptering</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>Advarsel: Hvis du krypterer din tegnebog og mister din adgangskode, vil du &lt;b&gt;MISTE ALLE DINE BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Advarsel: Caps Lock-tasten er aktiveret!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Tegnebog krypteret</translation>
- </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>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>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>
- <translation>Tegnebogskryptering mislykkedes</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Tegnebogskryptering mislykkedes på grund af en intern fejl. Din tegnebog blev ikke krypteret.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>De angivne adgangskoder stemmer ikke overens.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Tegnebogsoplåsning mislykkedes</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Den angivne adgangskode for tegnebogsdekrypteringen er forkert.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Tegnebogsdekryptering mislykkedes</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Tegnebogens adgangskode blev ændret.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -270,6 +111,14 @@
<translation>Afslut program</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Om %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Vis informationer om %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Om &amp;Qt</translation>
</message>
@@ -282,6 +131,10 @@
<translation>&amp;Indstillinger…</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Redigér konfigurationsindstillinger for %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>&amp;Kryptér tegnebog…</translation>
</message>
@@ -306,14 +159,6 @@
<translation>&amp;Åbn URI…</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core-klient</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importerer blokke fra disken…</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Genindekserer blokke på disken…</translation>
</message>
@@ -358,10 +203,6 @@
<translation>&amp;Modtag</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Vis oplysninger om Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Vis / skjul</translation>
</message>
@@ -398,22 +239,10 @@
<translation>Faneværktøjslinje</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Anmod om betalinger (genererer QR-koder og "bitcoin:"-URI'er)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
@@ -429,15 +258,19 @@
<source>&amp;Command-line options</source>
<translation>Tilvalg for &amp;kommandolinje</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Vis Bitcoin Core hjælpebesked for at få en liste over mulige tilvalg for Bitcoin kommandolinje</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n aktiv forbindelse til Bitcoin-netværket</numerusform><numerusform>%n aktive forbindelser til Bitcoin-netværket</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Genindekserer blokke på disken…</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Bearbejder blokke på disken…</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Ingen blokkilde tilgængelig…</translation>
</message>
@@ -494,6 +327,14 @@
<translation>Opdateret</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Vis %1 hjælpebesked for at få en liste over mulige tilvalg for Bitcoin kommandolinje</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1-klient</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Indhenter…</translation>
</message>
@@ -545,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Netværksadvarsel</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -629,150 +463,6 @@
<source>Priority</source>
<translation>Prioritet</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopiér adresse</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiér mærkat</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiér beløb</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopiér transaktions-ID</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Fastlås ubrugte</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>LÃ¥s ubrugte op</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopiér mængde</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopiér gebyr</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopiér efter-gebyr</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopiér byte</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopiér prioritet</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopiér støv</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopiér byttepenge</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>højest</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>højere</translation>
- </message>
- <message>
- <source>high</source>
- <translation>højt</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>mellemhøj</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>medium</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>mellemlav</translation>
- </message>
- <message>
- <source>low</source>
- <translation>lav</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>lavere</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>lavest</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 fastlåst)</translation>
- </message>
- <message>
- <source>none</source>
- <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>
- <message>
- <source>yes</source>
- <translation>ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation>nej</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Kan variere ±1 byte pr. input.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transaktioner med højere prioritet har højere sansynlighed for at blive inkluderet i en blok.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen mærkat)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>byttepenge fra %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(byttepange)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -796,38 +486,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresse</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Ny modtagelsesadresse</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Ny afsendelsesadresse</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Redigér modtagelsesadresse</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Redigér afsendelsesadresse</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Den indtastede adresse "%1" er allerede i adressebogen.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Den indtastede adresse "%1" er ikke en gyldig Bitcoin-adresse.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Kunne ikke låse tegnebog op.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ny nøglegenerering mislykkedes.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -855,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>version</translation>
</message>
@@ -867,8 +521,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Om Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>Om %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -882,6 +536,34 @@
<source>command-line options</source>
<translation>kommandolinjetilvalg</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>Indstillinger for brugergrænseflade:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Vælg datamappe under opstart (standard: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Vælg sprog; fx "da_DK" (standard: systemsprog)</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>Opsæt SSL-rodcertifikater til betalingsadmodninger (standard: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Vis startskærm under opstart (standard: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Nulstil alle indstillinger, der er foretaget i den grafiske brugerflade</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -890,16 +572,16 @@
<translation>Velkommen</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Velkommen til Bitcoin Core.</translation>
+ <source>Welcome to %1.</source>
+ <translation>Velkommen til %1.</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>Siden dette er første gang, programmet startes, kan du vælge, hvor Bitcoin Core skal gemme sin data.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Siden dette er første gang, programmet startes, kan du vælge, hvor %1 skal gemme sin data.</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 vil downloade og gemme et kopi af Bitcoin-blokkæden. Mindst %1 GB data vil blive gemt i denne mappe, og den vil vokse over tid. Tegnebogen vil også blive gemt i denne mappe.</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 vil downloade og gemme et kopi af Bitcoin-blokkæden. Mindst %2 GB data vil blive gemt i denne mappe, og den vil vokse over tid. Tegnebogen vil også blive gemt i denne mappe.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -910,10 +592,6 @@
<translation>Brug tilpasset mappe for data:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Fejl: Angivet datamappe "%1" kan ikke oprettes.</translation>
</message>
@@ -925,7 +603,11 @@
<source>%n GB of free space available</source>
<translation><numerusform>%n GB fri plads tilgængelig</numerusform><numerusform>%n GB fri plads tilgængelig</numerusform></translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(ud af %n GB behøvet)</numerusform><numerusform>(ud af %n GB behøvet)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -944,10 +626,6 @@
<source>Select payment request file</source>
<translation>Vælg fil for betalingsanmodning</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Vælg fil for betalingsanmodning til åbning</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -960,6 +638,14 @@
<translation>&amp;Generelt</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Start %1 automatisk, når der logges ind på systemet.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Start %1 ved systemlogin</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>Størrelsen på &amp;databasens cache</translation>
</message>
@@ -985,11 +671,7 @@
</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>
+ <translation>Minimér i stedet for at lukke applikationen, når vinduet lukkes. Når denne indstilling er aktiveret, vil applikationen først blive lukket, når Afslut vælges i menuen.</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>
@@ -1016,14 +698,6 @@
<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>
@@ -1037,7 +711,7 @@
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation>Slå egenskaber for &amp;coin-styring til</translation>
+ <translation>Aktivér egenskaber for &amp;coin-styring</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>
@@ -1108,6 +782,14 @@
<translation>&amp;Vindue</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Skjul ikonet fra statusbaren.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Skjul statusikon</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Vis kun et statusikon efter minimering af vinduet.</translation>
</message>
@@ -1128,6 +810,10 @@
<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 %1.</source>
+ <translation>Sproget for brugerfladen kan vælges her. Denne indstilling vil træde i kraft efter genstart af %1.</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Enhed, som beløb vises i:</translation>
</message>
@@ -1252,97 +938,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI-håndtering</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Ugyldig betalingsadresse %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Betalingsanmodning afvist</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Netværk for betalingsanmodning stemmer ikke overens med klientens netværk.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Betalingsanmodning er ikke klargjort.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Anmodet betalingsbeløb på %1 er for lille (regnes som støv).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Fejl i betalingsanmodning</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Kan ikke starte bitcoin: click-to-pay-håndtering</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Hentnings-URL for betalingsanmodning er ugyldig: %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 kan ikke tolkes! Dette kan skyldes en ugyldig Bitcoin-adresse eller forkert udformede URL-parametre.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Filhåndtering for betalingsanmodninger</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <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>Error communicating with %1: %2</source>
- <translation>Fejl under kommunikation med %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Betalingsanmodning kan ikke tolkes!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Fejlagtigt svar fra server %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Betaling anerkendt</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Fejl i netværksforespørgsel</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1397,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Gem billede…</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopiér foto</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Gem QR-kode</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG-billede (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Klientnavn</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1442,14 +1014,14 @@
<translation>Generelt</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Anvender OpenSSL-version</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Bruger BerkeleyDB version</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Datamappe</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Opstartstidspunkt</translation>
</message>
@@ -1474,8 +1046,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>Hukommelsespulje</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Aktuelt antal transaktioner</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Hukommelsesforbrug</translation>
</message>
<message>
<source>Received</source>
@@ -1526,6 +1106,18 @@
<translation>Brugeragent</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Åbn %1s fejlsøgningslogfil fra den aktuelle datamappe. Dette kan tage nogle få sekunder for store logfiler.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Formindsk skrifttypestørrelse</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Forstør skrifttypestørrelse</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Tjenester</translation>
</message>
@@ -1594,10 +1186,6 @@
<translation>Udgående:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Byggedato</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Fejlsøgningslogfil</translation>
</message>
@@ -1634,8 +1222,8 @@
<translation>&amp;Fjern bandlysning af knude</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Velkommen til Bitcoin Cores RPC-konsol.</translation>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Velkommen til %1s 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>
@@ -1764,18 +1352,6 @@
<source>Remove</source>
<translation>Fjern</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopiér mærkat</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopiér besked</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopier beløb</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1795,73 +1371,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Gem billede…</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Anmod om betaling til %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Betalingsinformation</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Beløb</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Mærkat</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Besked</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Resulterende URI var for lang; prøv at forkorte teksten til mærkaten/beskeden.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Fejl ved kodning fra URI til QR-kode.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Mærkat</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Besked</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Beløb</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen mærkat)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(ingen besked)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(intet beløb)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1982,14 +1491,6 @@
<translation>hurtig</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <translation>Send som nul-gebyr-transaktion hvis muligt</translation>
- </message>
- <message>
- <source>(confirmation may take longer)</source>
- <translation>(bekræftelse kan tage længere)</translation>
- </message>
- <message>
<source>Send to multiple recipients at once</source>
<translation>Send til flere modtagere på en gang</translation>
</message>
@@ -2021,118 +1522,6 @@
<source>S&amp;end</source>
<translation>&amp;Afsend</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Bekræft afsendelse af bitcoins</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 til %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopiér mængde</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopier beløb</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopiér gebyr</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopiér efter-gebyr</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopiér byte</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopiér prioritet</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopiér byttepenge</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>Totalbeløb %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>eller</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Beløbet overstiger din saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Totalen overstiger din saldo, når transaktionsgebyret på %1 er inkluderet.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Oprettelse af transaktion mislykkedes!</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>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 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>
- <source>Pay only the required fee of %1</source>
- <translation>Betal kun det påkrævede gebyr på %1</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>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>
- <translation>Advarsel: Ugyldig Bitcoin-adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen mærkat)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Advarsel: Ukendt byttepengeadresse</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopiér støv</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Er du sikker på, at du vil sende?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>tilføjet som transaktionsgebyr</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2145,10 +1534,6 @@
<translation>Betal &amp;til:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Indtast en mærkat for denne adresse for at føje den til din adressebog</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Mærkat:</translation>
</message>
@@ -2220,8 +1605,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core lukker ned…</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 lukker ned…</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2314,70 +1699,10 @@
<source>Reset all verify message fields</source>
<translation>Nulstil alle "verificér besked"-felter</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Klik "Underskriv besked" for at generere underskriften</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Den indtastede adresse er ugyldig.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Tjek venligst adressen og forsøg igen.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Den indtastede adresse henviser ikke til en nøgle.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Tegnebogsoplåsning annulleret.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Den private nøgle for den indtastede adresse er ikke tilgængelig.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Underskrivning af besked mislykkedes.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Besked underskrevet.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Underskriften kunne ikke afkodes.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Tjek venligst underskriften, og forsøg igen.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Underskriften matcher ikke beskedens indhold.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Verificering af besked mislykkedes.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Besked verificeret.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Udviklerne af Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnetværk]</translation>
</message>
@@ -2390,422 +1715,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Ã…ben indtil %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>konflikt</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/ubekræftet</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 bekræftelser</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, transmitteret igennem %n knude</numerusform><numerusform>, transmitteret igennem %n knuder</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Kilde</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Genereret</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Fra</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Til</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>egen adresse</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>kigge</translation>
- </message>
- <message>
- <source>label</source>
- <translation>mærkat</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Kredit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>modner efter yderligere %n blok</numerusform><numerusform>modner efter yderligere %n blokke</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>ikke accepteret</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debet</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Total debet</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Total kredit</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Transaktionsgebyr</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Nettobeløb</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Besked</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Kommentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transaktions-ID</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Forretningsdrivende</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>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>
- <translation>Fejlsøgningsinformation</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transaktion</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Input</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Beløb</translation>
- </message>
- <message>
- <source>true</source>
- <translation>sand</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falsk</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, er ikke blevet transmitteret endnu</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Ã…bn yderligere %n blok</numerusform><numerusform>Ã…bn yderligere %n blokke</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>ukendt</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transaktionsdetaljer</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Denne rude viser en detaljeret beskrivelse af transaktionen</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Type</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Ã…bn yderligere %n blok</numerusform><numerusform>Ã…bn yderligere %n blokke</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Ã…ben indtil %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Bekræftet (%1 bekræftelser)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Denne blok blev ikke modtaget af nogen andre knuder og vil formentlig ikke blive accepteret!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Genereret, men ikke accepteret</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Mærkat</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Ubekræftet</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Bekræfter (%1 af %2 anbefalede bekræftelser)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Konflikt</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Modtaget med</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Modtaget fra</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Sendt til</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Betaling til dig selv</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minet</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>kigge</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Transaktionsstatus. Hold musen over dette felt for at vise antallet af bekræftelser.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Dato og klokkeslæt for modtagelse af transaktionen.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Transaktionstype.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Afgør hvorvidt en kigge-adresse er involveret i denne transaktion.</translation>
- </message>
- <message>
- <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>
- <translation>Beløb trukket fra eller tilføjet balance.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Alle</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>I dag</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Denne uge</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Denne måned</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Sidste måned</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Dette år</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Interval…</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Modtaget med</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Sendt til</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Til dig selv</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minet</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Andet</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Indtast adresse eller mærkat for at søge</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimumsbeløb</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopiér adresse</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiér mærkat</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiér beløb</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopiér transaktions-ID</translation>
- </message>
- <message>
- <source>Copy raw transaction</source>
- <translation>Kopiér rå transaktion</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Redigér mærkat</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Vis transaktionsdetaljer</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Historik for eksport af transaktioner</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Kigge</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Eksport mislykkedes</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>En fejl opstod under gemning af transaktionshistorik til %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Eksport problemfri</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Transaktionshistorikken blev gemt til %1 med succes.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommasepareret fil (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Bekræftet</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Type</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Mærkat</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Interval:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>til</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2813,55 +1729,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Ingen tegnebog er indlæst.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Send bitcoins</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Eksportér</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Eksportér den aktuelle visning til en fil</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Sikkerhedskopiér tegnebog</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Tegnebogsdata (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Sikkerhedskopiering mislykkedes</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Der skete en fejl under gemning af tegnebogsdata til %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Tegnebogsdata blev gemt til %1 med succes.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Sikkerhedskopiering problemfri</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2888,14 +1755,6 @@
<translation>Hvis &lt;category&gt; ikke angives eller hvis &lt;category&gt; = 1, udskriv al fejlretningsinformation.</translation>
</message>
<message>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
- <translation>Maksimalt totalgebyr (i %s) for brug i en enkelt tegnebogstransaktion; ved at sætte dette for lavt, kan store transaktioner afbrydes (standard: %s)</translation>
- </message>
- <message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
- <translation>Kontrollér venligst, at din computers dato og tid er korrekt! Hvis uret ikke passer, vil Bitcoin Core ikke fungere korrekt.</translation>
- </message>
- <message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation>Beskæring er sat under minimumsgrænsen på %d MiB. Brug venligst et større tal.</translation>
</message>
@@ -2936,10 +1795,34 @@
<translation>Acceptér forbindelser udefra (standard: 1 hvis hverken -proxy eller -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>The %s developers</source>
+ <translation>Udviklerne af %s</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee er sat meget højt! Dette er transaktionsgebyret, du eventuelt betaler, hvis gebyrestimater ikke er tilgængelige.</translation>
+ </message>
+ <message>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>En gebyrsats (i %s/kB), som vil blive brugt, hvis gebyrestimering har utilstrækkelig data (standard: %s)</translation>
+ </message>
+ <message>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Acceptér videresendte transaktioner, der modtages fra hvidlistede knuder, selv når transaktioner ikke videresendes (standard: %d)</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>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>Kan ikke opnå en lås på datamappe %s. %s kører sansynligvis allerede.</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>
@@ -2948,10 +1831,38 @@
<translation>Distribueret under MIT-softwarelicensen; se den vedlagte fil COPYING eller &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
+ <source>Error loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>Fejl under indlæsning af %s: Du kan ikke aktivere HD på en allerede eksisterende ikke-HD-tegnebog</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>Fejl under læsning af %s! Alle nøgler blev læst korrekt, men transaktionsdata eller indgange i adressebogen kan mangle eller være ukorrekte.</translation>
+ </message>
+ <message>
<source>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>
<message>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Gennemtving videresendelse af transaktioner fra hvidlistede knuder, selv om de overtræder lokal videresendelsespolitik (standard: %d)</translation>
+ </message>
+ <message>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>Justering af maksimalt tilladt gennemsnitlig afvigelse fra peer-tid. Den lokale opfattelse af tid kan blive påvirket frem eller tilbage af peers med denne mængde tid. (standard: %u sekunder)</translation>
+ </message>
+ <message>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Maksimalt totalgebyr (i %s) der må bruges i en enkelt tegnebogstransaktion eller rå transaktion; en for lav en værdi kan afbryde store transaktioner (standard: %s)</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>Undersøg venligst at din computers dato og klokkeslet er korrekt indstillet! Hvis der er fejl i disse, vil %s ikke fungere korrekt.</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>Overvej venligst at bidrage til udviklingen, hvis du finder %s brugbar. Besøg %s for yderligere information om softwaren.</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>
@@ -2964,22 +1875,14 @@
<translation>Dette er en foreløbig testudgivelse - brug på eget ansvar - brug ikke til udvinding eller handelsprogrammer</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Ikke i stand til at tildele til %s på denne computer. Bitcoin Core kører sansynligvis allerede.</translation>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
+ <translation>Kan ikke spole databasen tilbage til en tilstand inden en splitning. Du er nødt til at downloade blokkæden igen</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>Brug UPnP for at konfigurere den lyttende port (standard: 1 under lytning og ingen -proxy)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ADVARSEL: unormalt mange blokke er genereret; %d blokke er modtaget i løbet af de seneste %d timer (%d forventet)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ADVARSEL: tjek din netværksforbindelse; %d blokke er modtaget i løbet af de seneste %d timer (%d forventet)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Advarsel: Netværket ser ikke ud til at være fuldt ud enige! Enkelte minere ser ud til at opleve problemer.</translation>
</message>
@@ -2988,14 +1891,18 @@
<translation>Advarsel: Vi ser ikke ud til at være fuldt ud enige med andre knuder! Du kan være nødt til at opgradere, eller andre knuder kan være nødt til at opgradere.</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>Advarsel: wallet.dat ødelagt, data reddet! Oprindelig wallet.dat gemt som wallet.{timestamp}.bak i %s; hvis din saldo eller dine transaktioner er forkert, bør du genskabe fra en sikkerhedskopi.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Sæt andre knuder, der forbinder fra den angivne netmaske eller IP, på hvidliste. Kan angives flere gange.</translation>
</message>
<message>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>Du er nødt til at genopbygge databasen ved hjælp af -reindex-chainstate for at ændre -txindex</translation>
+ </message>
+ <message>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s ødelagt, redning af data mislykkedes</translation>
+ </message>
+ <message>
<source>-maxmempool must be at least %d MB</source>
<translation>-maxmempool skal være mindst %d MB</translation>
</message>
@@ -3004,10 +1911,26 @@
<translation>&lt;kategori&gt; kan være:</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>Føj kommentar til brugeragentstrengen</translation>
+ </message>
+ <message>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Forsøg at genskabe private nøgler fra en ødelagt tegnebog under opstart</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Blokoprettelsestilvalg:</translation>
</message>
<message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>Kan ikke finde -%s-adressen: "%s"</translation>
+ </message>
+ <message>
+ <source>Change index out of range</source>
+ <translation>Ændr indeks uden for interval</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>Tilslut kun til de(n) angivne knude(r)</translation>
</message>
@@ -3016,6 +1939,10 @@
<translation>Tilvalg for forbindelser:</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Ophavsret © %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>Ødelagt blokdatabase opdaget</translation>
</message>
@@ -3048,6 +1975,10 @@
<translation>Aktivér offentliggørelse af rå transaktion i &lt;address&gt;</translation>
</message>
<message>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>Aktivér transaktionserstatning i hukommelsespuljen (standard: %u)</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Klargøring af blokdatabase mislykkedes</translation>
</message>
@@ -3056,6 +1987,22 @@
<translation>Klargøring af tegnebogsdatabasemiljøet %s mislykkedes!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>Fejl under indlæsning af %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Fejl under indlæsning af %s: Tegnebog ødelagt</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Fejl under indlæsning af %s: Tegnebog kræver nyere version af %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: You can't disable HD on a already existing HD wallet</source>
+ <translation>Fejl under indlæsning af %s: Du kan ikke deaktivere HD på en allerede eksisterende HD-tegnebog</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>Indlæsning af blokdatabase mislykkedes</translation>
</message>
@@ -3080,14 +2027,38 @@
<translation>Ukorrekt eller ingen tilblivelsesblok fundet. Forkert datamappe for netværk?</translation>
</message>
<message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>Klargøring af sundhedstjek mislykkedes. %s lukker ned.</translation>
+ </message>
+ <message>
<source>Invalid -onion address: '%s'</source>
<translation>Ugyldig -onion adresse: "%s"</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Ugyldigt beløb for -%s=&lt;beløb&gt;: "%s"</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Ugyldigt beløb for -fallbackfee=&lt;beløb&gt;: "%s"</translation>
+ </message>
+ <message>
<source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
<translation>Hold hukommelsespuljen med transaktioner under &lt;n&gt; megabyte (standard: %u)</translation>
</message>
<message>
+ <source>Loading banlist...</source>
+ <translation>Indlæser bandlysningsliste…</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Placering for autentificerings-cookie (standard: datamappe)</translation>
+ </message>
+ <message>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Minimum bytes pr. sigop i transaktioner, vi videresender og miner (standard: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>For få tilgængelige fildeskriptorer.</translation>
</message>
@@ -3096,6 +2067,14 @@
<translation>Tilslut kun til knuder i netværk &lt;net&gt; (IPv4, IPv6 eller Onion)</translation>
</message>
<message>
+ <source>Print this help message and exit</source>
+ <translation>Udskriv denne hjælpetekst og afslut</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>Udskriv version og afslut</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>Beskæring kan ikke opsættes med en negativ værdi.</translation>
</message>
@@ -3104,10 +2083,26 @@
<translation>Beskæringstilstand er ikke kompatibel med -txindex.</translation>
</message>
<message>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>Genopbyg kædetilstand og blokindeks fra blk*.dat-filerne på disken</translation>
+ </message>
+ <message>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>Genopbyg kædetilstand ud fra de aktuelt indekserede blokke</translation>
+ </message>
+ <message>
+ <source>Rewinding blocks...</source>
+ <translation>Spoler blokke tilbage…</translation>
+ </message>
+ <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Sæt cache-størrelse for database i megabytes (%d til %d; standard: %d)</translation>
</message>
<message>
+ <source>Set maximum block cost (default: %d)</source>
+ <translation>Sæt maksimal blokudgift (standard: %d)</translation>
+ </message>
+ <message>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>Sæt maksimum blokstørrelse i byte (standard: %d)</translation>
</message>
@@ -3116,6 +2111,14 @@
<translation>Angiv tegnebogsfil (inden for datamappe)</translation>
</message>
<message>
+ <source>The source code is available from %s.</source>
+ <translation>Kildekoden er tilgængelig fra %s.</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>Ikke i stand til at tildele til %s på denne computer. %s kører formodentlig allerede.</translation>
+ </message>
+ <message>
<source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Argument -benchmark understøttes ikke og ignoreres; brug -debug=bench.</translation>
</message>
@@ -3148,16 +2151,16 @@
<translation>Tegnebog %s findes uden for datamappe %s</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>Tilvalg for tegnebog:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Tilvalg for fejlfinding/test af 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>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>Det var nødvendigt at genskrive tegnebogen: Genstart %s for at gennemføre</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>
+ <source>Wallet options:</source>
+ <translation>Tilvalg for tegnebog:</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>
@@ -3172,10 +2175,6 @@
<translation>Tildel til den givne adresse for at lytte efter JSON-RPC-forbindelser. Brug [vært]:port-notation for IPv6. Denne valgmulighed kan angives flere gange (standard: tildel til alle grænseflader)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Kan ikke opnå en lås på datamappe %s. Bitcoin Core kører sansynligvis allerede.</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>
@@ -3213,17 +2212,13 @@
</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>
+ <translation>Brug tilfældige akkreditiver for hver proxy-forbindelse. Dette aktiverer strømisolation med Tor (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>
<message>
- <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
- <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>
@@ -3232,8 +2227,12 @@
<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>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation>Brug hierarkisk deterministisk nøglegenerering (HD) efter BIP32. Har kun effekt ved generering af ny tegnebog og under første opstart</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>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>
+ <translation>Andre knuder på hvidliste kan ikke DoS-bandlyses, og deres transaktioner videresendes altid, selv hvis de allerede er i hukommelsespuljen. 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>
@@ -3248,38 +2247,14 @@
<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>Always relay transactions received from whitelisted peers (default: %d)</source>
- <translation>Videresend altid transaktioner, der modtages fra hvidlistede knuder (standard: %d)</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>Forsøg at genskabe private nøgler fra en ødelagt wallet.dat under opstart</translation>
- </message>
- <message>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation>Opret automatisk skjult Tor-tjeneste (standard: %d)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Kan ikke løse -whitebind adresse: "%s"</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Forbind gennem SOCKS5-proxy</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Ophavsret © 2009-%i Udviklerne af Bitcoin Core</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>
@@ -3292,22 +2267,6 @@
<translation>Information</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ugyldigt beløb til -mintxfee=&lt;beløb&gt;: "%s"</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Ugyldigt beløb for -paytxfee=&lt;beløb&gt;: "%s" (skal være mindst %s)</translation>
</message>
@@ -3332,14 +2291,6 @@
<translation>Tilvalg for RPC-server:</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>Receive and display P2P network alerts (default: %u)</source>
- <translation>Modtag og vis P2P-netværksadvarsler (standard: %u)</translation>
- </message>
- <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation>Reducerer -maxconnections fra %d til %d på grund af systembegrænsninger.</translation>
</message>
@@ -3381,7 +2332,7 @@
</message>
<message>
<source>Tor control port to use if onion listening enabled (default: %s)</source>
- <translation>Tor kontrolport, der skal bruges, hvis onion-lytning er slået til (standard: %s)</translation>
+ <translation>Tor kontrolport, der skal bruges, hvis onion-lytning er aktiveret (standard: %s)</translation>
</message>
<message>
<source>Transaction amount too small</source>
@@ -3412,14 +2363,14 @@
<translation>Brugernavn til JSON-RPC-forbindelser</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Det var nødvendigt at genskrive tegnebogen: genstart Bitcoin Core for at gennemføre</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Advarsel</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Advarsel: Ukendte nye regler aktiveret (versionsbit %i)</translation>
+ </message>
+ <message>
<source>Whether to operate in a blocks only mode (default: %u)</source>
<translation>Hvorvidt der skal arbejdes i kun-blokke-tilstand (standard: %u)</translation>
</message>
@@ -3432,10 +2383,6 @@
<translation>ZeroMQ-notifikationsindstillinger:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat ødelagt, redning af data mislykkedes</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Adgangskode til JSON-RPC-forbindelser</translation>
</message>
@@ -3444,10 +2391,6 @@
<translation>Udfør kommando, når den bedste blok ændres (%s i kommandoen erstattes med blokhash)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Denne hjælpebesked</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Tillad DNS-opslag for -addnode, -seednode og -connect</translation>
</message>
@@ -3456,10 +2399,6 @@
<translation>Indlæser adresser…</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Fejl ved indlæsning af wallet.dat: Tegnebog ødelagt</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 = behold metadata for transaktion, fx kontoindehaver og information om betalingsanmodning, 2 = drop metadata for transaktion)</translation>
</message>
@@ -3476,8 +2415,8 @@
<translation>Behold ikke transaktioner i hukommelsespuljen i mere end &lt;n&gt; timer (default: %u)</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Fejl under læsning af wallet.dat! Alle nøgler blev læst korrekt, men transaktionsdata eller indgange i adressebogen kan mangle eller være ukorrekte.</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Gebyrer (i %s/kB) mindre end dette opfattes som intet gebyr under oprettelse af transaktioner (standard: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3496,6 +2435,10 @@
<translation>Udskriv fejlsøgningsinformation (standard: %u, angivelse af &lt;kategori&gt; er valgfri)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Understøt filtrering af blokke og transaktioner med Bloom-filtre (standard: %u)</translation>
+ </message>
+ <message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<translation>Den totale længde på netværksversionsstrengen (%i) overstiger maksimallængden (%i). Reducér antaller af eller størrelsen på uacomments.</translation>
</message>
@@ -3508,24 +2451,32 @@
<translation>Argument -socks understøttes ikke. Det er ikke længere muligt at sætte SOCKS-version; kun SOCKS5-proxier understøttes.</translation>
</message>
<message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Argument -whitelistalwaysrelay understøttes ikke og ignoreres; brug -whitelistrelay og/eller -whitelistforcerelay.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Brug separat SOCS5-proxy for at nå knuder via skjulte Tor-tjenester (standard: %s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(standard: %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Brugernavn og hashet adgangskode for JSON-RPC-forbindelser. Feltet &lt;userpw&gt; er i formatet: &lt;BRUGERNAVN&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Et kanonisk Python-skript inkluderes i share/rpcuser. Dette tilvalg kan angives flere gange</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Forespørg altid adresser på andre knuder via DNS-opslag (default: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Advarsel: Ukendte blokversioner bliver minet! Det er muligt, at ukendte regler er i brug</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Fejl ved indlæsning af wallet.dat</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Advarsel: Tegnebogsfil ødelagt, data reddet! Oprindelig %s gemt som %s i %s; hvis din saldo eller dine transaktioner er forkert, bør du genskabe fra en sikkerhedskopi.</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Generér bitcoins (standard: %u)</translation>
+ <source>(default: %s)</source>
+ <translation>(standard: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Forespørg altid adresser på andre knuder via DNS-opslag (default: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3613,18 +2564,6 @@
<translation>Ukendt netværk anført i -onlynet: "%s"</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Kan ikke finde -bind adressen: "%s"</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Kan ikke finde -externalip adressen: "%s"</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ugyldigt beløb for -paytxfee=&lt;beløb&gt;: "%s"</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Manglende dækning</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts
index 04b4d23010..2708324d17 100644
--- a/src/qt/locale/bitcoin_de.ts
+++ b/src/qt/locale/bitcoin_de.ts
@@ -26,10 +26,6 @@
<translation>&amp;Schließen</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>Adresse &amp;kopieren</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Ausgewählte Adresse aus der Liste entfernen</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Löschen</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Wählen Sie die Adresse aus, an die Sie Bitcoins überweisen möchten</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Wählen Sie die Adresse aus, über die Sie Bitcoins empfangen wollen</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Auswählen</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Zahlungsadressen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Empfangsadressen</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Dies sind Ihre Bitcoin-Adressen zum Tätigen von Überweisungen. Bitte prüfen Sie den Betrag und die Empfangsadresse, bevor Sie Bitcoins überweisen.</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>Dies sind Ihre Bitcoin-Adressen zum Empfangen von Zahlungen. Es wird empfohlen für jede Transaktion eine neue Empfangsadresse zu verwenden.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>&amp;Bezeichnung kopieren</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editieren</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Addressliste exportieren</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommagetrennte-Datei (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportieren fehlgeschlagen</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Beim Speichern der Adressliste nach %1 ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Bezeichnung</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(keine Bezeichnung)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Neue Passphrase bestätigen</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Wallet verschlüsseln</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Dieser Vorgang benötigt Ihre Passphrase, um die Wallet zu entsperren.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Wallet entsperren</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Dieser Vorgang benötigt Ihre Passphrase, um die Wallet zu entschlüsseln.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Wallet entschlüsseln</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Passphrase ändern</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Wallet-Verschlüsselung bestätigen</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation>Warnung: Wenn Sie Ihre Wallet verschlüsseln und Ihre Passphrase verlieren, werden Sie &lt;b&gt;alle Ihre Bitcoins verlieren&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Warnung: Die Feststelltaste ist aktiviert!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Wallet verschlüsselt</translation>
- </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>Geben Sie die neue Passphrase für die Wallet ein.&lt;br&gt;Bitte benutzen Sie eine Passphrase bestehend aus &lt;b&gt;zehn oder mehr zufälligen Zeichen&lt;/b&gt; oder &lt;b&gt;acht oder mehr Wörtern&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Geben Sie die alte und neue Wallet-Passphrase ein.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Wallet-Verschlüsselung fehlgeschlagen</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Die Wallet-Verschlüsselung ist aufgrund eines internen Fehlers fehlgeschlagen. Ihre Wallet wurde nicht verschlüsselt.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Die eingegebenen Passphrasen stimmen nicht überein.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Wallet-Entsperrung fehlgeschlagen</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Die eingegebene Passphrase zur Wallet-Entschlüsselung war nicht korrekt.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Wallet-Entschlüsselung fehlgeschlagen</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Die Wallet-Passphrase wurde erfolgreich geändert.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -270,6 +111,14 @@
<translation>Anwendung beenden</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Ãœber %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Informationen über %1 anzeigen</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Ãœber &amp;Qt</translation>
</message>
@@ -282,6 +131,10 @@
<translation>&amp;Konfiguration...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Konfiguration von %1 bearbeiten</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>Wallet &amp;verschlüsseln...</translation>
</message>
@@ -306,14 +159,6 @@
<translation>&amp;URI öffnen...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>"Bitcoin Core"-Client</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importiere Blöcke von Datenträger...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindiziere Blöcke auf Datenträger...</translation>
</message>
@@ -358,10 +203,6 @@
<translation>&amp;Empfangen</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Informationen über Bitcoin Core anzeigen</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Anzeigen / Verstecken</translation>
</message>
@@ -398,22 +239,10 @@
<translation>Registerkartenleiste</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Zahlungen anfordern (erzeugt QR-Codes und "bitcoin:"-URIs)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
@@ -429,15 +258,19 @@
<source>&amp;Command-line options</source>
<translation>&amp;Kommandozeilenoptionen</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Zeige den "Bitcoin Core"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n aktive Verbindung zum Bitcoin-Netzwerk</numerusform><numerusform>%n aktive Verbindungen zum Bitcoin-Netzwerk</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Reindiziere Blöcke auf Datenträger...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Verarbeite Blöcke auf Datenträger...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Keine Blockquelle verfügbar...</translation>
</message>
@@ -494,6 +327,14 @@
<translation>Auf aktuellem Stand</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Zeige den "%1"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 Client</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Hole auf...</translation>
</message>
@@ -545,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Netzwerkalarm</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -629,150 +463,6 @@
<source>Priority</source>
<translation>Priorität</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Adresse kopieren</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Bezeichnung kopieren</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Betrag kopieren</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Transaktions-ID kopieren</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Nicht ausgegebenen Betrag sperren</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Nicht ausgegebenen Betrag entsperren</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Anzahl kopieren</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Gebühr kopieren</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Abzüglich Gebühr kopieren</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Byte kopieren</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Priorität kopieren</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>"Dust" kopieren</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Wechselgeld kopieren</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>am höchsten</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>höher</translation>
- </message>
- <message>
- <source>high</source>
- <translation>hoch</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>mittel-hoch</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>mittel</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>niedrig-mittel</translation>
- </message>
- <message>
- <source>low</source>
- <translation>niedrig</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>niedriger</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>am niedrigsten</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 gesperrt)</translation>
- </message>
- <message>
- <source>none</source>
- <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>
- <message>
- <source>yes</source>
- <translation>ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation>nein</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Kann um +/- 1 Byte pro Eingabe variieren.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transaktionen mit höherer Priorität haben eine größere Chance in einen Block aufgenommen zu werden.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(keine Bezeichnung)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>Wechselgeld von %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(Wechselgeld)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -796,38 +486,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresse</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Neue Empfangsadresse</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Neue Zahlungsadresse</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Empfangsadresse bearbeiten</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Zahlungsadresse bearbeiten</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Die eingegebene Adresse "%1" befindet sich bereits im Adressbuch.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Die eingegebene Adresse "%1" ist keine gültige Bitcoin-Adresse.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Wallet konnte nicht entsperrt werden.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Erzeugung eines neuen Schlüssels fehlgeschlagen.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -855,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>Version</translation>
</message>
@@ -867,8 +521,8 @@
<translation>(%1-Bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Ãœber Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>Ãœber %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -882,6 +536,34 @@
<source>command-line options</source>
<translation>Kommandozeilenoptionen</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>UI Einstellungen:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Datenverzeichnis beim Starten auswählen (Standard: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Sprache einstellen, zum Beispiel "de_DE" (default: system locale)</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: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Startbildschirm beim Starten anzeigen (Standard: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Setze alle Einstellungen zurück, die über die grafische Oberfläche geändert wurden.</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -890,16 +572,16 @@
<translation>Willkommen</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Willkommen zu Bitcoin Core.</translation>
+ <source>Welcome to %1.</source>
+ <translation>Willkommen zu %1.</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>Da Sie das Programm gerade zum ersten Mal starten, können Sie nun auswählen wo Bitcoin Core seine Daten ablegen soll.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Da Sie das Programm gerade zum ersten Mal starten, können Sie nun auswählen wo %1 seine Daten ablegen wird.</translation>
</message>
<message>
- <source>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 wird eine Kopie der Blockkette herunterladen und speichern. Mindestens %1GB Daten werden in diesem Verzeichnis abgelegt und die Datenmenge wächst über die Zeit an. Auch die Wallet wird in diesem Verzeichnis abgelegt.</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 wird eine Kopie der Blockkette herunterladen und speichern. Mindestens %2GB Daten werden in diesem Verzeichnis abgelegt und die Datenmenge wächst über die Zeit an. Auch die Wallet wird in diesem Verzeichnis abgelegt.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -910,10 +592,6 @@
<translation>Ein benutzerdefiniertes Datenverzeichnis verwenden:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Fehler: Angegebenes Datenverzeichnis "%1" kann nicht angelegt werden.</translation>
</message>
@@ -948,10 +626,6 @@
<source>Select payment request file</source>
<translation>Zahlungsanforderungsdatei auswählen</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Zu öffnende Zahlungsanforderungsdatei auswählen</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -964,6 +638,14 @@
<translation>&amp;Allgemein</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>%1 nach der Anmeldung am System automatisch ausführen.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Starte %1 nach Systemanmeldung</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>Größe des &amp;Datenbankcaches</translation>
</message>
@@ -992,10 +674,6 @@
<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>
@@ -1020,14 +698,6 @@
<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>
@@ -1080,6 +750,14 @@
<translation>Port des Proxies (z.B. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Benutzt um Gegenstellen zu erreichen über:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Zeigt an, ob der eingegebene Standard SOCKS5 Proxy genutzt wird um Peers mit dem Netzwerktyp zu erreichen.</translation>
+ </message>
+ <message>
<source>IPv4</source>
<translation>IPv4</translation>
</message>
@@ -1092,6 +770,10 @@
<translation>Tor</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Über einen separaten SOCKS5 Proxy für Tor Services mit dem Bitcoint Netzwerk verbinden.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
<translation>Separaten SOCKS5-Proxy verwenden, um Gegenstellen über versteckte Tor-Dienste zu erreichen:</translation>
</message>
@@ -1100,6 +782,14 @@
<translation>&amp;Programmfenster</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Das Icon im System Tray verstecken.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Tray Icon verstecken</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Nur ein Symbol im Infobereich anzeigen, nachdem das Programmfenster minimiert wurde.</translation>
</message>
@@ -1244,97 +934,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI-Verarbeitung</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Ungültige Zahlungsadresse %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Zahlungsanforderung abgelehnt</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Netzwerk der Zahlungsanforderung stimmt nicht mit dem Client-Netzwerk überein.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Zahlungsanforderung ist nicht initialisiert.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Angeforderter Zahlungsbetrag in Höhe von %1 ist zu niedrig und wurde als "Dust" eingestuft.</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>fehlerhafte Zahlungsanforderung</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>"bitcoin: Klicken-zum-Bezahlen"-Handler konnte nicht gestartet werden</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Abruf-URL der Zahlungsanforderung ist ungültig: %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 kann nicht analysiert werden! Dies kann durch eine ungültige Bitcoin-Adresse oder fehlerhafte URI-Parameter verursacht werden.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Zahlungsanforderungsdatei-Verarbeitung</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <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>Error communicating with %1: %2</source>
- <translation>Kommunikationsfehler mit %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Zahlungsanforderung kann nicht verarbeitet werden!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Fehlerhafte Antwort vom Server: %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Zahlung bestätigt</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>fehlerhafte Netzwerkanfrage</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1389,31 +988,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>Grafik &amp;speichern...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>Grafik &amp;kopieren</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>QR-Code speichern</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG-Grafik (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Clientname</translation>
- </message>
- <message>
<source>N/A</source>
<translation>k.A.</translation>
</message>
@@ -1434,14 +1010,14 @@
<translation>Allgemein</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Verwendete OpenSSL-Version</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Verwendete BerkeleyDB-Version</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Datenverzeichnis</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Startzeit</translation>
</message>
@@ -1466,8 +1042,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>Speicherpool</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Aktuelle Anzahl der Transaktionen</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Speichernutzung</translation>
</message>
<message>
<source>Received</source>
@@ -1490,6 +1074,10 @@
<translation>Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Zugelassene</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Richtung</translation>
</message>
@@ -1498,6 +1086,10 @@
<translation>Version</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Start Block</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation>Synchronisierte Kopfdaten</translation>
</message>
@@ -1510,6 +1102,18 @@
<translation>User-Agent</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Öffnet die %1-Debugprotokolldatei aus dem aktuellen Datenverzeichnis. Dies kann bei großen Protokolldateien einige Sekunden dauern.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Schrift verkleinern</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Schrift vergrößern</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Dienste</translation>
</message>
@@ -1534,6 +1138,14 @@
<translation>Pingzeit</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>Die Laufzeit eines aktuell ausstehenden Ping.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Ping Wartezeit</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Zeitversatz</translation>
</message>
@@ -1570,10 +1182,6 @@
<translation>ausgehend:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Erstellungsdatum</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Debugprotokolldatei</translation>
</message>
@@ -1586,6 +1194,10 @@
<translation>Knoten &amp;trennen</translation>
</message>
<message>
+ <source>Ban Node for</source>
+ <translation>Knoten gebannt für</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation>1 &amp;Stunde</translation>
</message>
@@ -1602,8 +1214,12 @@
<translation>1 &amp;Jahr</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Willkommen in der "Bitcoin Core"-RPC-Konsole.</translation>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Node entsperren</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Willkommen in der %1 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>
@@ -1732,18 +1348,6 @@
<source>Remove</source>
<translation>Entfernen</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Bezeichnung kopieren</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Nachricht kopieren</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Betrag kopieren</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1763,73 +1367,6 @@
<source>&amp;Save Image...</source>
<translation>Grafik &amp;speichern...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Zahlung anfordern an %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Zahlungsinformationen</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Betrag</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Bezeichnung</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Nachricht</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Resultierende URI ist zu lang, bitte den Text für Bezeichnung/Nachricht kürzen.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Beim Enkodieren der URI in den QR-Code ist ein Fehler aufgetreten.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Bezeichnung</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Nachricht</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Betrag</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(keine Bezeichnung)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(keine Nachricht)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(kein Betrag)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1950,14 +1487,6 @@
<translation>schnell</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <translation>Wenn möglich als gebührenfreie Transaktion senden</translation>
- </message>
- <message>
- <source>(confirmation may take longer)</source>
- <translation>(Bestätigung kann länger dauern)</translation>
- </message>
- <message>
<source>Send to multiple recipients at once</source>
<translation>An mehrere Empfänger auf einmal überweisen</translation>
</message>
@@ -1989,118 +1518,6 @@
<source>S&amp;end</source>
<translation>&amp;Ãœberweisen</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Überweisung bestätigen</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 an %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Anzahl kopieren</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Betrag kopieren</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Gebühr kopieren</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Abzüglich Gebühr kopieren</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Byte kopieren</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Priorität kopieren</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Wechselgeld kopieren</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>Gesamtbetrag %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>oder</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Der angegebene Betrag übersteigt Ihren Kontostand.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Der angegebene Betrag übersteigt aufgrund der Transaktionsgebühr in Höhe von %1 Ihren Kontostand.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Transaktionserstellung fehlgeschlagen!</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>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 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>
- <source>Pay only the required fee of %1</source>
- <translation>Nur die notwendige Gebühr in Höhe von %1 zahlen</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>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>
- <translation>Warnung: Ungültige Bitcoin-Adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(keine Bezeichnung)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Warnung: Unbekannte Wechselgeld-Adresse</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>"Dust" kopieren</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Wollen Sie die Überweisung ausführen?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>als Transaktionsgebühr hinzugefügt</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2113,10 +1530,6 @@
<translation>E&amp;mpfänger:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Adressbezeichnung eingeben (diese wird zusammen mit der Adresse dem Adressbuch hinzugefügt)</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Bezeichnung:</translation>
</message>
@@ -2188,8 +1601,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core wird beendet...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 wird beendet...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2282,70 +1695,10 @@
<source>Reset all verify message fields</source>
<translation>Alle "Nachricht verifizieren"-Felder zurücksetzen</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Auf "Nachricht signieren" klicken, um die Signatur zu erzeugen</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Die eingegebene Adresse ist ungültig.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Bitte überprüfen Sie die Adresse und versuchen Sie es erneut.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Die eingegebene Adresse verweist nicht auf einen Schlüssel.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Wallet-Entsperrung wurde abgebrochen.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Privater Schlüssel zur eingegebenen Adresse ist nicht verfügbar.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Signierung der Nachricht fehlgeschlagen.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Nachricht signiert.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Die Signatur konnte nicht dekodiert werden.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Bitte überprüfen Sie die Signatur und versuchen Sie es erneut.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Die Signatur entspricht nicht dem "Message Digest".</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Verifikation der Nachricht fehlgeschlagen.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Nachricht verifiziert.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Die "Bitcoin Core"-Entwickler</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[Testnetz]</translation>
</message>
@@ -2358,418 +1711,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Offen bis %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>in Konflikt stehend</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/unbestätigt</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 Bestätigungen</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, über %n Knoten übertragen</numerusform><numerusform>, über %n Knoten übertragen</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Quelle</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Erzeugt</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Von</translation>
- </message>
- <message>
- <source>To</source>
- <translation>An</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>eigene Adresse</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>beobachtet</translation>
- </message>
- <message>
- <source>label</source>
- <translation>Bezeichnung</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Gutschrift</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>reift noch %n weiteren Block</numerusform><numerusform>reift noch %n weitere Blöcke</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>nicht angenommen</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Belastung</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Gesamtbelastung</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Gesamtgutschrift</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Transaktionsgebühr</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Nettobetrag</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Nachricht</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Kommentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transaktions-ID</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Händler</translation>
- </message>
- <message>
- <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation>Erzeugte Bitcoins müssen %1 Blöcke lang reifen, bevor sie ausgegeben werden können. Als Sie diesen Block erzeugten, wurde er an das Netzwerk übertragen, um ihn der Blockkette hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und Sie werden keine Bitcoins gutgeschrieben bekommen. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block fast zeitgleich erzeugt.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Debuginformationen</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transaktion</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Eingaben</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Betrag</translation>
- </message>
- <message>
- <source>true</source>
- <translation>wahr</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falsch</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, wurde noch nicht erfolgreich übertragen</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Offen für %n weiteren Block</numerusform><numerusform>Offen für %n weitere Blöcke</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>unbekannt</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transaktionsdetails</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Dieser Bereich zeigt eine detaillierte Beschreibung der Transaktion an</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Offen für %n weiteren Block</numerusform><numerusform>Offen für %n weitere Blöcke</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Offen bis %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Bestätigt (%1 Bestätigungen)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Dieser Block wurde von keinem anderen Knoten empfangen und wird wahrscheinlich nicht angenommen werden!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Erzeugt, jedoch nicht angenommen</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Bezeichnung</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Unbestätigt</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Wird bestätigt (%1 von %2 empfohlenen Bestätigungen)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>in Konflikt stehend</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Empfangen über</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Empfangen von</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Ãœberwiesen an</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Eigenüberweisung</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Erarbeitet</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>beobachtet</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(k.A.)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Transaktionsstatus, fahren Sie mit der Maus über dieses Feld, um die Anzahl der Bestätigungen zu sehen.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Datum und Uhrzeit zu der die Transaktion empfangen wurde.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Art der Transaktion</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Zeigt an, ob eine beobachtete Adresse in diese Transaktion involviert ist.</translation>
- </message>
- <message>
- <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>
- <translation>Der Betrag, der dem Kontostand abgezogen oder hinzugefügt wurde.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Alle</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Heute</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Diese Woche</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Diesen Monat</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Letzten Monat</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Dieses Jahr</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Zeitraum</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Empfangen über</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Ãœberwiesen an</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Eigenüberweisung</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Erarbeitet</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Andere</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Zu suchende Adresse oder Bezeichnung eingeben</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimaler Betrag</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Adresse kopieren</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Bezeichnung kopieren</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Betrag kopieren</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Transaktions-ID kopieren</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Bezeichnung bearbeiten</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Transaktionsdetails anzeigen</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Transaktionsverlauf exportieren</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Beobachtet</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportieren fehlgeschlagen</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Beim Speichern des Transaktionsverlaufs nach %1 ist ein Fehler aufgetreten.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exportieren erfolgreich</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Speichern des Transaktionsverlaufs nach %1 war erfolgreich.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommagetrennte-Datei (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Bestätigt</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Bezeichnung</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Zeitraum:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>bis</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2777,55 +1725,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Es wurde keine Wallet geladen.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Bitcoins überweisen</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>E&amp;xportieren</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Daten der aktuellen Ansicht in eine Datei exportieren</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Wallet sichern</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Wallet-Daten (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Sicherung fehlgeschlagen</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Beim Speichern der Wallet-Daten nach %1 ist ein Fehler aufgetreten.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Speichern der Wallet-Daten nach %1 war erfolgreich.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Sicherung erfolgreich</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2848,10 +1747,26 @@
<translation>Kommandozeilen- und JSON-RPC-Befehle annehmen</translation>
</message>
<message>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Wenn &lt;category&gt; nicht angegeben wird oder &lt;category&gt;=1, jegliche Debugginginformationen ausgeben.</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. 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>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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 ist nicht mit -txindex und -rescan 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>Error: A fatal internal error occurred, see debug.log for details</source>
<translation>Fehler: Ein schwerer interner Fehler ist aufgetreten, siehe debug.log für Details.</translation>
</message>
<message>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Gebühr (in %s/kB), die von Ihnen gesendeten Transaktionen hinzugefügt wird (Standard: %s)</translation>
+ </message>
+ <message>
<source>Pruning blockstore...</source>
<translation>Kürze Blockspeicher...</translation>
</message>
@@ -2860,14 +1775,34 @@
<translation>Als Hintergrunddienst ausführen und Befehle annehmen</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Kann HTTP Server nicht starten. Siehe debug log für Details.</translation>
+ </message>
+ <message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Eingehende Verbindungen annehmen (Standard: 1, wenn nicht -proxy oder -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee ist sehr hoch eingestellt! Das ist die Transaktionsgebühr, welche du zahlen müsstest, wenn die Gebührenschätzungen nicht verfügbar sind.</translation>
+ </message>
+ <message>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>Eine Transaktionsgebühr (in %s/kB) wird genutzt, wenn für die Gebührenschützung zu wenig Daten vorliegen (Standardwert: %s)</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>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>Datenverzeichnis %s kann nicht gesperrt werden. Evtl. wurde %s bereits gestartet.</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>
@@ -2880,24 +1815,32 @@
<translation>Befehl ausführen wenn sich eine Wallet-Transaktion verändert (%s im Befehl wird durch die Transaktions-ID ersetzt)</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>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Leite Transaktionen von Peers auf der Positivliste auf jeden Fall weiter, auch wenn sie die lokale Weiterleitungsregeln verletzen (Standardeinstellung: %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>Dies ist eine Vorab-Testversion - Verwendung auf eigene Gefahr - nicht für Mining- oder Handelsanwendungen nutzen!</translation>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da %s ansonsten nicht ordnungsgemäß funktionieren wird.</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Kann auf diesem Computer nicht an %s binden, da Bitcoin Core wahrscheinlich bereits gestartet wurde.</translation>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>Wenn sie %s nützlich finden, sind Helfer sehr gern gesehen. Besuchen Sie %s um mehr über das Softwareprojekt zu erfahren.</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>Warnung: Es wurde eine ungewöhnlich hohe Anzahl Blöcke erzeugt, %d Blöcke wurden in den letzten %d Stunden empfangen (%d wurden erwartet).</translation>
+ <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>
<message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>Warnung: Überprüpfen Sie ihre Netzwerkverbindung, %d Blöcke wurden in den letzten %d Stunden empfangen (%d wurden erwartet).</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>Die Block-Datenbank enthält einen Block, der in der Zukunft auftaucht. Dies kann daran liegen, dass die Systemzeit Ihres Computers falsch eingestellt ist. Stellen Sie die Block-Datenbank nur wieder her, wenn Sie sich sicher sind, dass Ihre Systemzeit korrekt eingestellt ist.</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>Dies ist eine Vorab-Testversion - Verwendung auf eigene Gefahr - nicht für Mining- oder Handelsanwendungen nutzen!</translation>
+ </message>
+ <message>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>UPnP verwenden, um eine Portweiterleitung einzurichten (Standard: 1, wenn abgehört wird und -proxy nicht gesetzt ist)</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
@@ -2908,14 +1851,18 @@
<translation>Warnung: Wir scheinen nicht vollständig mit unseren Gegenstellen übereinzustimmen! Sie oder die anderen Knoten müssen unter Umständen Ihre Client-Software aktualisieren.</translation>
</message>
<message>
- <source>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>Warnung: wallet.dat beschädigt, Datenrettung erfolgreich! Original wallet.dat wurde als wallet.{Zeitstempel}.dat in %s gespeichert. Falls Ihr Kontostand oder Transaktionen nicht korrekt sind, sollten Sie von einer Datensicherung wiederherstellen.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Gegenstellen die sich von der angegebenen Netzmaske oder IP-Adresse aus verbinden immer zulassen. Kann mehrmals angegeben werden.</translation>
</message>
<message>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>Sie müssen die Datenbank mit Hilfe von -reindex-chainstate neu aufbauen, um -txindex zu verändern</translation>
+ </message>
+ <message>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s beschädigt, Datenrettung fehlgeschlagen</translation>
+ </message>
+ <message>
<source>-maxmempool must be at least %d MB</source>
<translation>-maxmempool muss mindestens %d MB betragen</translation>
</message>
@@ -2924,10 +1871,22 @@
<translation>&lt;category&gt; kann sein:</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>Hänge ein Kommentar zur User Agent-Zeichenkette an</translation>
+ </message>
+ <message>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Es wird versucht, private Schlüssel beim Starten aus einem beschädigtem Wallet wiederherzustellen</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Blockerzeugungsoptionen:</translation>
</message>
<message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>Kann Adresse in -%s nicht auflösen: '%s'</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>Mit nur dem oder den angegebenen Knoten verbinden</translation>
</message>
@@ -2936,6 +1895,10 @@
<translation>Verbindungsoptionen:</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Copyright (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>Beschädigte Blockdatenbank erkannt</translation>
</message>
@@ -2952,6 +1915,22 @@
<translation>Möchten Sie die Blockdatenbank jetzt neu aufbauen?</translation>
</message>
<message>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Aktiviere das Veröffentlichen des Hash-Blocks in &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Aktiviere das Veröffentlichen der Hash-Transaktion in &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Aktiviere das Veröffentlichen des Raw-Blocks in &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Aktiviere das Veröffentlichen der Roh-Transaktion in &lt;address&gt;</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Fehler beim Initialisieren der Blockdatenbank</translation>
</message>
@@ -2960,6 +1939,18 @@
<translation>Fehler beim Initialisieren der Wallet-Datenbankumgebung %s!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>Fehler beim Laden von %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Fehler beim Laden von %s: Das Wallet ist beschädigt</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Fehler beim Laden von %s: Das Wallet benötigt eine neuere Version von %s</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>Fehler beim Laden der Blockdatenbank</translation>
</message>
@@ -2988,6 +1979,26 @@
<translation>Ungültige "-onion"-Adresse: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Ungültiger Betrag für -%s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Ungültiger Betrag für -fallbackfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Halten Sie den Transaktionsspeicherpool unter &lt;n&gt; Megabytes (Voreinstellung: %u)</translation>
+ </message>
+ <message>
+ <source>Loading banlist...</source>
+ <translation>Lade Sperrliste...</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Dateiort für das Auth-Cookie (Standard: Datenverzeichnis)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>Nicht genügend Datei-Deskriptoren verfügbar.</translation>
</message>
@@ -2996,6 +2007,14 @@
<translation>Nur zu Knoten des Netzwerktyps &lt;net&gt; verbinden (ipv4, ipv6 oder onion)</translation>
</message>
<message>
+ <source>Print this help message and exit</source>
+ <translation>Drucke diese Hilfemeldung und beende</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>Gibt die Versionsnummer aus und beendet das Programm</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>Kürzungsmodus kann nicht mit einem negativen Wert konfiguriert werden.</translation>
</message>
@@ -3016,6 +2035,14 @@
<translation>Wallet-Datei angeben (innerhalb des Datenverzeichnisses)</translation>
</message>
<message>
+ <source>The source code is available from %s.</source>
+ <translation>Der Quellcode ist von %s verfügbar.</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>Kann auf diesem Computer nicht an %s binden. Evtl. wurde %s bereits gestartet.</translation>
+ </message>
+ <message>
<source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Nicht unterstütztes Argument -benchmark wurde ignoriert, bitte -debug=bench verwenden.</translation>
</message>
@@ -3032,6 +2059,10 @@
<translation>UPnP verwenden, um eine Portweiterleitung einzurichten (Standard: %u)</translation>
</message>
<message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>Der User Agent Kommentar (%s) enthält unsichere Zeichen.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Verifiziere Blöcke...</translation>
</message>
@@ -3048,14 +2079,6 @@
<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>
- <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-Verbindungen von der angegeben Quelle erlauben. Gültig für &lt;ip&gt; ist eine einzelne IP-Adresse (z.B. 1.2.3.4), ein Netzwerk bzw. eine Netzmaske (z.B. 1.2.3.4/255.255.255.0), oder die CIDR-Notation (z.B. 1.2.3.4/24). Kann mehrmals angegeben werden.</translation>
</message>
@@ -3068,10 +2091,6 @@
<translation>An die angegebene Adresse binden und nach eingehenden JSON-RPC-Verbindungen abhören. Für IPv6 "[Host]:Port"-Notation verwenden. Kann mehrmals angegeben werden. (Standard: an alle Schnittstellen binden)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Datenverzeichnis %s kann nicht gesperrt werden, da Bitcoin Core wahrscheinlich bereits gestartet wurde.</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>
@@ -3088,6 +2107,10 @@
<translation>Befehl ausführen wenn ein relevanter Alarm empfangen wird oder wir einen wirklich langen Fork entdecken (%s im Befehl wird durch die Nachricht ersetzt)</translation>
</message>
<message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Niedrigere Gebühren (in %s/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>
@@ -3112,10 +2135,6 @@
<translation>Maximale Größe in Byte von "high-priority/low-fee"-Transaktionen festlegen (Standard: %d)</translation>
</message>
<message>
- <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
- <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>
@@ -3140,30 +2159,14 @@
<translation>Öffentliche REST-Anfragen annehmen (Standard: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Aktiviere beste Blockkette...</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>Versuchen, private Schlüssel beim Starten aus einer beschädigten wallet.dat wiederherzustellen</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Kann Adresse in -whitebind nicht auflösen: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Automatisch versteckten Tor-Dienst erstellen (Standard: %d)</translation>
</message>
<message>
<source>Connect through SOCKS5 proxy</source>
<translation>Ãœber einen SOCKS5-Proxy &amp;verbinden</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Urheberrecht (C) 2009-%i Die "Bitcoin Core"-Entwickler</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>
@@ -3176,22 +2179,6 @@
<translation>Hinweis</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ungültiger Betrag für -mintxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Ungültiger Betrag für -paytxfee=&lt;amount&gt;: '%s' (muss mindestens %s sein)</translation>
</message>
@@ -3216,12 +2203,8 @@
<translation>RPC-Serveroptionen:</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>Receive and display P2P network alerts (default: %u)</source>
- <translation>P2P-Netzwerk-Alarme empfangen und anzeigen (Standard: %u)</translation>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Reduziere -maxconnections von %d zu %d, aufgrund von Systemlimitierungen.</translation>
</message>
<message>
<source>Rescan the block chain for missing wallet transactions on startup</source>
@@ -3256,6 +2239,14 @@
<translation>Dies ist experimentelle Software.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>TOR Kontrollport Passwort (Standard: leer)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Zu benutzender TOR Kontrollport wenn Onion Auflistung aktiv ist (Standard: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Transaktionsbetrag zu niedrig</translation>
</message>
@@ -3284,14 +2275,18 @@
<translation>Benutzername für JSON-RPC-Verbindungen</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Wallet musste neu geschrieben werden: starten Sie Bitcoin Core zur Fertigstellung neu</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Warnung</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Warnung: Unbekannte neue Regeln aktiviert (Versionsbit %i)</translation>
+ </message>
+ <message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Legt fest ob nur Blöcke Modus aktiv sein soll (Standard: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Lösche alle Transaktionen aus Wallet...</translation>
</message>
@@ -3300,10 +2295,6 @@
<translation>ZeroMQ-Benachrichtigungsoptionen:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat beschädigt, Datenrettung fehlgeschlagen</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Passwort für JSON-RPC-Verbindungen</translation>
</message>
@@ -3312,10 +2303,6 @@
<translation>Befehl ausführen wenn der beste Block wechselt (%s im Befehl wird durch den Hash des Blocks ersetzt)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Dieser Hilfetext</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Erlaube DNS-Abfragen für -addnode, -seednode und -connect</translation>
</message>
@@ -3324,10 +2311,6 @@
<translation>Lade Adressen...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Fehler beim Laden von wallet.dat: Wallet beschädigt</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-Metadaten wie z.B. Accountbesitzer und Zahlungsanforderungsinformationen behalten, 2 = TX-Metadaten verwerfen)</translation>
</message>
@@ -3340,8 +2323,12 @@
<translation>-paytxfee ist auf einen sehr hohen Wert festgelegt! Dies ist die Gebühr die beim Senden einer Transaktion fällig wird.</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Lesen von wallet.dat fehlgeschlagen! Alle Schlüssel wurden korrekt gelesen, Transaktionsdaten bzw. Adressbucheinträge fehlen aber möglicherweise oder sind inkorrekt.</translation>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Die Transaktion nicht länger im Speicherpool behalten als &lt;n&gt; Stunden (Standard: %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Niedrigere Gebühren (in %s/Kb) als diese werden bei der Transaktionserstellung als gebührenfrei angesehen (Standard: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3360,28 +2347,40 @@
<translation>Debugginginformationen ausgeben (Standard: %u, &lt;category&gt; anzugeben ist optional)</translation>
</message>
<message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>Gesamtlänge des Netzwerkversionstrings (%i) erreicht die maximale Länge (%i). Reduzieren Sie die Nummer oder die Größe von uacomments.</translation>
+ </message>
+ <message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Versucht ausgehenden Datenverkehr unter dem gegebenen Wert zu halten (in MiB pro 24h), 0 = kein Limit (default: %d)</translation>
+ </message>
+ <message>
<source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
<translation>Nicht unterstütztes Argument -socks gefunden. Das Festlegen der SOCKS-Version ist nicht mehr möglich, nur noch SOCKS5-Proxies werden unterstützt.</translation>
</message>
<message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Das Argument -whitelistalwaysrelay wird nicht unterstützt und deswegen ignoriert. Benutze -whitelistrelay und/oder -whitelistforcerelay.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Separaten SOCKS5-Proxy verwenden, um Gegenstellen über versteckte Tor-Dienste zu erreichen (Standard: %s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(Standard: %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Benutzername und gehashtes Passwort für JSON-RPC Verbindungen. Das Feld &lt;userpw&gt; kommt im Format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Ein kanonisches Pythonskript ist in share/rpcuser inbegriffen. Diese Option kann mehrere Male spezifiziert werden</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Adressen von Gegenstellen immer über DNS-Namensauflösung abfragen (Standard: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Warnung: Unbekannte Blockversion wird durch Mining erzeugt! Es ist möglich, dass unbekannte Regeln in Kraft sind.</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Fehler beim Laden von wallet.dat</translation>
+ <source>(default: %s)</source>
+ <translation>(Standard: %s)</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Bitcoins erzeugen (Standard: %u)</translation>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Adressen von Gegenstellen immer über DNS-Namensauflösung abfragen (Standard: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3400,6 +2399,10 @@
<translation>&lt;port&gt; nach JSON-RPC-Verbindungen abhören (Standard: %u oder Testnetz: %u)</translation>
</message>
<message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>&lt;port&gt; nach Verbindungen abhören (Standard: %u oder Testnetz: %u)</translation>
+ </message>
+ <message>
<source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
<translation>Maximal &lt;n&gt; Verbindungen zu Gegenstellen aufrechterhalten (Standard: %u)</translation>
</message>
@@ -3464,18 +2467,6 @@
<translation>Unbekannter Netztyp in -onlynet angegeben: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Kann Adresse in -bind nicht auflösen: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Kann Adresse in -externalip nicht auflösen: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ungültiger Betrag für -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Unzureichender Kontostand</translation>
</message>
diff --git a/src/qt/locale/bitcoin_el.ts b/src/qt/locale/bitcoin_el.ts
index f53a88082d..de76a110cf 100644
--- a/src/qt/locale/bitcoin_el.ts
+++ b/src/qt/locale/bitcoin_el.ts
@@ -7,17 +7,6 @@
</message>
</context>
<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Ετικέτα</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ΔιεÏθυνση</translation>
- </message>
- </context>
-<context>
<name>AskPassphraseDialog</name>
<message>
<source>Enter passphrase</source>
@@ -31,11 +20,7 @@
<source>Repeat new passphrase</source>
<translation>Επαναλάβετε νέο συνθηματικό</translation>
</message>
- <message>
- <source>Change passphrase</source>
- <translation>Αλλαγή συνθηματικοÏ</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -55,34 +40,23 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Date</source>
<translation>ΗμεÏομηνία</translation>
</message>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
<message>
- <source>Copy address</source>
- <translation>ΑντιγÏαφή διεÏθυνσης</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>ΑντιγÏαφή ποσοÏ</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>ΑντιγÏαφή ποσότητας</translation>
+ <source>&amp;Label</source>
+ <translation>Ετικέτα</translation>
</message>
<message>
- <source>Copy change</source>
- <translation>ΑντιγÏαφή αλλαγής</translation>
+ <source>&amp;Address</source>
+ <translation>ΔιεÏθυνση</translation>
</message>
- </context>
-<context>
- <name>EditAddressDialog</name>
- </context>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -109,23 +83,21 @@
</context>
<context>
<name>OptionsDialog</name>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>ΠοÏτοφόλι</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
<source>Services</source>
@@ -138,70 +110,27 @@
<source>Remove</source>
<translation>ΑφαίÏεση</translation>
</message>
- <message>
- <source>Copy message</source>
- <translation>ΑντιγÏαφή μηνÏματος</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>ΑντιγÏαφή ποσοÏ</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>ΔιεÏθυνση</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ετικέτα</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Μήνυμα</translation>
- </message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>ΗμεÏομηνία</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ετικέτα</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Μήνυμα</translation>
- </message>
+ <name>SendCoinsDialog</name>
<message>
- <source>(no message)</source>
- <translation>(κανένα μήνυμα)</translation>
+ <source>Insufficient funds!</source>
+ <translation>Κεφάλαια μη επαÏκή</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
<source>Recommended:</source>
<translation>Συνίσταται:</translation>
</message>
- <message>
- <source>Copy quantity</source>
- <translation>ΑντιγÏαφή ποσότητας</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>ΑντιγÏαφή ποσοÏ</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>ΑντιγÏαφή αλλαγής</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
+ <message>
+ <source>Message:</source>
+ <translation>Μήνυμα:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -216,66 +145,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Date</source>
- <translation>ΗμεÏομηνία</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Μήνυμα</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>ΗμεÏομηνία</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ετικέτα</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Copy address</source>
- <translation>ΑντιγÏαφή διεÏθυνσης</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>ΑντιγÏαφή ποσοÏ</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>ΗμεÏομηνία</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ετικέτα</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ΔιεÏθυνση</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Insufficient funds</source>
diff --git a/src/qt/locale/bitcoin_el_GR.ts b/src/qt/locale/bitcoin_el_GR.ts
index b62a4756e1..2814e4f6e7 100644
--- a/src/qt/locale/bitcoin_el_GR.ts
+++ b/src/qt/locale/bitcoin_el_GR.ts
@@ -26,10 +26,6 @@
<translation>Κ&amp;λείσιμο</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;ΑντιγÏαφή διεÏθυνσης</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>ΑντιγÏαφη της επιλεγμενης διεÏθυνσης στο Ï€ÏόχειÏο του συστηματος</translation>
</message>
@@ -45,73 +41,6 @@
<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>Ε&amp;πιλογή</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>Αυτές είναι οι 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>Αυτές είναι οι Bitcoin διευθÏνσεις σας για να λαμβάνετε πληÏωμές. Δίνοντας μία ξεχωÏιστή διεÏθυνση σε κάθε αποστολέα, θα μποÏείτε να ελέγχετε ποιος σας πληÏώνει.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>ΑντιγÏαφή &amp;επιγÏαφής</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;ΕπεξεÏγασία</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Εξαγωγή της λίστας διευθÏνσεων</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>ΑÏχείο οÏιοθετημένο με κόμματα (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Η Εξαγωγή Απέτυχε</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>ΔιεÏθυνση</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(χωÏίς ετικέτα)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,87 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Επανέλαβε τον νέο κωδικό Ï€Ïόσβασης</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>&amp;ΚÏυπτογÏάφηση ποÏτοφολιοÏ</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Αυτη η ενεÏγεία χÏειάζεται τον κωδικό του ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î³Î¹Î± να ξεκλειδώσει το ποÏτοφόλι.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Ξεκλειδωσε το ποÏτοφολι</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Αυτη η ενεÏγεια χÏειάζεται τον κωδικο του ποÏτοφολιου για να αποκÏυπτογÏαφησειι το ποÏτοφολι.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>ΑποκÏυπτογÏάφησε το ποÏτοφολι</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Άλλαξε κωδικο Ï€Ïόσβασης</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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; ΟΛΑ ΣΟΥ ΤΑ BITCOINS&lt;/b&gt;!
-Είσαι σίγουÏος ότι θέλεις να κÏυπτογÏαφησεις το ποÏτοφολι;</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>ΠÏοσοχη: το πλήκτÏο Caps Lock είναι ενεÏγο.</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>ΚÏυπτογÏαφημενο ποÏτοφολι</translation>
- </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>Εισάγετε τον νέο κωδικό Ï€Ïόσβασης στον ποÏτοφόλι &lt;br/&gt; ΠαÏακαλώ χÏησιμοποιείστε ένα κωδικό με &lt;b&gt; 10 ή πεÏισσότεÏους τυχαίους χαÏακτήÏες&lt;/b&gt; ή &lt;b&gt; οχτώ ή παÏαπάνω λέξεις&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Η κÏυπτογÏαφηση του ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Η κÏυπτογÏάφηση του ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ λογω εσωτεÏÎ¹ÎºÎ¿Ï ÏƒÏ†Î¬Î»Î¼Î±Ï„Î¿Ï‚. Το ποÏτοφολι δεν κÏυπτογÏαφηθηκε.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Οι εισαχθέντες κωδικοί δεν ταιÏιάζουν.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>το ξεκλείδωμα του ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Ο κωδικος που εισήχθη για την αποκÏυπτογÏαφηση του ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î®Ï„Î±Î½ λαθος.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Η αποκÏυπτογÏαφηση του ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Ο κωδικος του ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î¬Î»Î»Î±Î¾Îµ με επιτυχία.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -255,6 +103,10 @@
<translation>Εξοδος από την εφαÏμογή</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;ΠεÏί %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Σχετικά με &amp;Qt</translation>
</message>
@@ -291,14 +143,6 @@
<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>
@@ -343,10 +187,6 @@
<translation>&amp;ΠαÏαλαβή </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>
@@ -383,18 +223,10 @@
<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 codes και διευθÏνσεις bitcoin: )</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Σχετικά με το Bitcoin Core</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>ΠÏοβολή της λίστας των χÏησιμοποιημένων διευθÏνσεων και ετικετών αποστολής</translation>
</message>
@@ -411,10 +243,6 @@
<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-Qt μήνυματος βοήθειας για να πάÏετε μια λίστα με τις πιθανές επιλογές Bitcoin γÏαμμής εντολών.</translation>
- </message>
- <message>
<source>No block source available...</source>
<translation>Η πηγή του μπλοκ δεν ειναι διαθέσιμη... </translation>
</message>
@@ -502,13 +330,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Ειδοποίηση ΔικτÏου</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -586,143 +407,6 @@
<source>Priority</source>
<translation>ΠÏοτεÏαιότητα</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>ΑντιγÏαφή διεÏθυνσης</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>ΑντιγÏαφή επιγÏαφής</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>ΑντιγÏαφή των byte</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>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Αυτή η ετικέτα γίνεται κόκκινη αν το μέγεθος της συναλλαγής είναι μεγαλÏτεÏο από 1000 bytes.</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>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 ανα kB</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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>Ïέστα από %1 (%2) </translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(Ïέστα)
-</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -746,38 +430,6 @@
<source>&amp;Address</source>
<translation>&amp;ΔιεÏθυνση</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Îέα διεÏθυνση λήψης</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Îέα διεÏθυνση αποστολής</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>ΕπεξεÏγασία διεÏθυνσης λήψης</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>ΕπεξεÏγασία διεÏθυνσης αποστολής</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Η διεÏθυνση "%1" βÏίσκεται ήδη στο βιβλίο διευθÏνσεων.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Η διεÏθυνση "%1" δεν είναι έγκυÏη Bitcoin διεÏθυνση.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Δεν είναι δυνατό το ξεκλείδωμα του ποÏτοφολιοÏ.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Η δημιουÏγία νέου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -805,10 +457,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>έκδοση</translation>
</message>
@@ -817,10 +465,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Σχετικά με το Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>επιλογής γÏαμμής εντολών</translation>
</message>
@@ -832,7 +476,7 @@
<source>command-line options</source>
<translation>επιλογής γÏαμμής εντολών</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -840,18 +484,6 @@
<translation>Καλώς ήÏθατε</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Καλώς ήÏθατε στο Bitcoin Core.</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>O πυÏήνας Bitcoin θα κατεβάσει και να αποθηκεÏσει ένα αντίγÏαφο της αλυσίδας μπλοκ Bitcoin. Τουλάχιστον %1GB δεδομένων θα αποθηκευτοÏν σε αυτόν τον κατάλογο, και θα αυξηθεί με την πάÏοδο του χÏόνου. Το ποÏτοφόλι θα αποθηκευτεί σε αυτόν τον κατάλογο.</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>ΧÏήση του Ï€Ïοεπιλεγμένου φακέλου δεδομένων</translation>
</message>
@@ -860,10 +492,6 @@
<translation>ΠÏοσαÏμογή του φακέλου δεδομένων: </translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Σφάλμα: Ο καθοÏισμένος φάκελος δεδομένων "%1" δεν μποÏεί να δημιουÏγηθεί.</translation>
</message>
@@ -898,10 +526,6 @@
<source>Select payment request file</source>
<translation>Επιλέξτε πληÏωμή αÏχείου αίτησης</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Επιλέξτε αÏχείο πληÏωμής για άνοιγμα.</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -1163,69 +787,6 @@
</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 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>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <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>Payment request file handling</source>
- <translation>Επιλέξτε αÏχείο πληÏωμής για άνοιγμα.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <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>
- <message>
- <source>Network request error</source>
- <translation>Σφάλμα αιτήματος δικτÏου</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>Ping Time</source>
@@ -1272,31 +833,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <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>
- <source>Client name</source>
- <translation>Όνομα Πελάτη</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Μη διαθέσιμο</translation>
</message>
@@ -1317,10 +855,6 @@
<translation>Γενικά</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>ΧÏησιμοποιηση της OpenSSL εκδοσης</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>ΧÏήση BerkeleyDB έκδοσης</translation>
</message>
@@ -1425,10 +959,6 @@
<translation>ΕξεÏχόμενα:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>ΗμεÏομηνία κατασκευής</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>ΑÏχείο καταγÏαφής ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï ÏƒÏ†Î±Î»Î¼Î¬Ï„Ï‰Î½ </translation>
</message>
@@ -1523,18 +1053,6 @@
<source>Remove</source>
<translation>ΑφαίÏεση</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>ΑντιγÏαφή επιγÏαφής</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>ΑντιγÏαφή μηνÏματος</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>ΑντιγÏαφή ποσοÏ</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1554,73 +1072,6 @@
<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>
- <message>
- <source>URI</source>
- <translation>URI:</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ΔιεÏθυνση</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Ποσό</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ΕπιγÏαφή</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Μήνυμα</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Το αποτέλεσμα της διεÏθυνσης είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿. Μειώστε το μέγεθος για το κείμενο της ετικέτας/ μηνÏματος.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Σφάλμα κατά την κωδικοποίηση του URI σε κώδικα QR</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>ΗμεÏομηνία</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ΕπιγÏαφή</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Μήνυμα</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Ποσό</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(χωÏίς ετικέτα)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(κανένα μήνυμα)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(κανένα ποσό)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1721,10 +1172,6 @@
<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>
@@ -1756,82 +1203,6 @@
<source>S&amp;end</source>
<translation>Αποστολη</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Επιβεβαίωση αποστολής νομισμάτων</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 σε %2</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>ΑντιγÏαφή των byte</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>ΑντιγÏαφή Ï€ÏοτεÏαιότητας</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>ΑντιγÏαφή των Ïέστων</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ή</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Το ποσό πληÏωμής Ï€Ïέπει να είναι μεγαλÏτεÏο από 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <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>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>ΠÏοειδοποίηση: Μη έγκυÏη διεÏθυνση Bitcoin</translation>
- </message>
- <message>
- <source>(no label)</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>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1844,10 +1215,6 @@
<translation>ΠληÏωμή &amp;σε:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Εισάγετε μια επιγÏαφή για αυτή τη διεÏθυνση ώστε να καταχωÏηθεί στο βιβλίο διευθÏνσεων</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;ΕπιγÏαφή</translation>
</message>
@@ -1899,10 +1266,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Το Bitcoin Core τεÏματίζεται...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Μην απενεÏγοποιήσετε τον υπολογιστή μέχÏι να κλείσει αυτό το παÏάθυÏο.</translation>
</message>
@@ -1985,70 +1348,10 @@
<source>Reset all verify message fields</source>
<translation>ΕπαναφοÏά όλων επαλήθευμενων πεδίων μήνυματος </translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Κάντε κλικ στο "ΥπογÏαφή ΜηνÏματος" για να λάβετε την υπογÏαφή</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Η διεÏθυνση που εισήχθη είναι λάθος.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Η υπογÏαφή του μηνÏματος απέτυχε.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Μήνυμα υπεγÏάφη.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Η υπογÏαφή δεν μπόÏεσε να αποκÏυπτογÏαφηθεί.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>ΠαÏακαλοÏμε ελέγξτε την υπογÏαφή και δοκιμάστε ξανά.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Η υπογÏαφή δεν ταιÏιάζει με το μήνυμα. </translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Η επιβεβαίωση του μηνÏματος απέτυχε</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Μήνυμα επιβεβαιώθηκε.</translation>
- </message>
</context>
<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>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2061,386 +1364,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Ανοιχτό μέχÏι %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>σÏγκÏουση</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/χωÏίς σÏνδεση;</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/χωÏίς επιβεβαίωση</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 επιβεβαιώσεις</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Κατάσταση</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>ΗμεÏομηνία</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Πηγή</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>ΔημιουÏγία </translation>
- </message>
- <message>
- <source>From</source>
- <translation>Από</translation>
- </message>
- <message>
- <source>To</source>
- <translation>ΠÏος</translation>
- </message>
- <message>
- <source>own address</source>
- <translation> δική σας διεÏθυνση </translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>Επίβλεψη μόνο:</translation>
- </message>
- <message>
- <source>label</source>
- <translation>eπιγÏαφή</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Πίστωση </translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>μη αποδεκτό</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debit</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>
- <message>
- <source>Net amount</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>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>Συναλλαγή</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>εισÏοές </translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Ποσό</translation>
- </message>
- <message>
- <source>true</source>
- <translation>αληθής</translation>
- </message>
- <message>
- <source>false</source>
- <translation>αναληθής </translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, δεν έχει ακόμα μεταδοθεί μ' επιτυχία</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>άγνωστο</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>ΛεπτομέÏειες συναλλαγής</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Αυτό το παÏάθυÏο δείχνει μια λεπτομεÏή πεÏιγÏαφή της συναλλαγής</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>ΗμεÏομηνία</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>ΤÏπος</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Ανοιχτό μέχÏι %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>ΕπικυÏωμένη (%1 επικυÏώσεις)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Αυτό το μπλοκ δεν έχει παÏαληφθεί από κανέναν άλλο κόμβο και κατά πάσα πιθανότητα θα αποÏÏιφθεί!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>ΔημιουÏγήθηκε αλλά αποÏÏίφθηκε</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ΕπιγÏαφή</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Ανεπιβεβαίωτες</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>ΣÏγκÏουση</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ελήφθη με</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Ελήφθη από</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Απεστάλη Ï€Ïος</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>ΠληÏωμή Ï€Ïος εσάς</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>ΕξόÏυξη</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>Επίβλεψη μόνο:</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(δ/α)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Κατάσταση συναλλαγής. Πηγαίνετε το ποντίκι πάνω από αυτό το πεδίο για να δείτε τον αÏιθμό των επικυÏώσεων</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>ΗμεÏομηνία κι ÏŽÏα λήψης της συναλλαγής.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Είδος συναλλαγής.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Ποσό που αφαιÏέθηκε ή Ï€Ïοστέθηκε στο υπόλοιπο.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Όλα</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>ΣήμεÏα</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Αυτή την εβδομάδα</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Αυτόν τον μήνα</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Τον Ï€ÏοηγοÏμενο μήνα</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Αυτό το έτος</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Έκταση...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ελήφθη με</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Απεστάλη Ï€Ïος</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>ΠÏος εσάς</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>ΕξόÏυξη</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Άλλο</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Αναζήτηση με βάση τη διεÏθυνση ή την επιγÏαφή</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Ελάχιστο ποσό</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>ΑντιγÏαφή διεÏθυνσης</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>ΑντιγÏαφή επιγÏαφής</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Εξαγωγή ΙστοÏÎ¹ÎºÎ¿Ï Î£Ï…Î½Î±Î»Î»Î±Î³ÏŽÎ½</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Επίβλεψη μόνο:</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Η Εξαγωγή Απέτυχε</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>YπήÏξε σφάλμα κατά την Ï€Ïοσπάθεια αποθήκευσης του ιστοÏÎ¹ÎºÎ¿Ï ÏƒÏ…Î½Î±Î»Î»Î±Î³ÏŽÎ½ στο %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>ΕπικυÏωμένες</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>ΗμεÏομηνία</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>ΤÏπος</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ΕπιγÏαφή</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ΔιεÏθυνση</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Έκταση:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>έως</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2448,55 +1378,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Δεν έχει φοÏτωθεί ποÏτοφόλι</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Αποστολή νομισμάτων</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Εξαγωγή</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Εξαγωγή δεδομένων καÏτέλας σε αÏχείο</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>ΑντίγÏαφο ασφαλείας του ποÏτοφολιοÏ</translation>
- </message>
- <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>
<source>Options:</source>
@@ -2527,6 +1408,10 @@
<translation>Îα δέχεσαι συνδέσεις από έξω(Ï€Ïοεπιλογή:1)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</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>
@@ -2539,10 +1424,6 @@
<translation>Αυτό είναι ένα Ï€Ïο-τεστ κυκλοφοÏίας - χÏησιμοποιήστε το με δική σας ευθÏνη - δεν χÏησιμοποιείτε για εξόÏυξη ή για αλλες εφαÏμογές</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>ΠÏοειδοποίηση : το αÏχειο wallet.dat ειναι διεφθαÏμένο, τα δεδομένα σώζονται ! Original wallet.dat αποθηκεÏονται ως wallet.{timestamp}.bak στο %s . Αν το υπόλοιπο του ή τις συναλλαγές σας, είναι λάθος θα Ï€Ïέπει να επαναφέÏετε από ένα αντίγÏαφο ασφαλείας</translation>
- </message>
- <message>
<source>Block creation options:</source>
<translation>Αποκλεισμός επιλογων δημιουÏγίας: </translation>
</message>
@@ -2603,6 +1484,10 @@
<translation>Μόνο σÏνδεση σε κόμβους του δικτÏου &lt;net&gt; (ipv4, ipv6 ή onion)</translation>
</message>
<message>
+ <source>Set maximum block size in bytes (default: %d)</source>
+ <translation>ΟÏίστε το μέγιστο μέγεθος block σε bytes (Ï€Ïοεπιλογή: %d)</translation>
+ </message>
+ <message>
<source>Specify wallet file (within data directory)</source>
<translation>Επιλέξτε αÏχείο ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï (μέσα απο κατάλογο δεδομένων)</translation>
</message>
@@ -2623,18 +1508,10 @@
<translation>Επιλογές ποÏτοφολιοÏ:</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Αδυναμία κλειδώματος του φακέλου δεδομένων %s. Πιθανώς το Bitcoin να είναι ήδη ενεÏγό.</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>ΣÏνδεση μέσω διαμεσολαβητή SOCKS5</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <translation>Σφάλμα φόÏτωσης wallet.dat: Το ΠοÏτοφόλι απαιτεί μια νεότεÏη έκδοση του Bitcoin</translation>
- </message>
- <message>
<source>Error reading from database, shutting down.</source>
<translation>Σφάλμα ανάγνωσης από τη βάση δεδομένων, γίνεται τεÏματισμός.</translation>
</message>
@@ -2643,18 +1520,6 @@
<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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Μη έγκυÏο ποσό για την παÏάμετÏο -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Node relay options:</source>
<translation>Επιλογές αναμετάδοσης κόμβου: </translation>
</message>
@@ -2707,10 +1572,6 @@
<translation>ΜεταφοÏά όλων των συναλλαγών απο το ποÏτοφόλι</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>Το αÏχειο wallet.dat ειναι διεφθαÏμένο, η διάσωση απέτυχε</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Κωδικός για τις συνδέσεις JSON-RPC</translation>
</message>
@@ -2719,10 +1580,6 @@
<translation>Εκτέλεσε την εντολή όταν το καλÏτεÏο μπλοκ αλλάξει(%s στην εντολή αντικαθίσταται από το hash του μπλοκ)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Αυτό το κείμενο βοήθειας</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Îα επιτÏέπονται οι έλεγχοι DNS για Ï€Ïοσθήκη και σÏνδεση κόμβων</translation>
</message>
@@ -2731,10 +1588,6 @@
<translation>ΦόÏτωση διευθÏνσεων...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Σφάλμα φόÏτωσης wallet.dat: ΚατεστÏαμμένο ΠοÏτοφόλι</translation>
- </message>
- <message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
<translation>Πόσο εξονυχιστική να είναι η επιβεβαίωση του μπλοκ (0-4, Ï€Ïοεπιλογή: %u)</translation>
</message>
@@ -2747,14 +1600,6 @@
<translation>ΔευτεÏόλεπτα Ï€Ïιν επιτÏαπεί ξανά η σÏνδεση των Ï€Ïοβληματικών peers (Ï€Ïοεπιλογή: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Σφάλμα φόÏτωσης αÏχείου wallet.dat</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>
@@ -2767,6 +1612,14 @@
<translation>Δεν είναι έγκυÏη η διεÏθυνση διαμεσολαβητή: '%s'</translation>
</message>
<message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>Μέγιστες αÏιθμός συνδέσεων με τους peers &lt;n&gt; (Ï€Ïοεπιλογή: %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>ΟÏισμός λήξης χÏÎ¿Î½Î¹ÎºÎ¿Ï Î¿Ïίου σε χιλιοστά του δευτεÏολέπτου(Ï€Ïοεπιλογή: %d)</translation>
</message>
@@ -2783,18 +1636,6 @@
<translation>Άγνωστo δίκτυο οÏίζεται σε onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Δεν μποÏÏŽ να γÏάψω την Ï€Ïοεπιλεγμένη διεÏθυνση: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Δεν μποÏÏŽ να γÏάψω την Ï€Ïοεπιλεγμένη διεÏθυνση: '%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_en.ts b/src/qt/locale/bitcoin_en.ts
index e709f8515b..79c3e87b2b 100644
--- a/src/qt/locale/bitcoin_en.ts
+++ b/src/qt/locale/bitcoin_en.ts
@@ -34,12 +34,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addressbookpage.cpp" line="+80"/>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copy Address</translation>
- </message>
- <message>
- <location filename="../forms/addressbookpage.ui" line="-53"/>
+ <location line="-53"/>
<source>Delete the currently selected address from the list</source>
<translation>Delete the currently selected address from the list</translation>
</message>
@@ -58,89 +53,6 @@
<source>&amp;Delete</source>
<translation>&amp;Delete</translation>
</message>
- <message>
- <location filename="../addressbookpage.cpp" line="-30"/>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>C&amp;hoose</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Sending addresses</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Receiving addresses</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Copy &amp;Label</source>
- <translation>Copy &amp;Label</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>&amp;Edit</source>
- <translation>&amp;Edit</translation>
- </message>
- <message>
- <location line="+193"/>
- <source>Export Address List</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Exporting Failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <location filename="../addresstablemodel.cpp" line="+170"/>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
- <location line="+36"/>
- <source>(no label)</source>
- <translation>(no label)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -164,124 +76,6 @@
<source>Repeat new passphrase</source>
<translation>Repeat new passphrase</translation>
</message>
- <message>
- <location filename="../askpassphrasedialog.cpp" line="+45"/>
- <source>Encrypt wallet</source>
- <translation>Encrypt wallet</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>This operation needs your wallet passphrase to unlock the wallet.</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Unlock wallet</source>
- <translation>Unlock wallet</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>This operation needs your wallet passphrase to decrypt the wallet.</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Decrypt wallet</source>
- <translation>Decrypt wallet</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Change passphrase</source>
- <translation>Change passphrase</translation>
- </message>
- <message>
- <location line="+46"/>
- <source>Confirm wallet encryption</source>
- <translation>Confirm wallet encryption</translation>
- </message>
- <message>
- <location line="+1"/>
- <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>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Are you sure you wish to encrypt your wallet?</translation>
- </message>
- <message>
- <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>
- <message>
- <location line="+100"/>
- <location line="+24"/>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Warning: The Caps Lock key is on!</translation>
- </message>
- <message>
- <location line="-130"/>
- <location line="+58"/>
- <source>Wallet encrypted</source>
- <translation>Wallet encrypted</translation>
- </message>
- <message>
- <location line="-136"/>
- <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 type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+70"/>
- <location line="+7"/>
- <location line="+42"/>
- <location line="+6"/>
- <source>Wallet encryption failed</source>
- <translation>Wallet encryption failed</translation>
- </message>
- <message>
- <location line="-54"/>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</translation>
- </message>
- <message>
- <location line="+7"/>
- <location line="+48"/>
- <source>The supplied passphrases do not match.</source>
- <translation>The supplied passphrases do not match.</translation>
- </message>
- <message>
- <location line="-37"/>
- <source>Wallet unlock failed</source>
- <translation>Wallet unlock failed</translation>
- </message>
- <message>
- <location line="+1"/>
- <location line="+11"/>
- <location line="+19"/>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>The passphrase entered for the wallet decryption was incorrect.</translation>
- </message>
- <message>
- <location line="-20"/>
- <source>Wallet decryption failed</source>
- <translation>Wallet decryption failed</translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Wallet passphrase was successfully changed.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -299,17 +93,17 @@
<context>
<name>BitcoinGUI</name>
<message>
- <location filename="../bitcoingui.cpp" line="+335"/>
+ <location filename="../bitcoingui.cpp" line="+341"/>
<source>Sign &amp;message...</source>
<translation>Sign &amp;message...</translation>
</message>
<message>
- <location line="+362"/>
+ <location line="+377"/>
<source>Synchronizing with network...</source>
<translation>Synchronizing with network...</translation>
</message>
<message>
- <location line="-438"/>
+ <location line="-455"/>
<source>&amp;Overview</source>
<translation>&amp;Overview</translation>
</message>
@@ -344,7 +138,17 @@
<translation>Quit application</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+3"/>
+ <source>&amp;About %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Show information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>About &amp;Qt</source>
<translation>About &amp;Qt</translation>
</message>
@@ -359,6 +163,11 @@
<translation>&amp;Options...</translation>
</message>
<message>
+ <location line="+1"/>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location line="+6"/>
<source>&amp;Encrypt Wallet...</source>
<translation>&amp;Encrypt Wallet...</translation>
@@ -374,7 +183,7 @@
<translation>&amp;Change Passphrase...</translation>
</message>
<message>
- <location line="+10"/>
+ <location line="+12"/>
<source>&amp;Sending addresses...</source>
<translation type="unfinished"></translation>
</message>
@@ -389,27 +198,17 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+183"/>
- <source>Bitcoin Core client</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+169"/>
- <source>Importing blocks from disk...</source>
- <translation>Importing blocks from disk...</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+372"/>
<source>Reindexing blocks on disk...</source>
<translation>Reindexing blocks on disk...</translation>
</message>
<message>
- <location line="-436"/>
+ <location line="-457"/>
<source>Send coins to a Bitcoin address</source>
<translation>Send coins to a Bitcoin address</translation>
</message>
<message>
- <location line="+65"/>
+ <location line="+67"/>
<source>Backup wallet to another location</source>
<translation>Backup wallet to another location</translation>
</message>
@@ -434,12 +233,12 @@
<translation>&amp;Verify message...</translation>
</message>
<message>
- <location line="+459"/>
+ <location line="+481"/>
<source>Bitcoin</source>
<translation>Bitcoin</translation>
</message>
<message>
- <location line="-669"/>
+ <location line="-693"/>
<source>Wallet</source>
<translation>Wallet</translation>
</message>
@@ -454,12 +253,7 @@
<translation>&amp;Receive</translation>
</message>
<message>
- <location line="+40"/>
- <source>Show information about Bitcoin Core</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
+ <location line="+50"/>
<source>&amp;Show / Hide</source>
<translation>&amp;Show / Hide</translation>
</message>
@@ -484,7 +278,7 @@
<translation>Verify messages to ensure they were signed with specified Bitcoin addresses</translation>
</message>
<message>
- <location line="+56"/>
+ <location line="+58"/>
<source>&amp;File</source>
<translation>&amp;File</translation>
</message>
@@ -504,27 +298,12 @@
<translation>Tabs toolbar</translation>
</message>
<message>
- <location line="-314"/>
- <source>Bitcoin Core</source>
- <translation type="unfinished">Bitcoin Core</translation>
- </message>
- <message>
- <location line="+160"/>
+ <location line="-158"/>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+38"/>
- <source>&amp;About Bitcoin Core</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
+ <location line="+70"/>
<source>Show the list of used sending addresses and labels</source>
<translation type="unfinished"></translation>
</message>
@@ -543,13 +322,8 @@
<source>&amp;Command-line options</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <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="+329"/>
+ <location line="+341"/>
<source>%n active connection(s) to Bitcoin network</source>
<translation>
<numerusform>%n active connection to Bitcoin network</numerusform>
@@ -557,7 +331,17 @@
</translation>
</message>
<message>
- <location line="+25"/>
+ <location line="+22"/>
+ <source>Indexing blocks on disk...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Processing blocks on disk...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
<source>No block source available...</source>
<translation>No block source available...</translation>
</message>
@@ -643,12 +427,22 @@
<translation>Up to date</translation>
</message>
<message>
- <location line="+44"/>
+ <location line="-388"/>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+188"/>
+ <source>%1 client</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+244"/>
<source>Catching up...</source>
<translation>Catching up...</translation>
</message>
<message>
- <location line="+129"/>
+ <location line="+137"/>
<source>Date: %1
</source>
<translation type="unfinished"></translation>
@@ -699,14 +493,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <location filename="../clientmodel.cpp" line="+135"/>
- <source>Network Alert</source>
- <translation>Network Alert</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<location filename="../forms/coincontroldialog.ui" line="+14"/>
@@ -803,189 +589,6 @@
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../coincontroldialog.cpp" line="+47"/>
- <source>Copy address</source>
- <translation type="unfinished">Copy address</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy label</source>
- <translation type="unfinished">Copy label</translation>
- </message>
- <message>
- <location line="+1"/>
- <location line="+26"/>
- <source>Copy amount</source>
- <translation type="unfinished">Copy amount</translation>
- </message>
- <message>
- <location line="-25"/>
- <source>Copy transaction ID</source>
- <translation type="unfinished">Copy transaction ID</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Lock unspent</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Unlock unspent</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+22"/>
- <source>Copy quantity</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Copy fee</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy after fee</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy bytes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy priority</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy dust</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy change</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+351"/>
- <source>highest</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>higher</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>high</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>medium-high</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>medium</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>low-medium</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>low</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>lower</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>lowest</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
- <source>(%1 locked)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+28"/>
- <source>none</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <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="+9"/>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-33"/>
- <source>yes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>no</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
- <location line="+5"/>
- <source>This means a fee of at least %1 per kB is required.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-4"/>
- <source>Can vary +/- 1 byte per input.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+59"/>
- <location line="+60"/>
- <source>(no label)</source>
- <translation type="unfinished">(no label)</translation>
- </message>
- <message>
- <location line="-7"/>
- <source>change from %1 (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>(change)</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1014,51 +617,11 @@
<source>&amp;Address</source>
<translation>&amp;Address</translation>
</message>
- <message>
- <location filename="../editaddressdialog.cpp" line="+28"/>
- <source>New receiving address</source>
- <translation>New receiving address</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>New sending address</source>
- <translation>New sending address</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Edit receiving address</source>
- <translation>Edit receiving address</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Edit sending address</source>
- <translation>Edit sending address</translation>
- </message>
- <message>
- <location line="+76"/>
- <source>The entered address &quot;%1&quot; is already in the address book.</source>
- <translation>The entered address &quot;%1&quot; is already in the address book.</translation>
- </message>
- <message>
- <location line="-5"/>
- <source>The entered address &quot;%1&quot; is not a valid Bitcoin address.</source>
- <translation>The entered address &quot;%1&quot; is not a valid Bitcoin address.</translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Could not unlock wallet.</source>
- <translation>Could not unlock wallet.</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>New key generation failed.</source>
- <translation>New key generation failed.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
<message>
- <location filename="../intro.cpp" line="+68"/>
+ <location filename="../intro.cpp" line="+78"/>
<source>A new data directory will be created.</source>
<translation>A new data directory will be created.</translation>
</message>
@@ -1086,12 +649,7 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <location filename="../utilitydialog.cpp" line="+36"/>
- <source>Bitcoin Core</source>
- <translation type="unfinished">Bitcoin Core</translation>
- </message>
- <message>
- <location line="+0"/>
+ <location filename="../utilitydialog.cpp" line="+40"/>
<source>version</source>
<translation type="unfinished">version</translation>
</message>
@@ -1103,7 +661,7 @@
</message>
<message>
<location line="+5"/>
- <source>About Bitcoin Core</source>
+ <source>About %1</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -1153,7 +711,7 @@
</message>
<message>
<location line="+1"/>
- <source>Reset all settings changes made over the GUI</source>
+ <source>Reset all settings changed in the GUI</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1166,17 +724,17 @@
</message>
<message>
<location line="+9"/>
- <source>Welcome to Bitcoin Core.</source>
+ <source>Welcome to %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
- <source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+10"/>
- <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>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -1190,12 +748,7 @@
<translation>Use a custom data directory:</translation>
</message>
<message>
- <location filename="../intro.cpp" line="+82"/>
- <source>Bitcoin Core</source>
- <translation type="unfinished">Bitcoin Core</translation>
- </message>
- <message>
- <location line="+1"/>
+ <location filename="../intro.cpp" line="+89"/>
<source>Error: Specified data directory &quot;%1&quot; cannot be created.</source>
<translation type="unfinished"></translation>
</message>
@@ -1243,11 +796,6 @@
<source>Select payment request file</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../openuridialog.cpp" line="+47"/>
- <source>Select payment request file to open</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -1262,7 +810,17 @@
<translation>&amp;Main</translation>
</message>
<message>
- <location line="+18"/>
+ <location line="+6"/>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Start %1 on system login</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
<source>Size of &amp;database cache</source>
<translation type="unfinished"></translation>
</message>
@@ -1293,17 +851,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+84"/>
+ <location line="+94"/>
<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="+80"/>
<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>
@@ -1329,22 +882,12 @@
<translation>&amp;Reset Options</translation>
</message>
<message>
- <location line="-504"/>
+ <location line="-514"/>
<source>&amp;Network</source>
<translation>&amp;Network</translation>
</message>
<message>
- <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"/>
+ <location line="-85"/>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished"></translation>
</message>
@@ -1455,6 +998,16 @@
</message>
<message>
<location line="+6"/>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Hide tray icon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Show only a tray icon after minimizing the window.</translation>
</message>
@@ -1479,7 +1032,12 @@
<translation>User Interface &amp;language:</translation>
</message>
<message>
- <location line="+24"/>
+ <location line="+13"/>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unit to show amounts in:</translation>
</message>
@@ -1489,12 +1047,12 @@
<translation>Choose the default subdivision unit to show in the interface and when sending coins.</translation>
</message>
<message>
- <location line="-440"/>
+ <location line="-450"/>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+602"/>
+ <location line="+612"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
@@ -1504,7 +1062,7 @@
<translation>&amp;Cancel</translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="+81"/>
+ <location filename="../optionsdialog.cpp" line="+86"/>
<source>default</source>
<translation>default</translation>
</message>
@@ -1514,23 +1072,23 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+71"/>
+ <location line="+72"/>
<source>Confirm options reset</source>
<translation>Confirm options reset</translation>
</message>
<message>
<location line="+1"/>
- <location line="+30"/>
+ <location line="+43"/>
<source>Client restart required to activate changes.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-30"/>
+ <location line="-43"/>
<source>Client will be shut down. Do you want to proceed?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+34"/>
+ <location line="+47"/>
<source>This change would require a client restart.</source>
<translation type="unfinished"></translation>
</message>
@@ -1635,132 +1193,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <location filename="../paymentserver.cpp" line="+432"/>
- <location line="+14"/>
- <location line="+7"/>
- <source>URI handling</source>
- <translation type="unfinished">URI handling</translation>
- </message>
- <message>
- <location line="-7"/>
- <source>Invalid payment address %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+83"/>
- <location line="+9"/>
- <location line="+31"/>
- <location line="+10"/>
- <location line="+17"/>
- <location line="+88"/>
- <source>Payment request rejected</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-155"/>
- <source>Payment request network doesn&apos;t match client network.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Payment request is not initialized.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+42"/>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-258"/>
- <location line="+216"/>
- <location line="+42"/>
- <location line="+113"/>
- <location line="+14"/>
- <location line="+18"/>
- <source>Payment request error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-402"/>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+104"/>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Payment request file handling</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+70"/>
- <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="+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="+44"/>
- <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Error communicating with %1: %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+20"/>
- <source>Payment request cannot be parsed!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>Bad response from server %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+33"/>
- <source>Payment acknowledged</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-11"/>
- <source>Network request error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<location filename="../peertablemodel.cpp" line="+117"/>
@@ -1781,17 +1213,17 @@
<context>
<name>QObject</name>
<message>
- <location filename="../bitcoinunits.cpp" line="+183"/>
+ <location filename="../bitcoinunits.cpp" line="+176"/>
<source>Amount</source>
<translation type="unfinished">Amount</translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="+110"/>
+ <location filename="../guiutil.cpp" line="+135"/>
<source>Enter a Bitcoin address (e.g. %1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+763"/>
+ <location line="+764"/>
<source>%1 d</source>
<translation type="unfinished"></translation>
</message>
@@ -1807,7 +1239,7 @@
</message>
<message>
<location line="+2"/>
- <location line="+41"/>
+ <location line="+47"/>
<source>%1 s</source>
<translation type="unfinished"></translation>
</message>
@@ -1828,50 +1260,20 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <location filename="../receiverequestdialog.cpp" line="+36"/>
- <source>&amp;Save Image...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;Copy Image</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+32"/>
- <source>Save QR Code</source>
- <translation type="unfinished">Save QR Code</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>PNG Image (*.png)</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <location filename="../forms/debugwindow.ui" line="+46"/>
- <source>Client name</source>
- <translation>Client name</translation>
- </message>
- <message>
- <location line="+10"/>
- <location line="+23"/>
- <location line="+26"/>
+ <location filename="../forms/debugwindow.ui" line="+56"/>
<location line="+26"/>
<location line="+26"/>
<location line="+23"/>
- <location line="+23"/>
- <location line="+23"/>
- <location line="+23"/>
+ <location line="+26"/>
<location line="+36"/>
<location line="+23"/>
<location line="+36"/>
+ <location line="+23"/>
<location line="+36"/>
- <location line="+534"/>
+ <location line="+23"/>
+ <location line="+663"/>
<location line="+23"/>
<location line="+23"/>
<location line="+23"/>
@@ -1892,12 +1294,12 @@
<translation>N/A</translation>
</message>
<message>
- <location line="-1216"/>
+ <location line="-1322"/>
<source>Client version</source>
<translation>Client version</translation>
</message>
<message>
- <location line="-45"/>
+ <location line="-22"/>
<source>&amp;Information</source>
<translation>&amp;Information</translation>
</message>
@@ -1912,27 +1314,27 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+79"/>
- <source>Using OpenSSL version</source>
- <translation>Using OpenSSL version</translation>
+ <location line="+56"/>
+ <source>Using BerkeleyDB version</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+26"/>
- <source>Using BerkeleyDB version</source>
+ <source>Datadir</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+49"/>
+ <location line="+26"/>
<source>Startup time</source>
<translation>Startup time</translation>
</message>
<message>
- <location line="+170"/>
+ <location line="+29"/>
<source>Network</source>
<translation>Network</translation>
</message>
<message>
- <location line="-147"/>
+ <location line="+7"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
@@ -1962,41 +1364,36 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+36"/>
+ <location line="+23"/>
<source>Memory usage</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+48"/>
- <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="+233"/>
- <location line="+552"/>
+ <location line="+404"/>
+ <location line="+558"/>
<source>Received</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-472"/>
- <location line="+449"/>
+ <location line="-478"/>
+ <location line="+455"/>
<source>Sent</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-408"/>
+ <location line="-414"/>
<source>&amp;Peers</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+50"/>
+ <location line="+53"/>
<source>Banned peers</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+57"/>
- <location filename="../rpcconsole.cpp" line="+287"/>
- <location line="+578"/>
+ <location line="+60"/>
+ <location filename="../rpcconsole.cpp" line="+295"/>
+ <location line="+634"/>
<source>Select a peer to view detailed information.</source>
<translation type="unfinished"></translation>
</message>
@@ -2031,13 +1428,28 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-973"/>
- <location line="+881"/>
+ <location line="-1079"/>
+ <location line="+987"/>
<source>User Agent</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+23"/>
+ <location line="-684"/>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+68"/>
+ <source>Decrease font size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>Increase font size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+610"/>
<source>Services</source>
<translation type="unfinished"></translation>
</message>
@@ -2082,12 +1494,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-977"/>
+ <location line="-1093"/>
<source>Last block time</source>
<translation>Last block time</translation>
</message>
<message>
- <location line="+123"/>
+ <location line="+110"/>
<source>&amp;Open</source>
<translation>&amp;Open</translation>
</message>
@@ -2097,7 +1509,7 @@
<translation>&amp;Console</translation>
</message>
<message>
- <location line="+72"/>
+ <location line="+195"/>
<source>&amp;Network Traffic</source>
<translation type="unfinished"></translation>
</message>
@@ -2112,7 +1524,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="-343"/>
+ <location filename="../rpcconsole.cpp" line="-342"/>
<source>In:</source>
<translation type="unfinished"></translation>
</message>
@@ -2122,22 +1534,17 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../forms/debugwindow.ui" line="-417"/>
- <source>Build date</source>
- <translation>Build date</translation>
- </message>
- <message>
- <location line="+241"/>
+ <location filename="../forms/debugwindow.ui" line="-299"/>
<source>Debug log file</source>
<translation>Debug log file</translation>
</message>
<message>
- <location line="+85"/>
+ <location line="+136"/>
<source>Clear console</source>
<translation>Clear console</translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="-156"/>
+ <location filename="../rpcconsole.cpp" line="-203"/>
<source>&amp;Disconnect Node</source>
<translation type="unfinished"></translation>
</message>
@@ -2175,8 +1582,8 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+70"/>
- <source>Welcome to the Bitcoin Core RPC console.</source>
+ <location line="+117"/>
+ <source>Welcome to the %1 RPC console.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2190,7 +1597,7 @@
<translation>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</translation>
</message>
<message>
- <location line="+144"/>
+ <location line="+146"/>
<source>%1 B</source>
<translation type="unfinished"></translation>
</message>
@@ -2342,21 +1749,6 @@
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../receivecoinsdialog.cpp" line="+46"/>
- <source>Copy label</source>
- <translation type="unfinished">Copy label</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy message</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy amount</source>
- <translation type="unfinished">Copy amount</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -2380,95 +1772,11 @@
<source>&amp;Save Image...</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../receiverequestdialog.cpp" line="+65"/>
- <source>Request payment to %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Payment information</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>URI</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Address</source>
- <translation type="unfinished">Address</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Amount</source>
- <translation type="unfinished">Amount</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Label</source>
- <translation type="unfinished">Label</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Message</source>
- <translation type="unfinished">Message</translation>
- </message>
- <message>
- <location line="+10"/>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">Resulting URI too long, try to reduce the text for label / message.</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Error encoding URI into QR Code.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <location filename="../recentrequeststablemodel.cpp" line="+29"/>
- <source>Date</source>
- <translation type="unfinished">Date</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Label</source>
- <translation type="unfinished">Label</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Message</source>
- <translation type="unfinished">Message</translation>
- </message>
- <message>
- <location line="+99"/>
- <source>Amount</source>
- <translation type="unfinished">Amount</translation>
- </message>
- <message>
- <location line="-59"/>
- <source>(no label)</source>
- <translation type="unfinished">(no label)</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>(no message)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>(no amount)</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="+14"/>
- <location filename="../sendcoinsdialog.cpp" line="+546"/>
<source>Send Coins</source>
<translation>Send Coins</translation>
</message>
@@ -2615,17 +1923,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+38"/>
- <source>Send as zero-fee transaction if possible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>(confirmation may take longer)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+110"/>
+ <location line="+102"/>
<source>Send to multiple recipients at once</source>
<translation>Send to multiple recipients at once</translation>
</message>
@@ -2640,12 +1938,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-858"/>
+ <location line="-805"/>
<source>Dust:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+861"/>
+ <location line="+808"/>
<source>Clear &amp;All</source>
<translation>Clear &amp;All</translation>
</message>
@@ -2664,152 +1962,6 @@
<source>S&amp;end</source>
<translation>S&amp;end</translation>
</message>
- <message>
- <location filename="../sendcoinsdialog.cpp" line="-226"/>
- <source>Confirm send coins</source>
- <translation>Confirm send coins</translation>
- </message>
- <message>
- <location line="-49"/>
- <location line="+5"/>
- <location line="+5"/>
- <location line="+4"/>
- <source>%1 to %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-221"/>
- <source>Copy quantity</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy amount</source>
- <translation type="unfinished">Copy amount</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy fee</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy after fee</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy bytes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Copy priority</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Copy change</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+244"/>
- <source>Total Amount %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>or</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <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>
- <message>
- <location line="+3"/>
- <source>The amount exceeds your balance.</source>
- <translation>The amount exceeds your balance.</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>The total exceeds your balance when the %1 transaction fee is included.</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Transaction creation failed!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Payment request expired.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+91"/>
- <source>Pay only the required fee of %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message numerus="yes">
- <location line="+23"/>
- <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="-140"/>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+12"/>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+234"/>
- <source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+19"/>
- <source>(no label)</source>
- <translation type="unfinished">(no label)</translation>
- </message>
- <message>
- <location line="-11"/>
- <source>Warning: Unknown change address</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-695"/>
- <source>Copy dust</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+221"/>
- <source>Are you sure you want to send?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+9"/>
- <source>added as transaction fee</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2826,12 +1978,7 @@
<translation>Pay &amp;To:</translation>
</message>
<message>
- <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="+93"/>
+ <location line="+93"/>
<source>&amp;Label:</source>
<translation>&amp;Label:</translation>
</message>
@@ -2924,7 +2071,7 @@
<name>ShutdownWindow</name>
<message>
<location filename="../utilitydialog.cpp" line="+78"/>
- <source>Bitcoin Core is shutting down...</source>
+ <source>%1 is shutting down...</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -3043,91 +2190,10 @@
<source>Reset all verify message fields</source>
<translation>Reset all verify message fields</translation>
</message>
- <message>
- <location filename="../signverifymessagedialog.cpp" line="+41"/>
- <source>Click &quot;Sign Message&quot; to generate signature</source>
- <translation>Click &quot;Sign Message&quot; to generate signature</translation>
- </message>
- <message>
- <location line="+83"/>
- <location line="+80"/>
- <source>The entered address is invalid.</source>
- <translation>The entered address is invalid.</translation>
- </message>
- <message>
- <location line="-80"/>
- <location line="+8"/>
- <location line="+72"/>
- <location line="+8"/>
- <source>Please check the address and try again.</source>
- <translation>Please check the address and try again.</translation>
- </message>
- <message>
- <location line="-80"/>
- <location line="+80"/>
- <source>The entered address does not refer to a key.</source>
- <translation>The entered address does not refer to a key.</translation>
- </message>
- <message>
- <location line="-72"/>
- <source>Wallet unlock was cancelled.</source>
- <translation>Wallet unlock was cancelled.</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Private key for the entered address is not available.</source>
- <translation>Private key for the entered address is not available.</translation>
- </message>
- <message>
- <location line="+12"/>
- <source>Message signing failed.</source>
- <translation>Message signing failed.</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Message signed.</source>
- <translation>Message signed.</translation>
- </message>
- <message>
- <location line="+58"/>
- <source>The signature could not be decoded.</source>
- <translation>The signature could not be decoded.</translation>
- </message>
- <message>
- <location line="+0"/>
- <location line="+13"/>
- <source>Please check the signature and try again.</source>
- <translation>Please check the signature and try again.</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>The signature did not match the message digest.</source>
- <translation>The signature did not match the message digest.</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Message verification failed.</source>
- <translation>Message verification failed.</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Message verified.</source>
- <translation>Message verified.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <location filename="../splashscreen.cpp" line="+41"/>
- <source>Bitcoin Core</source>
- <translation type="unfinished">Bitcoin Core</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>The Bitcoin Core developers</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../networkstyle.cpp" line="+19"/>
<source>[testnet]</source>
<translation>[testnet]</translation>
@@ -3142,735 +2208,195 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <location filename="../transactiondesc.cpp" line="+32"/>
- <source>Open until %1</source>
- <translation>Open until %1</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>conflicted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1/unconfirmed</source>
- <translation>%1/unconfirmed</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>%1 confirmations</source>
- <translation>%1 confirmations</translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <location line="+7"/>
- <source>, broadcast through %n node(s)</source>
- <translation>
- <numerusform>, broadcast through %n node</numerusform>
- <numerusform>, broadcast through %n nodes</numerusform>
- </translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Source</source>
- <translation>Source</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Generated</source>
- <translation>Generated</translation>
- </message>
- <message>
- <location line="+5"/>
- <location line="+13"/>
- <location line="+72"/>
- <source>From</source>
- <translation>From</translation>
- </message>
- <message>
- <location line="-71"/>
- <location line="+20"/>
- <location line="+69"/>
- <source>To</source>
- <translation>To</translation>
- </message>
- <message>
- <location line="-87"/>
- <source>own address</source>
- <translation>own address</translation>
- </message>
- <message>
- <location line="+0"/>
- <location line="+69"/>
- <source>watch-only</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-67"/>
- <source>label</source>
- <translation>label</translation>
- </message>
- <message>
- <location line="+34"/>
- <location line="+12"/>
- <location line="+53"/>
- <location line="+26"/>
- <location line="+53"/>
- <source>Credit</source>
- <translation>Credit</translation>
- </message>
- <message numerus="yes">
- <location line="-142"/>
- <source>matures in %n more block(s)</source>
- <translation>
- <numerusform>matures in %n more block</numerusform>
- <numerusform>matures in %n more blocks</numerusform>
- </translation>
- </message>
- <message>
- <location line="+2"/>
- <source>not accepted</source>
- <translation>not accepted</translation>
- </message>
- <message>
- <location line="+59"/>
- <location line="+25"/>
- <location line="+53"/>
- <source>Debit</source>
- <translation>Debit</translation>
- </message>
- <message>
- <location line="-68"/>
- <source>Total debit</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Total credit</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+5"/>
- <source>Transaction fee</source>
- <translation>Transaction fee</translation>
- </message>
- <message>
- <location line="+16"/>
- <source>Net amount</source>
- <translation>Net amount</translation>
- </message>
- <message>
- <location line="+6"/>
- <location line="+9"/>
- <source>Message</source>
- <translation>Message</translation>
- </message>
- <message>
- <location line="-7"/>
- <source>Comment</source>
- <translation>Comment</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Transaction ID</source>
- <translation>Transaction ID</translation>
- </message>
- <message>
- <location line="+18"/>
- <source>Merchant</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to &quot;not accepted&quot; and it won&apos;t be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Debug information</source>
- <translation>Debug information</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Transaction</source>
- <translation>Transaction</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Inputs</source>
- <translation>Inputs</translation>
- </message>
- <message>
- <location line="+21"/>
- <source>Amount</source>
- <translation>Amount</translation>
- </message>
- <message>
- <location line="+1"/>
- <location line="+1"/>
- <source>true</source>
- <translation>true</translation>
- </message>
- <message>
- <location line="-1"/>
- <location line="+1"/>
- <source>false</source>
- <translation>false</translation>
- </message>
- <message>
- <location line="-242"/>
- <source>, has not been successfully broadcast yet</source>
- <translation>, has not been successfully broadcast yet</translation>
- </message>
- <message numerus="yes">
- <location line="-36"/>
- <source>Open for %n more block(s)</source>
- <translation>
- <numerusform>Open for %n more block</numerusform>
- <numerusform>Open for %n more blocks</numerusform>
- </translation>
- </message>
- <message>
- <location line="+67"/>
- <source>unknown</source>
- <translation>unknown</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <location filename="../forms/transactiondescdialog.ui" line="+14"/>
- <source>Transaction details</source>
- <translation>Transaction details</translation>
- </message>
- <message>
- <location line="+6"/>
+ <location filename="../forms/transactiondescdialog.ui" line="+20"/>
<source>This pane shows a detailed description of the transaction</source>
<translation>This pane shows a detailed description of the transaction</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <location filename="../transactiontablemodel.cpp" line="+246"/>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Type</source>
- <translation>Type</translation>
- </message>
- <message>
- <location line="+79"/>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message numerus="yes">
- <location line="-21"/>
- <source>Open for %n more block(s)</source>
- <translation>
- <numerusform>Open for %n more block</numerusform>
- <numerusform>Open for %n more blocks</numerusform>
- </translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Open until %1</source>
- <translation>Open until %1</translation>
- </message>
- <message>
- <location line="+12"/>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmed (%1 confirmations)</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>This block was not received by any other nodes and will probably not be accepted!</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Generated but not accepted</source>
- <translation>Generated but not accepted</translation>
- </message>
- <message>
- <location line="-21"/>
- <source>Offline</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="-64"/>
- <source>Label</source>
- <translation type="unfinished">Label</translation>
- </message>
- <message>
- <location line="+67"/>
- <source>Unconfirmed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Conflicted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+48"/>
- <source>Received with</source>
- <translation>Received with</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Received from</source>
- <translation>Received from</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>Sent to</source>
- <translation>Sent to</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Payment to yourself</source>
- <translation>Payment to yourself</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Mined</source>
- <translation>Mined</translation>
- </message>
- <message>
- <location line="+28"/>
- <source>watch-only</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <location line="+217"/>
- <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>
- <message>
- <location line="+2"/>
- <source>Date and time that the transaction was received.</source>
- <translation>Date and time that the transaction was received.</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Type of transaction.</source>
- <translation>Type of transaction.</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished"></translation>
- </message>
+ <name>UnitDisplayStatusBarControl</name>
<message>
- <location line="+2"/>
- <source>User-defined intent/purpose of the transaction.</source>
+ <location filename="../bitcoingui.cpp" line="+116"/>
+ <source>Unit to show amounts in. Click to select another unit.</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location line="+2"/>
- <source>Amount removed from or added to balance.</source>
- <translation>Amount removed from or added to balance.</translation>
- </message>
</context>
<context>
- <name>TransactionView</name>
- <message>
- <location filename="../transactionview.cpp" line="+69"/>
- <location line="+16"/>
- <source>All</source>
- <translation>All</translation>
- </message>
- <message>
- <location line="-15"/>
- <source>Today</source>
- <translation>Today</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>This week</source>
- <translation>This week</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>This month</source>
- <translation>This month</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Last month</source>
- <translation>Last month</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>This year</source>
- <translation>This year</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Range...</source>
- <translation>Range...</translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Received with</source>
- <translation>Received with</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Sent to</source>
- <translation>Sent to</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>To yourself</source>
- <translation>To yourself</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Mined</source>
- <translation>Mined</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Other</source>
- <translation>Other</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Enter address or label to search</source>
- <translation>Enter address or label to search</translation>
- </message>
+ <name>bitcoin-core</name>
<message>
- <location line="+6"/>
- <source>Min amount</source>
- <translation>Min amount</translation>
+ <location filename="../bitcoinstrings.cpp" line="+292"/>
+ <source>Options:</source>
+ <translation>Options:</translation>
</message>
<message>
- <location line="+36"/>
- <source>Copy address</source>
- <translation>Copy address</translation>
+ <location line="+30"/>
+ <source>Specify data directory</source>
+ <translation>Specify data directory</translation>
</message>
<message>
- <location line="+1"/>
- <source>Copy label</source>
- <translation>Copy label</translation>
+ <location line="-89"/>
+ <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="+1"/>
- <source>Copy amount</source>
- <translation>Copy amount</translation>
+ <location line="+92"/>
+ <source>Specify your own public address</source>
+ <translation>Specify your own public address</translation>
</message>
<message>
- <location line="+1"/>
- <source>Copy transaction ID</source>
- <translation>Copy transaction ID</translation>
+ <location line="-108"/>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Accept command line and JSON-RPC commands</translation>
</message>
<message>
- <location line="+1"/>
- <source>Copy raw transaction</source>
+ <location line="-128"/>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
- <source>Edit label</source>
- <translation>Edit label</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Show transaction details</source>
- <translation>Show transaction details</translation>
- </message>
- <message>
- <location line="+181"/>
- <source>Export Transaction History</source>
+ <location line="+32"/>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+12"/>
- <source>Watch-only</source>
+ <location line="+2"/>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
- <source>Exporting Failed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+0"/>
- <source>There was an error trying to save the transaction history to %1.</source>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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="+4"/>
- <source>Exporting Successful</source>
+ <location line="+5"/>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+0"/>
- <source>The transaction history was successfully saved to %1.</source>
+ <location line="+119"/>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-24"/>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Confirmed</source>
- <translation>Confirmed</translation>
- </message>
- <message>
<location line="+3"/>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Type</source>
- <translation>Type</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <location line="+121"/>
- <source>Range:</source>
- <translation>Range:</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>to</source>
- <translation>to</translation>
- </message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- <message>
- <location filename="../bitcoingui.cpp" line="+106"/>
- <source>Unit to show amounts in. Click to select another unit.</source>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>WalletFrame</name>
<message>
- <location filename="../walletframe.cpp" line="+27"/>
- <source>No wallet has been loaded.</source>
+ <location line="+40"/>
+ <source>Pruning blockstore...</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <location filename="../walletmodel.cpp" line="+288"/>
- <source>Send Coins</source>
- <translation>Send Coins</translation>
+ <location line="+10"/>
+ <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>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <location filename="../walletview.cpp" line="+46"/>
- <source>&amp;Export</source>
- <translation>&amp;Export</translation>
+ <location line="+30"/>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
- <source>Export the data in the current tab to a file</source>
- <translation>Export the data in the current tab to a file</translation>
+ <location line="-121"/>
+ <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="+194"/>
- <source>Backup Wallet</source>
- <translation>Backup Wallet</translation>
+ <location line="-206"/>
+ <source>Bitcoin Core</source>
+ <translation type="unfinished">Bitcoin Core</translation>
</message>
<message>
<location line="+1"/>
- <source>Wallet Data (*.dat)</source>
- <translation>Wallet Data (*.dat)</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Backup Failed</source>
- <translation>Backup Failed</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>There was an error trying to save the wallet data to %1.</source>
+ <source>The %s developers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
- <source>The wallet data was successfully saved to %1.</source>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+0"/>
- <source>Backup Successful</source>
- <translation>Backup Successful</translation>
- </message>
-</context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <location filename="../bitcoinstrings.cpp" line="+267"/>
- <source>Options:</source>
- <translation>Options:</translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Specify data directory</source>
- <translation>Specify data directory</translation>
- </message>
- <message>
- <location line="-84"/>
- <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="+87"/>
- <source>Specify your own public address</source>
- <translation>Specify your own public address</translation>
- </message>
- <message>
- <location line="-105"/>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Accept command line and JSON-RPC commands</translation>
- </message>
- <message>
- <location line="-118"/>
- <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <location line="+9"/>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+15"/>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <location line="+3"/>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
- <source>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>
+ <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="+3"/>
- <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <location line="+10"/>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <location line="+5"/>
+ <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="+9"/>
- <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>
+ <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>
<message>
<location line="+5"/>
- <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <source>Error loading %s: You can&apos;t enable HD on a already existing non-HD wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+116"/>
- <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <location line="+2"/>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
- <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
- <translation type="unfinished"></translation>
+ <location line="+8"/>
+ <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>
<message>
- <location line="+38"/>
- <source>Pruning blockstore...</source>
+ <location line="+12"/>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
- <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="+29"/>
- <source>Unable to start HTTP server. See debug log for details.</source>
+ <location line="+17"/>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-117"/>
- <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="-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="+16"/>
- <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <location line="+7"/>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <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>
+ <location line="+7"/>
+ <source>Please check that your computer&apos;s date and time are correct! If your clock is wrong, %s will not work properly.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+13"/>
- <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>
+ <location line="+3"/>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+60"/>
+ <location line="+24"/>
<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="+8"/>
+ <location line="+5"/>
<source>The block database contains a block which appears to be from the future. This may be due to your computer&apos;s date and time being set incorrectly. Only rebuild the block database if you are sure that your computer&apos;s date and time are correct</source>
<translation type="unfinished"></translation>
</message>
@@ -3881,46 +2407,41 @@
</message>
<message>
<location line="+13"/>
- <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"/>
- <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+12"/>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+10"/>
<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>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</translation>
</message>
<message>
<location line="+3"/>
- <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>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.</translation>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
- <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <location line="+9"/>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+11"/>
+ <location line="+2"/>
+ <source>%s corrupt, salvage failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>-maxmempool must be at least %d MB</source>
<translation type="unfinished"></translation>
</message>
@@ -3930,12 +2451,32 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+11"/>
+ <location line="+7"/>
+ <source>Append comment to the user agent string</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
<source>Block creation options:</source>
<translation>Block creation options:</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+2"/>
+ <source>Cannot resolve -%s address: &apos;%s&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Change index out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Connect only to the specified node(s)</source>
<translation>Connect only to the specified node(s)</translation>
</message>
@@ -3945,7 +2486,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+1"/>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Corrupted block database detected</source>
<translation>Corrupted block database detected</translation>
</message>
@@ -3986,6 +2532,11 @@
</message>
<message>
<location line="+1"/>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Error initializing block database</source>
<translation>Error initializing block database</translation>
</message>
@@ -3996,11 +2547,31 @@
</message>
<message>
<location line="+1"/>
+ <source>Error loading %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Error loading %s: You can&apos;t disable HD on a already existing HD wallet</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Error loading block database</source>
<translation>Error loading block database</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+1"/>
<source>Error opening block database</source>
<translation>Error opening block database</translation>
</message>
@@ -4015,7 +2586,7 @@
<translation>Failed to listen on any port. Use -listen=0 if you want this.</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+3"/>
<source>Importing...</source>
<translation type="unfinished"></translation>
</message>
@@ -4025,17 +2596,47 @@
<translation>Incorrect or no genesis block found. Wrong datadir for network?</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+2"/>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
<source>Invalid -onion address: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+2"/>
+ <source>Invalid amount for -%s=&lt;amount&gt;: &apos;%s&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: &apos;%s&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
<source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+12"/>
+ <location line="+4"/>
+ <source>Loading banlist...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>Not enough file descriptors available.</source>
<translation>Not enough file descriptors available.</translation>
</message>
@@ -4046,6 +2647,16 @@
</message>
<message>
<location line="+4"/>
+ <source>Print this help message and exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Print version and exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished"></translation>
</message>
@@ -4055,22 +2666,47 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+13"/>
+ <location line="+3"/>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Rewinding blocks...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
<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="+10"/>
+ <location line="+9"/>
<source>Specify wallet file (within data directory)</source>
<translation>Specify wallet file (within data directory)</translation>
</message>
<message>
- <location line="+16"/>
+ <location line="+3"/>
+ <source>The source code is available from %s.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation type="unfinished"></translation>
</message>
@@ -4110,22 +2746,22 @@
<translation>Wallet %s resides outside data directory %s</translation>
</message>
<message>
- <location line="+2"/>
- <source>Wallet options:</source>
+ <location line="+1"/>
+ <source>Wallet debugging/testing options:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>Warning: This version is obsolete; upgrade required!</source>
+ <location line="+1"/>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <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>
+ <location line="+1"/>
+ <source>Wallet options:</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="-306"/>
+ <location line="-321"/>
<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>
@@ -4140,12 +2776,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
+ <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>
@@ -4155,7 +2786,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+11"/>
+ <location line="+13"/>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
<translation type="unfinished"></translation>
</message>
@@ -4170,7 +2801,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+11"/>
+ <location line="+14"/>
<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>
@@ -4180,12 +2811,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+10"/>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+18"/>
+ <location line="+21"/>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation type="unfinished"></translation>
</message>
@@ -4200,12 +2831,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+5"/>
- <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+10"/>
+ <location line="+12"/>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished"></translation>
</message>
@@ -4215,7 +2841,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+44"/>
+ <location line="+21"/>
+ <source>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
<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 type="unfinished"></translation>
</message>
@@ -4225,7 +2856,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+7"/>
<source>(default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4235,52 +2866,22 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
- <source>Activating best chain...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Always relay transactions received from whitelisted peers (default: %d)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
+ <location line="+6"/>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+5"/>
- <source>Cannot resolve -whitebind address: &apos;%s&apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+7"/>
<source>Connect through SOCKS5 proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
+ <location line="+22"/>
<source>Error reading from database, shutting down.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+8"/>
<source>Imports blocks from external blk000??.dat file on startup</source>
<translation type="unfinished"></translation>
</message>
@@ -4290,32 +2891,12 @@
<translation>Information</translation>
</message>
<message>
- <location line="+1"/>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <translation type="unfinished"></translation>
- </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>
- <message>
- <location line="+1"/>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: &apos;%s&apos;</source>
- <translation>Invalid amount for -mintxfee=&lt;amount&gt;: &apos;%s&apos;</translation>
- </message>
- <message>
- <location line="+1"/>
+ <location line="+7"/>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: &apos;%s&apos; (must be at least %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+1"/>
<source>Invalid netmask specified in -whitelist: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
@@ -4325,7 +2906,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+11"/>
+ <location line="+14"/>
<source>Need to specify a port with -whitebind: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
@@ -4335,22 +2916,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+11"/>
<source>RPC server options:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
+ <location line="+3"/>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation type="unfinished"></translation>
</message>
@@ -4360,7 +2931,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+4"/>
<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>
@@ -4370,7 +2941,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+3"/>
+ <source>Set maximum BIP141 block cost (default: %d)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation type="unfinished"></translation>
</message>
@@ -4385,12 +2961,12 @@
<translation>Signing transaction failed</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+9"/>
<source>The transaction amount is too small to pay the fee</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+1"/>
<source>This is experimental software.</source>
<translation type="unfinished"></translation>
</message>
@@ -4430,7 +3006,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+7"/>
<source>Upgrade wallet to latest format on startup</source>
<translation type="unfinished"></translation>
</message>
@@ -4440,72 +3016,57 @@
<translation>Username for JSON-RPC connections</translation>
</message>
<message>
- <location line="+4"/>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
+ <location line="+7"/>
<source>Warning</source>
<translation>Warning</translation>
</message>
<message>
- <location line="+2"/>
- <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <location line="+1"/>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>Zapping all transactions from wallet...</source>
+ <location line="+1"/>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
- <source>ZeroMQ notification options:</source>
+ <source>Zapping all transactions from wallet...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrupt, salvage failed</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="-62"/>
+ <location line="-65"/>
<source>Password for JSON-RPC connections</source>
<translation>Password for JSON-RPC connections</translation>
</message>
<message>
- <location line="-205"/>
+ <location line="-218"/>
<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="+237"/>
- <source>This help message</source>
- <translation>This help message</translation>
- </message>
- <message>
- <location line="-103"/>
+ <location line="+146"/>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Allow DNS lookups for -addnode, -seednode and -connect</translation>
</message>
<message>
- <location line="+59"/>
+ <location line="+57"/>
<source>Loading addresses...</source>
<translation>Loading addresses...</translation>
</message>
<message>
- <location line="-30"/>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Error loading wallet.dat: Wallet corrupted</translation>
- </message>
- <message>
- <location line="-214"/>
+ <location line="-264"/>
<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="+3"/>
+ <location line="+6"/>
<source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished"></translation>
</message>
@@ -4515,22 +3076,17 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+32"/>
+ <location line="+37"/>
<source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+17"/>
+ <location line="+21"/>
<source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+6"/>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4540,7 +3096,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+13"/>
<source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4570,7 +3126,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+3"/>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation type="unfinished"></translation>
</message>
@@ -4580,27 +3141,27 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+29"/>
- <source>(default: %s)</source>
+ <location line="+7"/>
+ <source>Warning: Unknown block versions being mined! It&apos;s possible unknown rules are in effect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+10"/>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <location line="+3"/>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
- <source>Error loading wallet.dat</source>
- <translation>Error loading wallet.dat</translation>
+ <location line="+19"/>
+ <source>(default: %s)</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+10"/>
- <source>Generate coins (default: %u)</source>
+ <location line="+9"/>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+38"/>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
<translation type="unfinished"></translation>
</message>
@@ -4615,7 +3176,7 @@
<translation>Invalid -proxy address: &apos;%s&apos;</translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+7"/>
<source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4625,7 +3186,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+6"/>
<source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4645,12 +3206,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+8"/>
<source>Prepend debug output with timestamp (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+10"/>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4660,17 +3221,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+8"/>
<source>Set key pool size to &lt;n&gt; (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>Set minimum block size in bytes (default: %u)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
+ <location line="+3"/>
<source>Set the number of threads to service RPC calls (default: %d)</source>
<translation type="unfinished"></translation>
</message>
@@ -4700,67 +3256,52 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+10"/>
<source>Unknown network specified in -onlynet: &apos;%s&apos;</source>
<translation>Unknown network specified in -onlynet: &apos;%s&apos;</translation>
</message>
<message>
- <location line="-107"/>
- <source>Cannot resolve -bind address: &apos;%s&apos;</source>
- <translation>Cannot resolve -bind address: &apos;%s&apos;</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Cannot resolve -externalip address: &apos;%s&apos;</source>
- <translation>Cannot resolve -externalip address: &apos;%s&apos;</translation>
- </message>
- <message>
- <location line="+45"/>
- <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="-7"/>
+ <location line="-73"/>
<source>Insufficient funds</source>
<translation>Insufficient funds</translation>
</message>
<message>
- <location line="+14"/>
+ <location line="+13"/>
<source>Loading block index...</source>
<translation>Loading block index...</translation>
</message>
<message>
- <location line="-61"/>
+ <location line="-60"/>
<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="+62"/>
+ <location line="+61"/>
<source>Loading wallet...</source>
<translation>Loading wallet...</translation>
</message>
<message>
- <location line="-55"/>
+ <location line="-54"/>
<source>Cannot downgrade wallet</source>
<translation>Cannot downgrade wallet</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+2"/>
<source>Cannot write default address</source>
<translation>Cannot write default address</translation>
</message>
<message>
- <location line="+73"/>
+ <location line="+78"/>
<source>Rescanning...</source>
<translation>Rescanning...</translation>
</message>
<message>
- <location line="-63"/>
+ <location line="-67"/>
<source>Done loading</source>
<translation>Done loading</translation>
</message>
<message>
- <location line="+13"/>
+ <location line="+15"/>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_en_GB.ts b/src/qt/locale/bitcoin_en_GB.ts
index 96cdecfe83..1893aaca09 100644
--- a/src/qt/locale/bitcoin_en_GB.ts
+++ b/src/qt/locale/bitcoin_en_GB.ts
@@ -26,10 +26,6 @@
<translation>C&amp;lose</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copy Address</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Delete the currently selected address from the list</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Delete</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Choose the address to send coins to</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Choose the address to receive coins with</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>C&amp;hoose</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Sending addresses</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Receiving addresses</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>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</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>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copy &amp;Label</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Edit</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Export Address List</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exporting Failed</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>There was an error trying to save the address list to %1. Please try again.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(no label)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Repeat new passphrase</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Encrypt wallet</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>This operation needs your wallet passphrase to unlock the wallet.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Unlock wallet</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>This operation needs your wallet passphrase to decrypt the wallet.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Decrypt wallet</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Change passphrase</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirm wallet encryption</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>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Are you sure you wish to encrypt your wallet?</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 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>
- </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: 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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Warning: The Caps Lock key is on!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Wallet encrypted</translation>
- </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>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;.</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Enter the old passphrase and new passphrase to the wallet.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Wallet encryption failed</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>The supplied passphrases do not match.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Wallet unlock failed</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>The passphrase entered for the wallet decryption was incorrect.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Wallet decryption failed</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Wallet passphrase was successfully changed.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -270,6 +111,14 @@
<translation>Quit application</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;About %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Show information about %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>About &amp;Qt</translation>
</message>
@@ -282,6 +131,10 @@
<translation>&amp;Options...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Modify configuration options for %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>&amp;Encrypt Wallet...</translation>
</message>
@@ -306,14 +159,6 @@
<translation>Open &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core client</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importing blocks from disk...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindexing blocks on disk...</translation>
</message>
@@ -358,10 +203,6 @@
<translation>&amp;Receive</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Show information about Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Show / Hide</translation>
</message>
@@ -398,22 +239,10 @@
<translation>Tabs toolbar</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Request payments (generates QR codes and bitcoin: URIs)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;About Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Modify configuration options for Bitcoin Core</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Show the list of used sending addresses and labels</translation>
</message>
@@ -429,15 +258,19 @@
<source>&amp;Command-line options</source>
<translation>&amp;Command-line options</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</translation>
- </message>
<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>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Indexing blocks on disk...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Processing blocks on disk...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>No block source available...</translation>
</message>
@@ -494,6 +327,14 @@
<translation>Up to date</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Show the %1 help message to get a list with possible Bitcoin command-line options</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 client</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Catching up...</translation>
</message>
@@ -545,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Network Alert</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -629,150 +463,6 @@
<source>Priority</source>
<translation>Priority</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copy address</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copy label</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copy amount</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copy transaction ID</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Lock unspent</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Unlock unspent</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copy quantity</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copy fee</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copy after fee</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copy bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copy priority</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copy dust</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copy change</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>highest</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>higher</translation>
- </message>
- <message>
- <source>high</source>
- <translation>high</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medium-high</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>medium</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>low-medium</translation>
- </message>
- <message>
- <source>low</source>
- <translation>low</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>lower</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>lowest</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 locked)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>none</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>This label turns red if the transaction size is greater than 1000 bytes.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>This label turns red if the priority is smaller than "medium".</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than %1.</source>
- <translation>This label turns red if any recipient receives an amount smaller than %1.</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Can vary +/- %1 satoshi(s) per input.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>yes</translation>
- </message>
- <message>
- <source>no</source>
- <translation>no</translation>
- </message>
- <message>
- <source>This means a fee of at least %1 per kB is required.</source>
- <translation>This means a fee of at least %1 per kB is required.</translation>
- </message>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Can vary +/- 1 byte per input.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transactions with higher priority are more likely to get included into a block.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(no label)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>change from %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(change)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -796,38 +486,6 @@
<source>&amp;Address</source>
<translation>&amp;Address</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>New receiving address</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>New sending address</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Edit receiving address</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Edit sending address</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>The entered address "%1" is already in the address book.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>The entered address "%1" is not a valid Bitcoin address.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Could not unlock wallet.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>New key generation failed.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -855,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>version</translation>
</message>
@@ -867,8 +521,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>About Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>About %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -882,6 +536,34 @@
<source>command-line options</source>
<translation>command-line options</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>UI Options:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Choose data directory on startup (default: %u)</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>Start minimised</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Set SSL root certificates for payment request (default: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Show splash screen on startup (default: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Reset all settings changed in the GUI</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -890,16 +572,16 @@
<translation>Welcome</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Welcome to Bitcoin Core.</translation>
+ <source>Welcome to %1.</source>
+ <translation>Welcome to %1.</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>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>As this is the first time the program is launched, you can choose where %1 will store its data.</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 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.</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 will download and store a copy of the Bitcoin block chain. At least %2GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -910,10 +592,6 @@
<translation>Use a custom data directory:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Error: Specified data directory "%1" cannot be created.</translation>
</message>
@@ -948,10 +626,6 @@
<source>Select payment request file</source>
<translation>Select payment request file</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Select payment request file to open</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -964,6 +638,14 @@
<translation>&amp;Main</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Automatically start %1 after logging in to the system.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Start %1 on system login</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>Size of &amp;database cache</translation>
</message>
@@ -992,10 +674,6 @@
<translation>Minimise 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.</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>The user interface language can be set here. This setting will take effect after restarting 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>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 |.</translation>
</message>
@@ -1020,14 +698,6 @@
<translation>&amp;Network</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Automatically start Bitcoin Core after logging in to the system.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Start Bitcoin Core on system login</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt;0 = leave that many cores free)</translation>
</message>
@@ -1112,6 +782,14 @@
<translation>&amp;Window</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Hide the icon from the system tray.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Hide tray icon</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Show on a tray icon after minimising the window.</translation>
</message>
@@ -1132,6 +810,10 @@
<translation>User Interface &amp;language:</translation>
</message>
<message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation>The user interface language can be set here. This setting will take effect after restarting %1.</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unit to show amounts in:</translation>
</message>
@@ -1256,97 +938,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI handling</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Invalid payment address %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Payment request rejected</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Payment request network doesn't match client network.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Payment request is not initialised.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Requested payment amount of %1 is too small (considered dust).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Payment request error</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Cannot start bitcoin: click-to-pay handler</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Payment request fetch URL is invalid: %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 cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Payment request file handling</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Payment request file cannot be read! This can be caused by an invalid payment request file.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Payment request expired.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>Unverified payment requests to custom payment scripts are unsupported.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Invalid payment request.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>Refund from %1</translation>
- </message>
- <message>
- <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
- <translation>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>Error communicating with %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Payment request cannot be parsed!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Bad response from server %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Payment acknowledged</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Network request error</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1401,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Save Image...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copy Image</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Save QR Code</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG Image (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Client name</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1446,14 +1014,14 @@
<translation>General</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Using OpenSSL version</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Using BerkeleyDB version</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Datadir</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Startup time</translation>
</message>
@@ -1478,8 +1046,16 @@
<translation>Current number of blocks</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>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</translation>
+ <source>Memory Pool</source>
+ <translation>Memory Pool</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Current number of transactions</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Memory usage</translation>
</message>
<message>
<source>Received</source>
@@ -1530,6 +1106,18 @@
<translation>User Agent</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Decrease font size</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Increase font size</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Services</translation>
</message>
@@ -1598,10 +1186,6 @@
<translation>Out:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Build date</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Debug log file</translation>
</message>
@@ -1638,8 +1222,8 @@
<translation>&amp;Unban Node</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Welcome to the Bitcoin Core RPC console.</translation>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Welcome to the %1 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>
@@ -1768,18 +1352,6 @@
<source>Remove</source>
<translation>Remove</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copy label</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copy message</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copy amount</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1799,73 +1371,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Save Image...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Request payment to %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Payment information</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Amount</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Message</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Resulting URI too long, try to reduce the text for label / message.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Error encoding URI into QR Code.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Message</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Amount</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(no label)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(no message)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(no amount)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1986,14 +1491,6 @@
<translation>fast</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <translation>Send as zero-fee transaction if possible</translation>
- </message>
- <message>
- <source>(confirmation may take longer)</source>
- <translation>(confirmation may take longer)</translation>
- </message>
- <message>
<source>Send to multiple recipients at once</source>
<translation>Send to multiple recipients at once</translation>
</message>
@@ -2025,118 +1522,6 @@
<source>S&amp;end</source>
<translation>S&amp;end</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirm send coins</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 to %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copy quantity</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copy amount</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copy fee</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copy after fee</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copy bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copy priority</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copy change</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>Total Amount %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>or</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>The amount to pay must be larger than 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>The amount exceeds your balance.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>The total exceeds your balance when the %1 transaction fee is included.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Transaction creation failed!</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>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>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>A fee higher than %1 is considered an absurdly high fee.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Payment request expired.</translation>
- </message>
- <message>
- <source>Pay only the required fee of %1</source>
- <translation>Pay only the required fee of %1</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>Estimated to begin confirmation within %n block.</numerusform><numerusform>Estimated to begin confirmation within %n blocks.</numerusform></translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>The recipient address is not valid. Please recheck.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation>Duplicate address found: addresses should only be used once each.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Warning: Invalid Bitcoin address</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(no label)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Warning: Unknown change address</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copy dust</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Are you sure you want to send?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>added as transaction fee</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2149,10 +1534,6 @@
<translation>Pay &amp;To:</translation>
</message>
<message>
- <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>
<source>&amp;Label:</source>
<translation>&amp;Label:</translation>
</message>
@@ -2224,8 +1605,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core is shutting down...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 is shutting down...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2318,70 +1699,10 @@
<source>Reset all verify message fields</source>
<translation>Reset all verify message fields</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Click "Sign Message" to generate signature</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>The entered address is invalid.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Please check the address and try again.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>The entered address does not refer to a key.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Wallet unlock was cancelled.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Private key for the entered address is not available.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Message signing failed.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Message signed.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>The signature could not be decoded.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Please check the signature and try again.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>The signature did not match the message digest.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Message verification failed.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Message verified.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>The Bitcoin Core developers</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2394,422 +1715,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Open until %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>conflicted</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/unconfirmed</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmations</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, broadcast through %n node</numerusform><numerusform>, broadcast through %n nodes</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Source</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generated</translation>
- </message>
- <message>
- <source>From</source>
- <translation>From</translation>
- </message>
- <message>
- <source>To</source>
- <translation>To</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>own address</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>watch-only</translation>
- </message>
- <message>
- <source>label</source>
- <translation>label</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Credit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>matures in %n more block</numerusform><numerusform>matures in %n more blocks</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>not accepted</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>Transaction fee</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Net amount</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Message</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comment</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transaction ID</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Merchant</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>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.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Debug information</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transaction</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Inputs</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Amount</translation>
- </message>
- <message>
- <source>true</source>
- <translation>true</translation>
- </message>
- <message>
- <source>false</source>
- <translation>false</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, has not been successfully broadcast yet</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Open for %n more block</numerusform><numerusform>Open for %n more blocks</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>unknown</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transaction details</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>This pane shows a detailed description of the transaction</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Type</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>Immature (%1 confirmations, will be available after %2)</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Open for %n more block</numerusform><numerusform>Open for %n more blocks</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Open until %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmed (%1 confirmations)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>This block was not received by any other nodes and will probably not be accepted!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generated but not accepted</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Unconfirmed</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Confirming (%1 of %2 recommended confirmations)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Conflicted</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Received with</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Received from</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Sent to</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Payment to yourself</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Mined</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>watch-only</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <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>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Date and time that the transaction was received.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Type of transaction.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Whether or not a watch-only address is involved in this transaction.</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation>User-defined intent/purpose of the transaction.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Amount removed from or added to balance.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>All</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Today</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>This week</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>This month</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Last month</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>This year</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Range...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Received with</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Sent to</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>To yourself</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Mined</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Other</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Enter address or label to search</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Min amount</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copy address</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copy label</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copy amount</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copy transaction ID</translation>
- </message>
- <message>
- <source>Copy raw transaction</source>
- <translation>Copy raw transaction</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Edit label</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Show transaction details</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Export Transaction History</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Watch-only</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exporting Failed</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>There was an error trying to save the transaction history to %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exporting Successful</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>The transaction history was successfully saved to %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmed</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Type</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Range:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>to</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2817,55 +1729,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>No wallet has been loaded.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Send Coins</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Export</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Export the data in the current tab to a file</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Backup Wallet</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Wallet Data (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Backup Failed</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>There was an error trying to save the wallet data to %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>The wallet data was successfully saved to %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Backup Successful</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2892,14 +1755,6 @@
<translation>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</translation>
</message>
<message>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
- <translation>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</translation>
- </message>
- <message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
- <translation>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</translation>
- </message>
- <message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation>Prune configured below the minimum of %d MiB. Please use a higher number.</translation>
</message>
@@ -2940,10 +1795,34 @@
<translation>Accept connections from outside (default: 1 if no -proxy or -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>The %s developers</source>
+ <translation>The %s developers</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</translation>
+ </message>
+ <message>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</translation>
+ </message>
+ <message>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</translation>
+ </message>
+ <message>
<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>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>Cannot obtain a lock on data directory %s. %s is probably already running.</translation>
+ </message>
+ <message>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</translation>
</message>
@@ -2952,10 +1831,38 @@
<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>Error loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>Error loading %s: You can't enable HD on a already existing non-HD wallet</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</translation>
+ </message>
+ <message>
<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>
<message>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</translation>
+ </message>
+ <message>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</translation>
+ </message>
+ <message>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>Please contribute if you find %s useful. Visit %s for further information about the software.</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>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</translation>
</message>
@@ -2968,22 +1875,14 @@
<translation>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</translation>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
+ <translation>Unable to rewind the database to a pre-fork state. You will need to re-download the blockchain</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</translation>
</message>
@@ -2992,14 +1891,18 @@
<translation>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</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>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.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</translation>
</message>
<message>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>You need to rebuild the database using -reindex-chainstate to change -txindex</translation>
+ </message>
+ <message>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s corrupt, salvage failed</translation>
+ </message>
+ <message>
<source>-maxmempool must be at least %d MB</source>
<translation>-maxmempool must be at least %d MB</translation>
</message>
@@ -3008,10 +1911,26 @@
<translation>&lt;category&gt; can be:</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>Append comment to the user agent string</translation>
+ </message>
+ <message>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Attempt to recover private keys from a corrupt wallet on startup</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Block creation options:</translation>
</message>
<message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>Cannot resolve -%s address: '%s'</translation>
+ </message>
+ <message>
+ <source>Change index out of range</source>
+ <translation>Change index out of range</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>Connect only to the specified node(s)</translation>
</message>
@@ -3020,6 +1939,10 @@
<translation>Connection options:</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Copyright (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>Corrupted block database detected</translation>
</message>
@@ -3052,6 +1975,10 @@
<translation>Enable publish raw transaction in &lt;address&gt;</translation>
</message>
<message>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>Enable transaction replacement in the memory pool (default: %u)</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Error initialising block database</translation>
</message>
@@ -3060,6 +1987,22 @@
<translation>Error initialising wallet database environment %s!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>Error loading %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Error loading %s: Wallet corrupted</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Error loading %s: Wallet requires newer version of %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: You can't disable HD on a already existing HD wallet</source>
+ <translation>Error loading %s: You can't disable HD on a already existing HD wallet</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>Error loading block database</translation>
</message>
@@ -3084,14 +2027,38 @@
<translation>Incorrect or no genesis block found. Wrong datadir for network?</translation>
</message>
<message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>Initialisation sanity check failed. %s is shutting down.</translation>
+ </message>
+ <message>
<source>Invalid -onion address: '%s'</source>
<translation>Invalid -onion address: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Invalid amount for -%s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
<translation>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</translation>
</message>
<message>
+ <source>Loading banlist...</source>
+ <translation>Loading banlist...</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Location of the auth cookie (default: data dir)</translation>
+ </message>
+ <message>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Minimum bytes per sigop in transactions we relay and mine (default: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>Not enough file descriptors available.</translation>
</message>
@@ -3100,6 +2067,14 @@
<translation>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</translation>
</message>
<message>
+ <source>Print this help message and exit</source>
+ <translation>Print this help message and exit</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>Print version and exit</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>Prune cannot be configured with a negative value.</translation>
</message>
@@ -3108,10 +2083,26 @@
<translation>Prune mode is incompatible with -txindex.</translation>
</message>
<message>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>Rebuild chain state and block index from the blk*.dat files on disk</translation>
+ </message>
+ <message>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>Rebuild chain state from the currently indexed blocks</translation>
+ </message>
+ <message>
+ <source>Rewinding blocks...</source>
+ <translation>Rewinding blocks...</translation>
+ </message>
+ <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Set database cache size in megabytes (%d to %d, default: %d)</translation>
</message>
<message>
+ <source>Set maximum block cost (default: %d)</source>
+ <translation>Set maximum block cost (default: %d)</translation>
+ </message>
+ <message>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>Set maximum block size in bytes (default: %d)</translation>
</message>
@@ -3120,6 +2111,14 @@
<translation>Specify wallet file (within data directory)</translation>
</message>
<message>
+ <source>The source code is available from %s.</source>
+ <translation>The source code is available from %s.</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>Unable to bind to %s on this computer. %s is probably already running.</translation>
+ </message>
+ <message>
<source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Unsupported argument -benchmark ignored, use -debug=bench.</translation>
</message>
@@ -3152,16 +2151,16 @@
<translation>Wallet %s resides outside data directory %s</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>Wallet options:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Wallet debugging/testing options:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Warning: This version is obsolete; upgrade required!</translation>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>Wallet needed to be rewritten: restart %s to complete</translation>
</message>
<message>
- <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>
+ <source>Wallet options:</source>
+ <translation>Wallet options:</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>
@@ -3176,10 +2175,6 @@
<translation>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)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</translation>
</message>
@@ -3224,10 +2219,6 @@
<translation>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</translation>
</message>
<message>
- <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
- <translation>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation>The transaction amount is too small to send after the fee has been deducted</translation>
</message>
@@ -3236,6 +2227,10 @@
<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>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</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>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</translation>
</message>
@@ -3252,38 +2247,14 @@
<translation>Accept public REST requests (default: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Activating best chain...</translation>
- </message>
- <message>
- <source>Always relay transactions received from whitelisted peers (default: %d)</source>
- <translation>Always relay transactions received from whitelisted peers (default: %d)</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>Attempt to recover private keys from a corrupt wallet.dat on startup</translation>
- </message>
- <message>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation>Automatically create Tor hidden service (default: %d)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Cannot resolve -whitebind address: '%s'</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connect through 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>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</translation>
- </message>
- <message>
<source>Error reading from database, shutting down.</source>
<translation>Error reading from database, shutting down.</translation>
</message>
@@ -3296,22 +2267,6 @@
<translation>Information</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <translation>Initialisation sanity check failed. Bitcoin Core is shutting down.</translation>
- </message>
- <message>
- <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
- <translation>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</translation>
</message>
@@ -3336,14 +2291,6 @@
<translation>RPC server options:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>Rebuild block chain index from current blk000??.dat files on startup</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Receive and display P2P network alerts (default: %u)</translation>
- </message>
- <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation>Reducing -maxconnections from %d to %d, because of system limitations.</translation>
</message>
@@ -3416,14 +2363,14 @@
<translation>Username for JSON-RPC connections</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Wallet needed to be rewritten: restart Bitcoin Core to complete</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Warning</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Warning: unknown new rules activated (versionbit %i)</translation>
+ </message>
+ <message>
<source>Whether to operate in a blocks only mode (default: %u)</source>
<translation>Whether to operate in a blocks only mode (default: %u)</translation>
</message>
@@ -3436,10 +2383,6 @@
<translation>ZeroMQ notification options:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrupt, salvage failed</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Password for JSON-RPC connections</translation>
</message>
@@ -3448,10 +2391,6 @@
<translation>Execute command when the best block changes (%s in cmd is replaced by block hash)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>This help message</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Allow DNS lookups for -addnode, -seednode and -connect</translation>
</message>
@@ -3460,10 +2399,6 @@
<translation>Loading addresses...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Error loading wallet.dat: Wallet corrupted</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>
@@ -3480,8 +2415,8 @@
<translation>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3500,6 +2435,10 @@
<translation>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Support filtering of blocks and transaction with bloom filters (default: %u)</translation>
+ </message>
+ <message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<translation>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</translation>
</message>
@@ -3512,24 +2451,32 @@
<translation>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</translation>
</message>
<message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(default: %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Always query for peer addresses via DNS lookup (default: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Error loading wallet.dat</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Generate coins (default: %u)</translation>
+ <source>(default: %s)</source>
+ <translation>(default: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Always query for peer addresses via DNS lookup (default: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3616,18 +2563,6 @@
<translation>Unknown network specified in -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Cannot resolve -bind address: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Cannot resolve -externalip address: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Insufficient funds</translation>
</message>
diff --git a/src/qt/locale/bitcoin_eo.ts b/src/qt/locale/bitcoin_eo.ts
index c17e477654..4471aeb72e 100644
--- a/src/qt/locale/bitcoin_eo.ts
+++ b/src/qt/locale/bitcoin_eo.ts
@@ -26,10 +26,6 @@
<translation>&amp;Fermi</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopii Adreson</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Forigi la elektitan adreson el la listo</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Forigi</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Elektu la alsendotan adreson</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Elektu la ricevontan adreson</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Elekti</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Sendaj adresoj</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Ricevaj adresoj</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Jen viaj Bitmon-adresoj por sendi pagojn. Zorge kontrolu la sumon kaj la alsendan adreson antaÅ­ ol sendi.</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>Jen viaj bitmonaj adresoj por ricevi pagojn. Estas konsilinde uzi apartan ricevan adreson por ĉiu transakcio.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopii &amp;Etikedon</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Redakti</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Eksporti Adresliston</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Perkome disigita dosiero (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ekspotado malsukcesinta</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Okazis eraron dum konservo de adreslisto al %1. Bonvolu provi denove.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etikedo</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreso</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(neniu etikedo)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,82 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Ripetu la novan pasfrazon</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Ĉifri la monujon</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ĉi tiu operacio bezonas vian monujan pasfrazon, por malÅlosi la monujon.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>MalÅlosi la monujon</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ĉi tiu operacio bezonas vian monujan pasfrazon, por malĉifri la monujon.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Malĉifri la monujon</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Ŝanĝi la pasfrazon</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Konfirmo de ĉifrado de la monujo</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>Atentu! Se vi ĉifras vian monujon kaj perdas la pasfrazon, vi &lt;b&gt;PERDOS LA TUTON DE VIA BITMONO&lt;b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Ĉu vi certas, ke vi volas ĉifri la monujon?</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>GRAVE: antaŭaj sekur-kopioj de via monujo-dosiero estas forigindaj kiam vi havas nove kreitan ĉifritan monujo-dosieron. Pro sekureco, antaŭaj kopioj de la neĉifrita dosiero ne plu funkcios tuj kiam vi ekuzos la novan ĉifritan dosieron.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Atentu: la majuskla baskulo estas ŝaltita!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>La monujo estas ĉifrita</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>CÌ‚ifrado de la monujo fiaskis</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Ĉifrado de monujo fiaskis pro interna eraro. Via monujo ne estas ĉifrita.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>La pasfrazoj entajpitaj ne samas.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Malŝloso de la monujo fiaskis</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La pasfrazo enigita por ĉifrado de monujo ne ĝustas.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Malĉifrado de la monujo fiaskis</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Vi sukcese ŝanĝis la pasfrazon de la monujo.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -286,14 +139,6 @@
<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>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindeksado de blokoj sur disko...</translation>
</message>
@@ -338,10 +183,6 @@
<translation>&amp;Ricevi</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Vidigi informon pri Bitmona Kerno</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Montri / Kaŝi</translation>
</message>
@@ -378,18 +219,10 @@
<translation>Langeto-breto</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Kerno de Bitmono</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Peti pagon (kreas QR-kodojn kaj URI-ojn kun prefikso bitcoin:)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Pri la Bitmona Kerno</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Vidigi la liston de uzitaj sendaj adresoj kaj etikedoj</translation>
</message>
@@ -409,10 +242,26 @@
<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>
</message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation><numerusform>%n jaro</numerusform><numerusform>%n jaroj</numerusform></translation>
+ </message>
<message>
<source>%1 behind</source>
<translation>mankas %1</translation>
@@ -446,6 +295,36 @@
<translation>Äœisdatigante...</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation>Dato: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation>Sumo: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation>Tipo: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Etikedo: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Adreso: %1
+</translation>
+ </message>
+ <message>
<source>Sent transaction</source>
<translation>Sendita transakcio</translation>
</message>
@@ -463,13 +342,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Reta Averto</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -543,134 +415,6 @@
<source>Priority</source>
<translation>Prioritato</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopii adreson</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopii etikedon</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopii sumon</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopii transakcian ID-on</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Åœlosi la neelspezitajn</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>MalÅlosi la neelspezitajn</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopii kvanton</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopii krompagon</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopii post krompago</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopii bajtojn</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopii prioritaton</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopii polvon</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopii restmonon</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>plej alta</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>pli alta</translation>
- </message>
- <message>
- <source>high</source>
- <translation>alta</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>mezalta</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>meza</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>mezmalalta</translation>
- </message>
- <message>
- <source>low</source>
- <translation>malalta</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>pli malalta</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>plej malalta</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 Ålosita)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>neniu</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>jes</translation>
- </message>
- <message>
- <source>no</source>
- <translation>ne</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Povas varii po +/- 1 bajton por ĉiu enigo.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transakcioj kun pli alta prioritato havas pli altan Åancon inkluziviÄi en bloko.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(neniu etikedo)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>restmono de %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(restmono)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -694,38 +438,6 @@
<source>&amp;Address</source>
<translation>&amp;Adreso</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nova adreso por ricevi</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nova adreso por sendi</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Redakti adreson por ricevi</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Redakti adreson por sendi</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>La adreso enigita "%1" jam ekzistas en la adresaro.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>La adreso enigita "%1" ne estas valida Bitmon-adreso.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ne eblis malÅlosi monujon.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Fiaskis kreo de nova ŝlosilo.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -753,18 +465,10 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Kerno de Bitmono</translation>
- </message>
- <message>
<source>version</source>
<translation>versio</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Pri la Bitmona Kerno</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Komandliniaj agordaĵoj</translation>
</message>
@@ -776,7 +480,11 @@
<source>command-line options</source>
<translation>komandliniaj agordaĵoj</translation>
</message>
-</context>
+ <message>
+ <source>UI Options:</source>
+ <translation>Uzantinterfaco ebloj:</translation>
+ </message>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -784,18 +492,6 @@
<translation>Bonvenon</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Bonvenon al la bitmona kerno, Bitcoin Core.</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>Dum tiu ĉi unua uzo de la programo, vi povas elekti lokon, kie Bitcoin Core stokos siajn datumojn.</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 elÅutos kaj konservos kopion de la bitmona blokĉeno. AlmenaÅ­ %1GB da datumoj konserviÄos en tiu loko, kaj tio poiome kreskos. AnkaÅ­ via monujo konserviÄos en tiu dosierujo.</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>Uzi la defaŭltan dosierujon por datumoj</translation>
</message>
@@ -804,13 +500,13 @@
<translation>Uzi alian dosierujon por datumoj:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Kerno de Bitmono</translation>
- </message>
- <message>
<source>Error</source>
<translation>Eraro</translation>
</message>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n gigabajto de libera loko disponeble</numerusform><numerusform>%n gigabajtoj de libera loko disponebla.</numerusform></translation>
+ </message>
</context>
<context>
<name>OpenURIDialog</name>
@@ -830,10 +526,6 @@
<source>Select payment request file</source>
<translation>Elektu la dosieron de la pagpeto</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Elektu la malfermotan dosieron de la pagpeto</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -854,6 +546,14 @@
<translation>MB</translation>
</message>
<message>
+ <source>Accept connections from outside</source>
+ <translation>Akcepti konektojn el ekstere</translation>
+ </message>
+ <message>
+ <source>Allow incoming connections</source>
+ <translation>Permesi envenantajn konektojn</translation>
+ </message>
+ <message>
<source>Reset all client options to default.</source>
<translation>Reagordi ĉion al defaŭlataj valoroj.</translation>
</message>
@@ -866,6 +566,10 @@
<translation>&amp;Reto</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>Monujo</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation>Fakulo</translation>
</message>
@@ -890,6 +594,14 @@
<translation>la pordo de la prokurilo (ekz. 9050)</translation>
</message>
<message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Fenestro</translation>
</message>
@@ -977,6 +689,10 @@
<translation>Minita saldo, kiu ankoraŭ ne maturiĝis</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>Saldoj</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>Totalo:</translation>
</message>
@@ -984,52 +700,21 @@
<source>Your current total balance</source>
<translation>via aktuala totala saldo</translation>
</message>
- </context>
-<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Traktado de URI-oj</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Nevalida pagadreso %1</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>La petita pagosumo de %1 estas tro malgranda (konsiderata kiel polvo).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Eraro dum pagopeto</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Ne eblas lanĉi la ilon 'klaki-por-pagi'</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>Repago de %1</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>Eraro dum komunikado kun %1: %2</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Malbona respondo de la servilo %1</translation>
- </message>
<message>
- <source>Payment acknowledged</source>
- <translation>Pago agnoskita</translation>
+ <source>Spendable:</source>
+ <translation>Elspezebla:</translation>
</message>
<message>
- <source>Network request error</source>
- <translation>Eraro dum ret-peto</translation>
+ <source>Recent transactions</source>
+ <translation>Lastaj transakcioj</translation>
</message>
-</context>
+ </context>
<context>
<name>PeerTableModel</name>
+ <message>
+ <source>User Agent</source>
+ <translation>Uzanto Agento</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -1046,36 +731,17 @@
<translation>%1 m</translation>
</message>
<message>
+ <source>None</source>
+ <translation>Neniu</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation>neaplikebla</translation>
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Konservi Bildon...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopii Bildon</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Konservi QR-kodon</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG-bildo (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nomo de kliento</translation>
- </message>
- <message>
<source>N/A</source>
<translation>neaplikebla</translation>
</message>
@@ -1096,10 +762,6 @@
<translation>Äœenerala</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>uzas OpenSSL-version</translation>
- </message>
- <message>
<source>Startup time</source>
<translation>Horo de lanĉo</translation>
</message>
@@ -1124,6 +786,34 @@
<translation>Aktuala nombro de blokoj</translation>
</message>
<message>
+ <source>Received</source>
+ <translation>Ricevita</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>Sendita</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation>&amp;Samuloj</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation>Malpermesita samuloj.</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>Versio</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation>Uzanto Agento</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Servoj</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Horo de la lasta bloko</translation>
</message>
@@ -1156,10 +846,6 @@
<translation>El:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Dato de kompilado</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Sencimiga protokoldosiero</translation>
</message>
@@ -1234,18 +920,6 @@
<source>Remove</source>
<translation>Forigi</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopii etikedon</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopiu mesaÄon</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopii sumon</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1265,71 +939,8 @@
<source>&amp;Save Image...</source>
<translation>&amp;Konservi Bildon...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Peti pagon al %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Paginformoj</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreso</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Sumo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etikedo</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaĝo</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>La rezultanta URI estas tro longa. Provu malplilongigi la tekston de la etikedo / mesaĝo.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Eraro de kodigo de URI en la QR-kodon.</translation>
- </message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etikedo</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaĝo</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Sumo</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(neniu etikedo)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(neniu mesaÄo)</translation>
- </message>
- </context>
-<context>
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
@@ -1376,6 +987,10 @@
<translation>Restmono:</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Krompago:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Sendi samtempe al pluraj ricevantoj</translation>
</message>
@@ -1407,82 +1022,6 @@
<source>S&amp;end</source>
<translation>Åœendi</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Konfirmi sendon de bitmono</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 al %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopii kvanton</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopii sumon</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopii krompagon</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopii post krompago</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopii bajtojn</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopii prioritaton</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopii restmonon</translation>
- </message>
- <message>
- <source>or</source>
- <translation>aÅ­</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>La sumo estas pli granda ol via saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>La sumo kun la %1 krompago estas pli granda ol via saldo.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Kreo de transakcio fiaskis!</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Averto: Nevalida Bitmon-adreso</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(neniu etikedo)</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopii polvon</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Ĉu vi certas, ke vi volas sendi?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>aldonita kiel krompago</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1495,10 +1034,6 @@
<translation>&amp;Ricevonto:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Tajpu etikedon por tiu ĉi adreso kaj aldonu ĝin al via adresaro</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etikedo:</translation>
</message>
@@ -1620,70 +1155,10 @@
<source>Reset all verify message fields</source>
<translation>Reagordigi ĉiujn prikontrolajn kampojn</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Klaku "Subskribi Mesaĝon" por krei subskribon</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>La adreso, kiun vi enmetis, estas nevalida.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Bonvolu kontroli la adreson kaj reprovi.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>La adreso, kiun vi enmetis, referencas neniun ŝlosilon.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>MalÅloso de monujo estas nuligita.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>La privata ŝlosilo por la enigita adreso ne disponeblas.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Subskribo de mesaĝo fiaskis.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mesaĝo estas subskribita.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Ne eblis malĉifri la subskribon.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Bonvolu kontroli la subskribon kaj reprovu.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>La subskribo ne kongruis kun la mesaĝ-kompilaĵo.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Kontrolo de mesaĝo malsukcesis.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mesaĝo sukcese kontrolita.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Kerno de Bitmono</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>La programistoj de Bitmona Kerno</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1696,382 +1171,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Malferma ĝis %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/senkonekte</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/nekonfirmite</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 konfirmoj</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Stato</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Fonto</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Kreita</translation>
- </message>
- <message>
- <source>From</source>
- <translation>De</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Al</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>propra adreso</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etikedo</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Kredito</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>ne akceptita</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debeto</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Krompago</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Neta sumo</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaĝo</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Komento</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transakcia ID</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Vendisto</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>Kreitaj moneroj devas esti maturaj je %1 blokoj antaÅ­ ol eblas elspezi ilin. Kiam vi generis tiun ĉi blokon, Äi estis elsendita al la reto por aldono al la blokĉeno. Se tiu aldono malsukcesas, Äia stato ÅanÄiÄos al "neakceptita" kaj ne eblos elspezi Äin. Tio estas malofta, sed povas okazi se alia bloko estas kreita je preskaÅ­ la sama momento kiel la via.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Sencimigaj informoj</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transakcio</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Enigoj</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Sumo</translation>
- </message>
- <message>
- <source>true</source>
- <translation>vera</translation>
- </message>
- <message>
- <source>false</source>
- <translation>malvera</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ankoraÅ­ ne elsendita sukcese</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>nekonata</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transakciaj detaloj</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Tiu ĉi panelo montras detalan priskribon de la transakcio</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Malferma ĝis %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Konfirmita (%1 konfirmoj)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Tiun ĉi blokon ne ricevis ajna alia nodo, kaj ĝi verŝajne ne akceptiĝos!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Kreita sed ne akceptita</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Senkonekte</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etikedo</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Nekonfirmita</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ricevita kun</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Ricevita de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Sendita al</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pago al vi mem</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minita</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>neaplikebla</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Transakcia stato. Ŝvebi super tiu ĉi kampo por montri la nombron de konfirmoj.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Dato kaj horo kiam la transakcio alvenis.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipo de transakcio.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Sumo elprenita de aŭ aldonita al la saldo.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Ĉiuj</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>HodiaÅ­</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>CÌ‚i-semajne</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>CÌ‚i-monate</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Pasintmonate</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>CÌ‚i-jare</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Intervalo...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ricevita kun</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Sendita al</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Al vi mem</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minita</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Aliaj</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Tajpu adreson aŭ etikedon por serĉi</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimuma sumo</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopii adreson</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopii etikedon</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopii sumon</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopii transakcian ID-on</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Redakti etikedon</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>Konfirmita</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etikedo</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adreso</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Intervalo:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>al</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Sendi Bitmonon</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Eksporti</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Eksporti la datumojn el la aktuala langeto al dosiero</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Krei sekurkopion de monujo</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Monuj-datumoj (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Malsukcesis sekurkopio</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Sukcesis krei sekurkopion</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2102,6 +1211,10 @@
<translation>Akcepti konektojn el ekstere (defaŭlte: 1 se ne estas -proxy nek -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Kerno de Bitmono</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>
@@ -2122,10 +1235,6 @@
<translation>Averto: Åajne ni ne tute konsentas kun niaj samtavolanoj! Eble vi devas Äisdatigi vian klienton, aÅ­ eble aliaj nodoj faru same.</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>Averto: via wallet.dat estas difektita, sed la datumoj sukcese saviĝis! La originala wallet.dat estas nun konservita kiel wallet.{timestamp}.bak en %s; se via saldo aŭ transakcioj estas malĝustaj vi devus restaŭri per alia sekurkopio.</translation>
- </message>
- <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;category&gt; povas esti:</translation>
</message>
@@ -2202,10 +1311,6 @@
<translation>Monujaj opcioj:</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Vi devas rekontrui la datumbazon kun -reindex por ŝanĝi -txindex</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>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>
@@ -2214,14 +1319,6 @@
<translation>Informoj</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nevalida sumo por -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nevalida sumo por -mintxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Sendi spurajn/sencimigajn informojn al la konzolo anstataŭ al dosiero debug.log</translation>
</message>
@@ -2258,10 +1355,6 @@
<translation>Averto</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat estas difektita, riparo malsukcesis</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Pasvorto por konektoj JSON-RPC</translation>
</message>
@@ -2270,10 +1363,6 @@
<translation>Plenumi komandon kiam plej bona bloko ŝanĝiĝas (%s en cmd anstataŭiĝas per bloka haketaĵo)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Tiu ĉi helpmesaĝo</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permesi DNS-elserĉojn por -addnote, -seednote kaj -connect</translation>
</message>
@@ -2282,14 +1371,6 @@
<translation>ÅœarÄante adresojn...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Eraro dum ŝargado de wallet.dat: monujo difektita</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Eraro dum ŝargado de wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Nevalid adreso -proxy: '%s'</translation>
</message>
@@ -2298,18 +1379,6 @@
<translation>Nekonata reto specifita en -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Ne eblas trovi la adreson -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Ne eblas trovi la adreson -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nevalida sumo por -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nesufiĉa mono</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts
index bb7fcb1095..c67016637b 100644
--- a/src/qt/locale/bitcoin_es.ts
+++ b/src/qt/locale/bitcoin_es.ts
@@ -23,11 +23,7 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation>&amp;Cerrar</translation>
- </message>
- <message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiar dirección</translation>
+ <translation>C&amp;errar</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -45,69 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Eliminar</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Elija la dirección para enviar monedas a</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Elija la dirección para recibir monedas con</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Escoger</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Direcciones de envío</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Direcciones de recepción</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>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 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>
- <translation>Copiar &amp;Etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editar</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportar la lista de direcciones </translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivos separados por coma (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Fallo al exportar</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -127,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Repita la nueva contraseña</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Cifrar el monedero</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operación requiere su contraseña para desbloquear el monedero.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquear monedero</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operación requiere su contraseña para descifrar el monedero.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Descifrar el monedero</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambiar contraseña</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmar cifrado del monedero</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation>Atencion: ¡Si cifra su monedero y pierde la contraseña perderá &lt;b&gt;TODOS SUS BITCOINS&lt;/b&gt;!"</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <translation>IMPORTANTE: Cualquier copia de seguridad que haya realizado previamente de su archivo de monedero debe reemplazarse con el nuevo archivo de monedero cifrado. Por razones de seguridad, las copias de seguridad previas del archivo de monedero no cifradas serán inservibles en cuanto comience a usar el nuevo monedero cifrado.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Aviso: ¡La tecla de Mayúsculas está activada!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Monedero cifrado</translation>
- </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>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>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>
- <translation>Ha fallado el cifrado del monedero</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Ha fallado el cifrado del monedero debido a un error interno. El monedero no ha sido cifrado.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Las contraseñas no coinciden.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Ha fallado el desbloqueo del monedero</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contraseña introducida para descifrar el monedero es incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Ha fallado el descifrado del monedero</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Se ha cambiado correctamente la contraseña del monedero.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -259,13 +104,21 @@
</message>
<message>
<source>E&amp;xit</source>
- <translation>&amp;Salir</translation>
+ <translation>S&amp;alir</translation>
</message>
<message>
<source>Quit application</source>
<translation>Salir de la aplicación</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Acerca de %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Mostrar información acerca de %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Acerca de &amp;Qt</translation>
</message>
@@ -278,6 +131,10 @@
<translation>&amp;Opciones...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Modificar las opciones de configuración para %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>&amp;Cifrar monedero…</translation>
</message>
@@ -302,14 +159,6 @@
<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>Importando bloques de disco...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindexando bloques en disco...</translation>
</message>
@@ -354,10 +203,6 @@
<translation>&amp;Recibir</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Mostrar información acerca de Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Mostrar / Ocultar</translation>
</message>
@@ -394,22 +239,10 @@
<translation>Barra de pestañas</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Solicitar pagos (generando códigos QR e identificadores URI "bitcoin:")</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Acerca de Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Modificar las opciones de configuración de Bitcoin</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Mostrar la lista de direcciones de envío y etiquetas</translation>
</message>
@@ -425,15 +258,19 @@
<source>&amp;Command-line options</source>
<translation>&amp;Opciones de consola de comandos</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Mostrar el mensaje de ayuda de Bitcoin Core con una lista de las posibles opciones de la consola de comandos de Bitcoin</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>
+ <source>Indexing blocks on disk...</source>
+ <translation>Indexando bloques en disco...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Procesando bloques en disco...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Ninguna fuente de bloques disponible ...</translation>
</message>
@@ -490,6 +327,14 @@
<translation>Actualizado</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Mostrar el mensaje de ayuda %1 para obtener una lista de los posibles comandos de linea de comandos de Bitcoin</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 cliente</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Actualizando...</translation>
</message>
@@ -541,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta de red</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -625,150 +463,6 @@
<source>Priority</source>
<translation>Prioridad</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cuantía</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar identificador de transacción</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloquear lo no gastado</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Desbloquear lo no gastado</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar comisión</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiar después de aplicar comisión</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridad</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copiar polvo</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar cambio</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>lo más alto</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>más alto</translation>
- </message>
- <message>
- <source>high</source>
- <translation>alto</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medio-alto</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>medio</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>bajo-medio</translation>
- </message>
- <message>
- <source>low</source>
- <translation>bajo</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>más bajo</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>lo más bajo</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloqueado)</translation>
- </message>
- <message>
- <source>none</source>
- <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>This label turns red if any recipient receives an amount smaller than %1.</source>
- <translation>Esta etiqueta se vuelve roja si el cambio es menor que %1</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Puede variar en +/- %1 satoshi(s) por entrada.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>si</translation>
- </message>
- <message>
- <source>no</source>
- <translation>no</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Puede variar en +/- 1 byte por entrada.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Las transacciones con mayor prioridad tienen mayor probabilidad de ser incluidas en un bloque.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>Cambio desde %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(cambio)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -792,38 +486,6 @@
<source>&amp;Address</source>
<translation>&amp;Dirección</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nueva dirección de recepción</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nueva dirección de envío</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editar dirección de recepción</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editar dirección de envío</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>La dirección introducida "%1" ya está presente en la libreta de direcciones.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>La dirección introducida "%1" no es una dirección Bitcoin válida.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>No se pudo desbloquear el monedero.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ha fallado la generación de la nueva clave.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -851,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>versión</translation>
</message>
@@ -863,8 +521,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Acerca de Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>Acerda de %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -878,6 +536,30 @@
<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>Choose data directory on startup (default: %u)</source>
+ <translation>Elegir directorio de datos al iniciar (predeterminado: %u)</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>Reset all settings changed in the GUI</source>
+ <translation>Reiniciar todos los ajustes modificados en el GUI</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -886,16 +568,16 @@
<translation>Bienvenido</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Bienvenido a Bitcoin Core</translation>
+ <source>Welcome to %1.</source>
+ <translation>Bienvenido a %1</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>Al ser la primera vez que se ejecuta el programa, puede elegir dónde almacenará sus datos Bitcoin Core.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Al ser la primera vez que se ejecuta el programa, puede elegir donde %1 almacenara sus datos</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 va a descargar y guardar una copia de la cadena de bloques de Bitcoin. Se almacenará al menos %1GB de datos en este directorio, que irá creciendo con el tiempo. El monedero se guardará también en este directorio.</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 va a descargar y almacenar una copia de la cadena de bloques de Bitcoin. Al menos %2GB de datos seran almacenados en este directorio, que ira creciendo con el tiempo. El monedero se guardara tambien en ese directorio. </translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -906,10 +588,6 @@
<translation>Utilizar un directorio de datos personalizado:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Error: no ha podido crearse el directorio de datos especificado "%1".</translation>
</message>
@@ -944,10 +622,6 @@
<source>Select payment request file</source>
<translation>Seleccionar archivo de sulicitud de pago</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Seleccionar el archivo de solicitud de pago para abrir</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -960,6 +634,14 @@
<translation>&amp;Principal</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Iniciar automaticamente %1 al encender el sistema.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Iniciar %1 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>
@@ -988,10 +670,6 @@
<translation>Minimizar en lugar de salir de la aplicación cuando la ventana está cerrada. Cuando se activa esta opción, la aplicación sólo se cerrará después de seleccionar Salir en el menú.</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>El idioma de la interfaz de usuario puede establecerse aquí. Este ajuste se aplicará cuando se reinicie 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>Identificadores URL de terceros (por ejemplo, un explorador de bloques) que aparecen en la pestaña de transacciones como elementos del menú contextual. El %s en la URL es reemplazado por el valor hash de la transacción. Se pueden separar URL múltiples por una barra vertical |.</translation>
</message>
@@ -1016,14 +694,6 @@
<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>
@@ -1076,6 +746,14 @@
<translation>Puerto del servidor proxy (ej. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Usado para alcanzar compañeros via:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Muestra si el proxy SOCKS5 predeterminado es utilizado para llegar a los pares a traves de este tipo de red.</translation>
+ </message>
+ <message>
<source>IPv4</source>
<translation>IPv4</translation>
</message>
@@ -1088,10 +766,26 @@
<translation>Tor</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Conectar a la red Bitcoin mediante un proxy SOCKS5 por separado para los servicios ocultos de Tor.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Usar distintos proxys SOCKS5 para comunicarse vía Tor de forma anónima:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Ventana</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Ocultar el icono de la barra de tareas</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Ocultar barra de tareas</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Minimizar la ventana a la bandeja de iconos del sistema.</translation>
</message>
@@ -1112,6 +806,10 @@
<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 %1.</source>
+ <translation>El idioma de la interfaz de usuario puede establecerse aquí. Esta configuración tendrá efecto tras reiniciar %1.</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>Mostrar las cantidades en la &amp;unidad:</translation>
</message>
@@ -1236,97 +934,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Gestión de URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Dirección de pago no válida %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Solicitud de pago rechazada</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>La red de solicitud de pago no coincide con la red cliente</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>La solicitud de pago no está inicializada</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>La cantidad del pago solicitado (%1) es demasiado pequeña (considerada polvo).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Error en solicitud de pago</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>No se puede iniciar el gestor de identificadores "bitcoin:" de clic-para-pagar</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>La URL de obtención de la solicitud de pago es inválida: %1</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>¡No se puede leer el identificador URI! Esto puede deberse a una dirección Bitcoin inválida o a parámetros de la URI mal formados</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Procesado del archivo de solicitud de pago</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <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>Error communicating with %1: %2</source>
- <translation>Error en la comunicación con %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>¡No puede leerse la solicitud de pago!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Respuesta errónea del servidor %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pago aceptado</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Error en petición de red</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1381,31 +988,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>Guardar Imagen...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>Copiar imagen</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Guardar código QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Imágenes PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nombre del cliente</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/D</translation>
</message>
@@ -1426,14 +1010,14 @@
<translation>General</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Utilizando la versión de OpenSSL</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Utilizando la versión de BerkeleyDB</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Datadir</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Hora de inicio</translation>
</message>
@@ -1458,8 +1042,16 @@
<translation>Número actual de bloques</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>Abre el archivo de registro de depuración de Bitcoin desde el directorio de datos actual. Esto puede tardar unos segundos para ficheros de registro de gran tamaño.</translation>
+ <source>Memory Pool</source>
+ <translation>Piscina de Memoria</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Número actual de transacciones</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Uso de memoria</translation>
</message>
<message>
<source>Received</source>
@@ -1482,6 +1074,10 @@
<translation>Seleccionar un par para ver su información detallada.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>En la lista blanca</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Dirección</translation>
</message>
@@ -1506,6 +1102,18 @@
<translation>User Agent</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Abrir el archivo de depuración %1 desde el directorio de datos actual. Puede tardar unos segundos para ficheros de gran tamaño.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Disminuir tamaño de letra</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Aumentar tamaño de letra</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Servicios</translation>
</message>
@@ -1530,6 +1138,14 @@
<translation>Ping</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>La duración de un ping actualmente en proceso.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Espera de Ping</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Desplazamiento de tiempo</translation>
</message>
@@ -1566,10 +1182,6 @@
<translation>Saliente:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Fecha de compilación</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Archivo de registro de depuración</translation>
</message>
@@ -1582,6 +1194,10 @@
<translation>Nodo &amp;Desconectado</translation>
</message>
<message>
+ <source>Ban Node for</source>
+ <translation>Prohibir Nodo para</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation>1 &amp;hora</translation>
</message>
@@ -1598,8 +1214,12 @@
<translation>1 &amp;año</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Bienvenido a la consola RPC de Bitcoin Core.</translation>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Desbanear Nodo</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Bienvenido a la consola RPC %1.</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>
@@ -1728,18 +1348,6 @@
<source>Remove</source>
<translation>Eliminar</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Mensaje</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cuantía</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1759,73 +1367,6 @@
<source>&amp;Save Image...</source>
<translation>Guardar Imagen...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Solicitar pago a %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Información de pago</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidad</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaje</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI resultante demasiado larga. Intente reducir el texto de la etiqueta / mensaje.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Error al codificar la URI en el código QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaje</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidad</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(Ningun mensaje)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(sin cantidad)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1946,14 +1487,6 @@
<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>
- <message>
<source>Send to multiple recipients at once</source>
<translation>Enviar a múltiples destinatarios de una vez</translation>
</message>
@@ -1985,110 +1518,6 @@
<source>S&amp;end</source>
<translation>&amp;Enviar</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirmar el envío de bitcoins</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 a %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cuantía</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar donación</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiar después de aplicar donación</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridad</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar Cambio</translation>
- </message>
- <message>
- <source>or</source>
- <translation>o</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>La cantidad sobrepasa su saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>El total sobrepasa su saldo cuando se incluye la tasa de envío de %1</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>¡Ha fallado la creación de la transacción!</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 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>Payment request expired.</source>
- <translation>Solicitud de pago caducada.</translation>
- </message>
- <message>
- <source>Pay only the required fee of %1</source>
- <translation>Paga sólo la cuota mínima de %1</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>Estimado para empezar la confirmación dentro de %n bloque.</numerusform><numerusform>Estimado para empezar la confirmación dentro de %n bloques.</numerusform></translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>La dirección del destinatario no es válida. Por favor, compruébela de nuevo.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</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>Warning: Invalid Bitcoin address</source>
- <translation>Alerta: Dirección de Bitcoin inválida</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Alerta: Dirección de Bitcoin inválida</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copiar polvo</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>¿Está seguro que desea enviar?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>añadido como comisión de transacción</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2101,10 +1530,6 @@
<translation>&amp;Pagar a:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Etiquete esta dirección para añadirla a la libreta</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -2176,8 +1601,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core se está cerrando...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 se esta cerrando...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2270,70 +1695,10 @@
<source>Reset all verify message fields</source>
<translation>Vaciar todos los campos de la verificación de mensaje</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Haga clic en "Firmar mensaje" para generar la firma</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>La dirección introducida es inválida.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Verifique la dirección e inténtelo de nuevo.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>La dirección introducida no corresponde a una clave.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Se ha cancelado el desbloqueo del monedero. </translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>No se dispone de la clave privada para la dirección introducida.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Ha fallado la firma del mensaje.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mensaje firmado.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>No se puede decodificar la firma.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Compruebe la firma e inténtelo de nuevo.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>La firma no coincide con el resumen del mensaje.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>La verificación del mensaje ha fallado.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mensaje verificado.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Los desarrolladores de Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2346,675 +1711,433 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Abierto hasta %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>en conflicto</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/fuera de línea</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/no confirmado</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmaciones</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Estado</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, transmitir a través de %n nodo</numerusform><numerusform>, transmitir a través de %n nodos</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Fuente</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generado</translation>
- </message>
- <message>
- <source>From</source>
- <translation>De</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Para</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>dirección propia</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>de observación</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiqueta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Crédito</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>disponible en %n bloque más</numerusform><numerusform>disponible en %n bloques más</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>no aceptada</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Débito</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Débito total</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Crédito total</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Comisión de transacción</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Cantidad neta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaje</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentario</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Identificador de transacción</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Vendedor</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>Los bitcoins generados deben madurar %1 bloques antes de que puedan gastarse. Cuando generó este bloque, se transmitió a la red para que se añadiera a la cadena de bloques. Si no consigue entrar en la cadena, su estado cambiará a "no aceptado" y ya no se podrá gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del suyo.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Información de depuración</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transacción</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>entradas</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidad</translation>
- </message>
- <message>
- <source>true</source>
- <translation>verdadero</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falso</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, todavía no se ha sido difundido satisfactoriamente</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Abrir para %n bloque más</numerusform><numerusform>Abrir para %n bloques más</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconocido</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalles de transacción</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Esta ventana muestra información detallada sobre la transacción</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Abrir para %n bloque más</numerusform><numerusform>Abrir para %n bloques más</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Abierto hasta %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmado (%1 confirmaciones)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Este bloque no ha sido recibido por otros nodos y probablemente no sea aceptado!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generado pero no aceptado</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Sin conexión</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Sin confirmar</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Confirmando (%1 de %2 confirmaciones recomendadas)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>En conflicto</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Recibido con</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Recibidos de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pago propio</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado</translation>
- </message>
+ <name>UnitDisplayStatusBarControl</name>
<message>
- <source>watch-only</source>
- <translation>de observación</translation>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Unidad en la que se muestran las cantidades. Haga clic para seleccionar otra unidad.</translation>
</message>
+</context>
+<context>
+ <name>bitcoin-core</name>
<message>
- <source>(n/a)</source>
- <translation>(nd)</translation>
+ <source>Options:</source>
+ <translation>Opciones:
+</translation>
</message>
<message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Estado de transacción. Pasa el ratón sobre este campo para ver el número de confirmaciones.</translation>
+ <source>Specify data directory</source>
+ <translation>Especificar directorio para los datos</translation>
</message>
<message>
- <source>Date and time that the transaction was received.</source>
- <translation>Fecha y hora en que se recibió la transacción.</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Conectar a un nodo para obtener direcciones de pares y desconectar</translation>
</message>
<message>
- <source>Type of transaction.</source>
- <translation>Tipo de transacción.</translation>
+ <source>Specify your own public address</source>
+ <translation>Especifique su propia dirección pública</translation>
</message>
<message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Sea o no una dirección sólo está involucrada en esta transacción.</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Aceptar comandos consola y JSON-RPC
+</translation>
</message>
<message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation>intento/propósito de la transacción definido por el usuario.</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Si &lt;category&gt; no es proporcionado o si &lt;category&gt; =1, muestra toda la información de depuración.</translation>
</message>
<message>
- <source>Amount removed from or added to balance.</source>
- <translation>Cantidad retirada o añadida al saldo.</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>La Poda se ha configurado por debajo del minimo de %d MiB. Por favor utiliza un valor mas alto.</translation>
</message>
-</context>
-<context>
- <name>TransactionView</name>
<message>
- <source>All</source>
- <translation>Todo</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Poda: la ultima sincronizacion de la cartera sobrepasa los datos podados. Necesitas reindexar con -reindex (o descargar la cadena de bloques de nuevo en el caso de un nodo podado)</translation>
</message>
<message>
- <source>Today</source>
- <translation>Hoy</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>Reduce los requisitos de almacenaje podando (eliminando) los bloques viejos. Este modo es incompatible con -txindex y -rescan. Advertencia: Revertir este ajuste requiere volver a descargar la cadena de bloques al completo. (predeterminado: 0 = deshabilitar la poda de bloques, &gt;%u = objetivo de tamaño en MiB para usar para los archivos de bloques)</translation>
</message>
<message>
- <source>This week</source>
- <translation>Esta semana</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Nos es posible re-escanear en modo podado.Necesitas utilizar -reindex el cual descargara la cadena de bloques al completo de nuevo.</translation>
</message>
<message>
- <source>This month</source>
- <translation>Este mes</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Mes pasado</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Un error interno fatal ocurrió, ver debug.log para detalles</translation>
</message>
<message>
- <source>This year</source>
- <translation>Este año</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Comisión (en %s/KB) para agregar a las transacciones que envíe (por defecto: %s)</translation>
</message>
<message>
- <source>Range...</source>
- <translation>Rango...</translation>
+ <source>Pruning blockstore...</source>
+ <translation>Poda blockstore ...</translation>
</message>
<message>
- <source>Received with</source>
- <translation>Recibido con</translation>
+ <source>Run in the background as a daemon and accept commands</source>
+ <translation>Ejecutar en segundo plano como daemon y aceptar comandos
+</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Enviado a</translation>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>No se ha podido comenzar el servidor HTTP. Ver debug log para detalles.</translation>
</message>
<message>
- <source>To yourself</source>
- <translation>A usted mismo</translation>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <translation>Aceptar conexiones desde el exterior (predeterminado: 1 si no -proxy o -connect)</translation>
</message>
<message>
- <source>Mined</source>
- <translation>Minado</translation>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
</message>
<message>
- <source>Other</source>
- <translation>Otra</translation>
+ <source>The %s developers</source>
+ <translation>Los %s desarrolladores</translation>
</message>
<message>
- <source>Enter address or label to search</source>
- <translation>Introduzca una dirección o etiqueta que buscar</translation>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee tiene un ajuste muy alto! Esta es la comisión de transacción que pagarás cuando las estimaciones de comisiones no estén disponibles.</translation>
</message>
<message>
- <source>Min amount</source>
- <translation>Cantidad mínima</translation>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>Una comision (en %s/kB) que sera usada cuando las estimacion de comision no disponga de suficientes datos (predeterminado: %s)</translation>
</message>
<message>
- <source>Copy address</source>
- <translation>Copiar dirección</translation>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Aceptar transacciones retransmitidas recibidas desde nodos en la lista blanca incluso cuando no estés retransmitiendo transacciones (predeterminado: %d)</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
+ <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>Copy amount</source>
- <translation>Copiar cuantía</translation>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>No se puede bloquear el directorio %s. %s ya se está ejecutando.</translation>
</message>
<message>
- <source>Copy transaction ID</source>
- <translation>Copiar identificador de transacción</translation>
+ <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <translation>Borrar todas las transacciones del monedero y sólo recuperar aquellas partes de la cadena de bloques por medio de -rescan on startup.</translation>
</message>
<message>
- <source>Edit label</source>
- <translation>Editar etiqueta</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 bajo la licencia de software MIT, vea la copia del archivo adjunto o &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Show transaction details</source>
- <translation>Mostrar detalles de la transacción</translation>
+ <source>Error loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>Error cargando %s: No puede habilitar HD en un monedero existente que no es HD</translation>
</message>
<message>
- <source>Export Transaction History</source>
- <translation>Exportar historial de transacciones</translation>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>Error leyendo %s!. Todas las claves se han leido correctamente, pero los datos de transacciones o la libreta de direcciones pueden faltar o ser incorrectos.</translation>
</message>
<message>
- <source>Watch-only</source>
- <translation>De observación</translation>
+ <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>
<message>
- <source>Exporting Failed</source>
- <translation>Error exportando</translation>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Fuerza la retransmisión de transacciones desde nodos en la lista blanca incluso si violan la política de retransmisiones local (predeterminado: %d)</translation>
</message>
<message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Ha habido un error al intentar guardar la transacción con %1.</translation>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>Ajuste máximo permitido del tiempo offset medio de pares. La perspectiva local de tiempo se verá influenciada por los pares anteriores y posteriores a esta cantidad. (Por defecto: %u segundos)</translation>
</message>
<message>
- <source>Exporting Successful</source>
- <translation>Exportación finalizada</translation>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Máximas comisiones totales (en %s) para utilizar en una sola transacción de la cartera; establecer esto demasiado bajo puede abortar grandes transacciones (predeterminado: %s)</translation>
</message>
<message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>La transacción ha sido guardada en %1.</translation>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>Por favor, compruebe si la fecha y hora en su computadora son correctas! Si su reloj esta mal, %s no trabajara correctamente. </translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivos de columnas separadas por coma (*.csv)</translation>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>Contribuya si encuentra %s de utilidad. Visite %s para mas información acerca del programa.</translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>Confirmado</translation>
+ <source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
+ <translation>Establecer el número de hilos (threads) de verificación de scripts (entre %u y %d, 0 = automático, &lt;0 = dejar libres ese número de núcleos; predeterminado: %d)</translation>
</message>
<message>
- <source>Date</source>
- <translation>Fecha</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>La base de datos de bloques contiene un bloque que parece ser del futuro. Esto puede ser porque la fecha y hora de tu ordenador están mal ajustados. Reconstruye la base de datos de bloques solo si estas seguro de que la fecha y hora de tu ordenador estan ajustados correctamente.</translation>
</message>
<message>
- <source>Type</source>
- <translation>Tipo</translation>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation>Esta es una versión de pre-prueba - utilícela bajo su propio riesgo. No la utilice para usos comerciales o de minería.</translation>
</message>
<message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
+ <translation>No es posible reconstruir la base de datos a un estado anterior. Debe descargar de nuevo la cadena de bloques.</translation>
</message>
<message>
- <source>Address</source>
- <translation>Dirección</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Utiliza UPnP para asignar el puerto de escucha (predeterminado: 1 cuando esta escuchando sin -proxy)</translation>
</message>
<message>
- <source>ID</source>
- <translation>ID</translation>
+ <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
+ <translation>Atención: ¡Parece que la red no está totalmente de acuerdo! Algunos mineros están presentando inconvenientes.</translation>
</message>
<message>
- <source>Range:</source>
- <translation>Rango:</translation>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation>Atención: ¡Parece que no estamos completamente de acuerdo con nuestros pares! Podría necesitar una actualización, u otros nodos podrían necesitarla.</translation>
</message>
<message>
- <source>to</source>
- <translation>para</translation>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Poner en lista blanca a los equipos que se conecten desde la máscara de subred o dirección IP especificada. Se puede especificar múltiples veces.</translation>
</message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation>Unidad en la que se muestran las cantidades. Haga clic para seleccionar otra unidad.</translation>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>Necesita reconstruir la base de datos usando -reindex-chainstate para cambiar -txindex</translation>
</message>
-</context>
-<context>
- <name>WalletFrame</name>
<message>
- <source>No wallet has been loaded.</source>
- <translation>No se ha cargado ningún monedero</translation>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s corrupto. Fracasó la recuperacion</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>Enviar bitcoins</translation>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool debe ser por lo menos de %d MB</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Exportar</translation>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;category&gt; puede ser:</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>
+ <source>Append comment to the user agent string</source>
+ <translation>Adjunta un comentario a la linea de agente de usuario</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Copia de seguridad del monedero</translation>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Intento de recuperar claves privadas de un monedero corrupto en arranque</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Datos de monedero (*.dat)</translation>
+ <source>Block creation options:</source>
+ <translation>Opciones de creación de bloques:</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Ha fallado el respaldo</translation>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>No se puede resolver -%s direccion: '%s'</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Ha habido un error al intentar guardar los datos del monedero en %1.</translation>
+ <source>Change index out of range</source>
+ <translation>Cambio de indice fuera de rango</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Los datos del monedero se han guardado con éxito en %1.</translation>
+ <source>Connect only to the specified node(s)</source>
+ <translation>Conectar sólo a los nodos (o nodo) especificados</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>Se ha completado la copia de seguridad del monedero</translation>
+ <source>Connection options:</source>
+ <translation>Opciones de conexión:</translation>
</message>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Opciones:
-</translation>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Copyright (C) %i-%i</translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>Especificar directorio para los datos</translation>
+ <source>Corrupted block database detected</source>
+ <translation>Corrupción de base de datos de bloques detectada.</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Conectar a un nodo para obtener direcciones de pares y desconectar</translation>
+ <source>Debugging/Testing options:</source>
+ <translation>Opciones de depuración/pruebas:</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Especifique su propia dirección pública</translation>
+ <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>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Aceptar comandos consola y JSON-RPC
-</translation>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation>¿Quieres reconstruir la base de datos de bloques ahora?</translation>
</message>
<message>
- <source>Error: A fatal internal error occurred, see debug.log for details</source>
- <translation>Un error interno fatal ocurrió, ver debug.log para detalles</translation>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Activar publicar bloque .hash en &lt;.Address&gt;</translation>
</message>
<message>
- <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
- <translation>Comisión (en %s/KB) para agregar a las transacciones que envíe (por defecto: %s)</translation>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Activar publicar transacción .hash en &lt;.Address&gt;</translation>
</message>
<message>
- <source>Pruning blockstore...</source>
- <translation>Poda blockstore ...</translation>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Habilita la publicacion de bloques en bruto en &lt;direccion&gt;</translation>
</message>
<message>
- <source>Run in the background as a daemon and accept commands</source>
- <translation>Ejecutar en segundo plano como daemon y aceptar comandos
-</translation>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Habilitar publicar transacción en rama en &lt;dirección&gt;</translation>
</message>
<message>
- <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>Aceptar conexiones desde el exterior (predeterminado: 1 si no -proxy o -connect)</translation>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>Habilita el reemplazamiento de transacciones en la piscina de memoria (predeterminado: %u)</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>
+ <source>Error initializing block database</source>
+ <translation>Error al inicializar la base de datos de bloques</translation>
</message>
<message>
- <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
- <translation>Borrar todas las transacciones del monedero y sólo recuperar aquellas partes de la cadena de bloques por medio de -rescan on startup.</translation>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation>Error al inicializar el entorno de la base de datos del monedero %s</translation>
</message>
<message>
- <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 bajo la licencia de software MIT, vea la copia del archivo adjunto o &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
+ <source>Error loading %s</source>
+ <translation>Error cargando %s</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>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Error cargando %s: Monedero dañado</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>Establecer el número de hilos (threads) de verificación de scripts (entre %u y %d, 0 = automático, &lt;0 = dejar libres ese número de núcleos; predeterminado: %d)</translation>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Error cargando %s: Monedero requiere un versión mas reciente de %s</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 es una versión de pre-prueba - utilícela bajo su propio riesgo. No la utilice para usos comerciales o de minería.</translation>
+ <source>Error loading %s: You can't disable HD on a already existing HD wallet</source>
+ <translation>Error cargando %s: No puede deshabilitar HD en un monedero existente que ya es HD</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>No se ha podido acceder a %s en esta máquina. Probablemente ya se está ejecutando Bitcoin Core.</translation>
+ <source>Error loading block database</source>
+ <translation>Error cargando base de datos de bloques</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ADVERTENCIA: anormalmente alto número de bloques generado, %d bloques recibidos en las últimas horas %d (%d espera)</translation>
+ <source>Error opening block database</source>
+ <translation>Error al abrir base de datos de bloques.</translation>
</message>
<message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ADVERTENCIA: comprueba tu conexión de red, %d bloques recibidos en las últimas %d horas (%d esperados)</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Error: ¡Espacio en disco bajo!</translation>
</message>
<message>
- <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>Atención: ¡Parece que la red no está totalmente de acuerdo! Algunos mineros están presentando inconvenientes.</translation>
+ <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>
<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>Atención: ¡Parece que no estamos completamente de acuerdo con nuestros pares! Podría necesitar una actualización, u otros nodos podrían necesitarla.</translation>
+ <source>Importing...</source>
+ <translation>Importando...</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>Aviso: ¡Recuperados datos de wallet.dat corrupto! El wallet.dat original se ha guardado como wallet.{timestamp}.bak en %s; si hubiera errores en su saldo o transacciones, deberá restaurar una copia de seguridad.</translation>
+ <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <translation>Incorrecto o bloque de génesis no encontrado. Datadir equivocada para la red?</translation>
</message>
<message>
- <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
- <translation>Poner en lista blanca a los equipos que se conecten desde la máscara de subred o dirección IP especificada. Se puede especificar múltiples veces.</translation>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>La inicialización de la verificación de validez falló. Se está apagando %s.</translation>
</message>
<message>
- <source>-maxmempool must be at least %d MB</source>
- <translation>-maxmempool debe ser por lo menos de %d MB</translation>
+ <source>Invalid -onion address: '%s'</source>
+ <translation>Dirección -onion inválida: '%s'</translation>
</message>
<message>
- <source>&lt;category&gt; can be:</source>
- <translation>&lt;category&gt; puede ser:</translation>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Cantidad no valida para -%s=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Block creation options:</source>
- <translation>Opciones de creación de bloques:</translation>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Cantidad inválida para -fallbackfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Connect only to the specified node(s)</source>
- <translation>Conectar sólo a los nodos (o nodo) especificados</translation>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Mantener la memoria de transacciones por debajo de &lt;n&gt; megabytes (predeterminado: %u)</translation>
</message>
<message>
- <source>Connection options:</source>
- <translation>Opciones de conexión:</translation>
+ <source>Loading banlist...</source>
+ <translation>Cargando banlist...</translation>
</message>
<message>
- <source>Corrupted block database detected</source>
- <translation>Corrupción de base de datos de bloques detectada.</translation>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Ubicación de la cookie de autenticación (default: data dir)</translation>
</message>
<message>
- <source>Debugging/Testing options:</source>
- <translation>Opciones de depuración/pruebas:</translation>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Mínimo de bytes por sigop en transacciones que retransmitimos y minamos (predeterminado: %u)</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>
+ <source>Not enough file descriptors available.</source>
+ <translation>No hay suficientes descriptores de archivo disponibles. </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>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Sólo conectar a nodos en redes &lt;net&gt; (ipv4, ipv6 o onion)</translation>
</message>
<message>
- <source>Error initializing block database</source>
- <translation>Error al inicializar la base de datos de bloques</translation>
+ <source>Print this help message and exit</source>
+ <translation>Imprimir este mensaje de ayuda y salir</translation>
</message>
<message>
- <source>Error initializing wallet database environment %s!</source>
- <translation>Error al inicializar el entorno de la base de datos del monedero %s</translation>
+ <source>Print version and exit</source>
+ <translation>Imprimir versión y salir</translation>
</message>
<message>
- <source>Error loading block database</source>
- <translation>Error cargando base de datos de bloques</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Pode no se puede configurar con un valor negativo.</translation>
</message>
<message>
- <source>Error opening block database</source>
- <translation>Error al abrir base de datos de bloques.</translation>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>El modo recorte es incompatible con -txindex.</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Error: ¡Espacio en disco bajo!</translation>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>Reconstruir el estado de la cadena e indice de bloques a partir de los ficheros blk*.dat en disco</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>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>Reconstruir el estado de la cadena a partir de los bloques indexados</translation>
</message>
<message>
- <source>Importing...</source>
- <translation>Importando...</translation>
+ <source>Rewinding blocks...</source>
+ <translation>Verificando bloques...</translation>
</message>
<message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation>Incorrecto o bloque de génesis no encontrado. Datadir equivocada para la red?</translation>
+ <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>
<message>
- <source>Invalid -onion address: '%s'</source>
- <translation>Dirección -onion inválida: '%s'</translation>
+ <source>Set maximum block cost (default: %d)</source>
+ <translation>Establecer tamaño máximo de bloque (por defecto: %d)</translation>
</message>
<message>
- <source>Not enough file descriptors available.</source>
- <translation>No hay suficientes descriptores de archivo disponibles. </translation>
+ <source>Set maximum block size in bytes (default: %d)</source>
+ <translation>Establecer tamaño máximo de bloque en bytes (predeterminado: %d)</translation>
</message>
<message>
- <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
- <translation>Sólo conectar a nodos en redes &lt;net&gt; (ipv4, ipv6 o onion)</translation>
+ <source>Specify wallet file (within data directory)</source>
+ <translation>Especificar archivo de monedero (dentro del directorio de datos)</translation>
</message>
<message>
- <source>Prune cannot be configured with a negative value.</source>
- <translation>Pode no se puede configurar con un valor negativo.</translation>
+ <source>The source code is available from %s.</source>
+ <translation>El código fuente esta disponible desde %s.</translation>
</message>
<message>
- <source>Prune mode is incompatible with -txindex.</source>
- <translation>El modo recorte es incompatible con -txindex.</translation>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>No se ha podido conectar con %s en este equipo. %s es posible que este todavia en ejecución.</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>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>El argumento -benchmark no es soportado y ha sido ignorado, utiliza -debug=bench</translation>
</message>
<message>
- <source>Set maximum block size in bytes (default: %d)</source>
- <translation>Establecer tamaño máximo de bloque en bytes (predeterminado: %d)</translation>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Parámetros no compatibles -debugnet ignorados , use -debug = red.</translation>
</message>
<message>
- <source>Specify wallet file (within data directory)</source>
- <translation>Especificar archivo de monedero (dentro del directorio de datos)</translation>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Parámetros no compatibles -tor encontrados, use -onion .</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: %u)</source>
<translation>Usar UPnP para asignar el puerto de escucha (predeterminado:: %u)</translation>
</message>
<message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>El comentario del Agente de Usuario (%s) contiene caracteres inseguros.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Verificando bloques...</translation>
</message>
@@ -3027,16 +2150,16 @@
<translation>El monedero %s se encuentra fuera del directorio de datos %s</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>Opciones de monedero:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Opciones de depuración/pruebas 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>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>Es necesario reescribir el monedero: reiniciar %s para completar</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>
+ <source>Wallet options:</source>
+ <translation>Opciones de monedero:</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>
@@ -3051,10 +2174,6 @@
<translation>Ligar a las direcciones especificadas para escuchar por conexiones JSON-RPC. Usar la notación para IPv6 [host]:puerto. Esta opción se puede especificar múltiples veces (por defecto: ligar a todas las interfaces)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>No se ha podido bloquear el directorio de datos %s. Probablemente ya se está ejecutando 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>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>
@@ -3071,10 +2190,18 @@
<translation>Ejecutar un comando cuando se reciba una alerta importante o cuando veamos un fork demasiado largo (%s en cmd se reemplazará por el mensaje)</translation>
</message>
<message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Las comisiones (en %s/kB) mas pequeñas que esto se consideran como cero comisión para la retransmisión, minería y creación de la transacción (predeterminado: %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>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Cantidad no válida para -maxtxfee=&lt;amount&gt;: '%s' (debe ser por lo menos la cuota de comisión mínima de %s para prevenir transacciones atascadas)</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>
@@ -3091,10 +2218,6 @@
<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>The transaction amount is too small to send after the fee has been deducted</source>
<translation>Monto de transacción muy pequeña luego de la deducción por comisión</translation>
</message>
@@ -3103,6 +2226,10 @@
<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>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation>Usar tras BIP32 la generación de llave determinística jerárquica (HD) . Solo tiene efecto durante el primer inicio/generación del monedero</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>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>
@@ -3119,34 +2246,14 @@
<translation>Aceptar solicitudes públicas en FERIADOS (por defecto: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Activando la mejor cadena...</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>Intento de recuperar claves privadas de un wallet.dat corrupto</translation>
- </message>
- <message>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation>Automáticamente crea el servicio Tor oculto (por defecto: %d)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>No se puede resolver -whitebind address: '%s'</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Conectar usando 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>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>
@@ -3159,22 +2266,6 @@
<translation>Información</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Cantidad inválida para -mintxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Cantidad inválida para -paytxfee=&lt;amount&gt;: '%s' (debe ser por lo menos %s)</translation>
</message>
@@ -3199,12 +2290,8 @@
<translation>Opciones de servidor RPC:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>Reconstruir el índice de la cadena de bloques en el arranque desde los actuales ficheros blk000??.dat</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Recibir y mostrar alertas de red P2P (default: %u)</translation>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Reduciendo -maxconnections de %d a %d, debido a limitaciones del sistema.</translation>
</message>
<message>
<source>Rescan the block chain for missing wallet transactions on startup</source>
@@ -3239,6 +2326,14 @@
<translation>Este software es experimental.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Contraseña del puerto de control de Tor (predeterminado: vacio)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Puerto de control de Tor a utilizar si la escucha de onion esta activada (predeterminado: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Cantidad de la transacción demasiado pequeña</translation>
</message>
@@ -3268,20 +2363,24 @@
</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Monedero es necesario volver a escribir: reiniciar Bitcoin Core para completar</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Aviso</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Advertencia: nuevas reglas desconocidas activadas (versionbit %i)</translation>
+ </message>
+ <message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Si se debe o no operar en un modo de solo bloques (predeterminado: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Eliminando todas las transacciones del monedero...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrupto. Ha fallado la recuperación.</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>Opciones de notificación ZeroQM:</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3293,11 +2392,6 @@
<translation>Ejecutar un comando cuando cambia el mejor bloque (%s en cmd se sustituye por el hash de bloque)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Este mensaje de ayuda
-</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permitir búsquedas DNS para -addnode, -seednode y -connect</translation>
</message>
@@ -3306,14 +2400,26 @@
<translation>Cargando direcciones...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee tiene un ajuste muy elevado! Las comisiones así de grandes podrían ser pagadas en una única transaccion.</translation>
+ </message>
+ <message>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee tiene un ajuste muy elevado! Esta es la comisión de transacción que pagaras si envías una transaccion.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>No mantener transacciones en la memoria mas de &lt;n&gt; horas (predeterminado: %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Las comisiones (en %s/kB) menores que esto son consideradas de cero comision para la creacion de transacciones (predeterminado: %s)</translation>
+ </message>
+ <message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
<translation>Nivel de rigor en la verificación de bloques de -checkblocks (0-4; predeterminado: %u)</translation>
</message>
@@ -3330,24 +2436,36 @@
<translation>Mostrar depuración (por defecto: %u, proporcionar &lt;category&gt; es opcional)</translation>
</message>
<message>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Error: Unsupported argumento -socks encontrados. SOCKS versión ajuste ya no es posible, sólo SOCKS5 proxies son compatibles.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>El argumento no soportado -whitelistalwaysrelay ha sido ignorado, utiliza -whitelistrelay y/o -whitelistforcerelay.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Usar distintos proxys SOCKS5 para comunicarse vía Tor de forma anónima (Por defecto: %s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(predeterminado: %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Nombre de usuario y hash de la contraseña para las conexiones JSON-RPC. El campo &lt;userpw&gt; tiene el formato: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Se incluye un script python convencional en share/rpcuser. Esta opción puede ser especificada multiples veces</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Siempre consultar direcciones de otros equipos por medio de DNS lookup (por defecto: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Advertencia: Se están minando versiones de bloques desconocidas! Es posible que normas desconocidas estén activas</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Error al cargar wallet.dat</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Aviso: fichero de monedero corrupto, datos recuperados! Original %s guardado como %s en %s; si su balance de transacciones es incorrecto, debe restaurar desde una copia de seguridad.</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Generar monedas (por defecto: %u)</translation>
+ <source>(default: %s)</source>
+ <translation>(predeterminado: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Siempre consultar direcciones de otros equipos por medio de DNS lookup (por defecto: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3434,18 +2552,6 @@
<translation>La red especificada en -onlynet '%s' es desconocida</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>No se puede resolver la dirección de -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>No se puede resolver la dirección de -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Cantidad inválida para -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondos insuficientes</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bs.ts b/src/qt/locale/bitcoin_es_AR.ts
index a186842201..40ebaf8856 100644
--- a/src/qt/locale/bitcoin_bs.ts
+++ b/src/qt/locale/bitcoin_es_AR.ts
@@ -1,29 +1,71 @@
-<TS language="bs" version="2.1">
+<TS language="es_AR" version="2.1">
<context>
<name>AddressBookPage</name>
- </context>
-<context>
- <name>AddressTableModel</name>
- </context>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation>Hacé click para editar la dirección o etiqueta</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation>Crear una nueva dirección</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Nuevo</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>Copiá la dirección que seleccionaste al portapapeles</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Copiar</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>C&amp;lose</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Borrar de la lista la dirección seleccionada</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>&amp;Exportar</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Borrar</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
- </context>
-<context>
- <name>BanTableModel</name>
- </context>
-<context>
- <name>BitcoinGUI</name>
<message>
- <source>Bitcoin</source>
- <translation>Bitcoin</translation>
+ <source>Passphrase Dialog</source>
+ <translation>Diálogo de Frase de Contraseña</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Jezrga</translation>
+ <source>Enter passphrase</source>
+ <translation>Ingresar la Frase de Contraseña</translation>
</message>
+ <message>
+ <source>New passphrase</source>
+ <translation>Nueva Frase de Contraseña</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Repetí la nueva Frase de Contraseña</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
</context>
<context>
- <name>ClientModel</name>
+ <name>BitcoinGUI</name>
</context>
<context>
<name>CoinControlDialog</name>
@@ -36,17 +78,9 @@
</context>
<context>
<name>HelpMessageDialog</name>
- <message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Jezrga</translation>
- </message>
</context>
<context>
<name>Intro</name>
- <message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Jezrga</translation>
- </message>
</context>
<context>
<name>OpenURIDialog</name>
@@ -58,18 +92,12 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -79,91 +107,30 @@
<name>ReceiveRequestDialog</name>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- </context>
-<context>
<name>SendCoinsDialog</name>
</context>
<context>
<name>SendCoinsEntry</name>
- <message>
- <source>Alt+A</source>
- <translation>Alt+A</translation>
- </message>
- <message>
- <source>Alt+P</source>
- <translation>Alt+P</translation>
- </message>
</context>
<context>
<name>ShutdownWindow</name>
</context>
<context>
<name>SignVerifyMessageDialog</name>
- <message>
- <source>Alt+A</source>
- <translation>Alt+A</translation>
- </message>
- <message>
- <source>Alt+P</source>
- <translation>Alt+P</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
- <message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Jezrga</translation>
- </message>
</context>
<context>
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Sve</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Danas</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Ovaj mjesec</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Prošli mjesec</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Ove godine</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts
index c303007b7a..188641d6e7 100644
--- a/src/qt/locale/bitcoin_es_CL.ts
+++ b/src/qt/locale/bitcoin_es_CL.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation>Crea una nueva direCrea una nueva direccióncción</translation>
+ <translation>Crea una nueva dirección</translation>
</message>
<message>
<source>&amp;New</source>
@@ -26,10 +26,6 @@
<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>
@@ -45,33 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Borrar</translation>
</message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copia &amp;etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editar</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivos separados por coma (*.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -87,82 +56,6 @@
<source>Repeat new passphrase</source>
<translation>Repite nueva contraseña</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Codificar billetera</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operación necesita la contraseña para desbloquear la billetera.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquea billetera</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operación necesita la contraseña para decodificar la billetara.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Decodificar cartera</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambia contraseña</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirma la codificación de cartera</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation>Atención: ¡Si codificas tu billetera y pierdes la contraseña perderás &lt;b&gt;TODOS TUS BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>¿Seguro que quieres seguir codificando la billetera?</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: Cualquier versión anterior que hayas realizado de tu archivo de billetera será reemplazada por el nuevo archivo de billetera encriptado. Por razones de seguridad, los respaldos anteriores de los archivos de billetera se volverán inútiles en tanto comiences a usar la nueva billetera encriptada.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Precaucion: Mayúsculas Activadas</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Billetera codificada</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Falló la codificación de la billetera</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>La codificación de la billetera falló debido a un error interno. Tu billetera no ha sido codificada.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Las contraseñas no coinciden.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Ha fallado el desbloqueo de la billetera</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contraseña introducida para decodificar la billetera es incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Ha fallado la decodificación de la billetera</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>La contraseña de billetera ha sido cambiada con éxito.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -202,6 +95,10 @@
<translation>Salir del programa</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>S&amp;obre %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Acerca de</translation>
</message>
@@ -226,12 +123,16 @@
<translation>&amp;Cambiar la contraseña...</translation>
</message>
<message>
- <source>Open &amp;URI...</source>
- <translation>Abrir y url...</translation>
+ <source>&amp;Sending addresses...</source>
+ <translation>Mandando direcciones</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>cliente bitcoin core</translation>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Recibiendo direcciones</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI...</source>
+ <translation>Abrir y url...</translation>
</message>
<message>
<source>Reindexing blocks on disk...</source>
@@ -258,6 +159,10 @@
<translation>Abre consola de depuración y diagnóstico</translation>
</message>
<message>
+ <source>&amp;Verify message...</source>
+ <translation>Verificar mensaje....</translation>
+ </message>
+ <message>
<source>Bitcoin</source>
<translation>Bitcoin</translation>
</message>
@@ -298,8 +203,12 @@
<translation>Barra de pestañas</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>bitcoin core</translation>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation>Pide pagos (genera codigos QR and bitcoin: URls)</translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation>%1 y %2</translation>
</message>
<message>
<source>Error</source>
@@ -339,19 +248,21 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta de Red</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
<translation>Cantidad:</translation>
</message>
<message>
+ <source>Priority:</source>
+ <translation>prioridad:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>comisión:
+</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>Cantidad</translation>
</message>
@@ -360,6 +271,10 @@
<translation>Fecha</translation>
</message>
<message>
+ <source>Confirmations</source>
+ <translation>Confirmaciones</translation>
+ </message>
+ <message>
<source>Confirmed</source>
<translation>Confirmado</translation>
</message>
@@ -367,35 +282,7 @@
<source>Priority</source>
<translation>prioridad</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copia dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copia etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -410,38 +297,6 @@
<source>&amp;Address</source>
<translation>&amp;Dirección</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nueva dirección para recibir</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nueva dirección para enviar</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editar dirección de recepción</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editar dirección de envio</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>La dirección introducida "%1" ya esta guardada en la libreta de direcciones.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>La dirección introducida "%1" no es una dirección Bitcoin valida.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>No se pudo desbloquear la billetera.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>La generación de nueva clave falló.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -453,14 +308,14 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>bitcoin core</translation>
- </message>
- <message>
<source>version</source>
<translation>versión</translation>
</message>
<message>
+ <source>Command-line options</source>
+ <translation>opciones de linea de comando</translation>
+ </message>
+ <message>
<source>Usage:</source>
<translation>Uso:</translation>
</message>
@@ -472,10 +327,6 @@
<translation>bienvenido</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>bitcoin core</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
@@ -506,6 +357,10 @@
<translation>&amp;Red</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>Cartera</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation>experto</translation>
</message>
@@ -587,13 +442,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pago completado</translation>
- </message>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -608,23 +456,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>Guardar imagen...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>Copiar Imagen</translation>
- </message>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nombre del cliente</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -637,6 +470,10 @@
<translation>&amp;Información</translation>
</message>
<message>
+ <source>Debug window</source>
+ <translation>Ventana Debug</translation>
+ </message>
+ <message>
<source>General</source>
<translation>General</translation>
</message>
@@ -685,6 +522,10 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation>Cantidad:</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -692,15 +533,7 @@
<source>&amp;Message:</source>
<translation>&amp;mensaje</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copia etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar Cantidad</translation>
- </message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
@@ -715,55 +548,41 @@
<source>&amp;Save Image...</source>
<translation>Guardar imagen...</translation>
</message>
+</context>
+<context>
+ <name>SendCoinsDialog</name>
<message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidad</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>Send Coins</source>
+ <translation>Enviar monedas</translation>
</message>
<message>
- <source>Message</source>
- <translation>Mensaje</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
+ <source>Insufficient funds!</source>
+ <translation>Fondos insuficientes</translation>
</message>
<message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>Amount:</source>
+ <translation>Cantidad:</translation>
</message>
<message>
- <source>Message</source>
- <translation>Mensaje</translation>
+ <source>Priority:</source>
+ <translation>prioridad:</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Cantidad</translation>
+ <source>Fee:</source>
+ <translation>comisión:
+</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
+ <source>Transaction Fee:</source>
+ <translation>Comisión transacción:</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation>Enviar monedas</translation>
+ <source>normal</source>
+ <translation>normal</translation>
</message>
<message>
- <source>Amount:</source>
- <translation>Cantidad:</translation>
+ <source>fast</source>
+ <translation>rapido</translation>
</message>
<message>
<source>Send to multiple recipients at once</source>
@@ -789,31 +608,7 @@
<source>S&amp;end</source>
<translation>&amp;Envía</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirmar el envio de monedas</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar Cantidad</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>La cantidad sobrepasa tu saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>El total sobrepasa tu saldo cuando se incluyen %1 como tasa de envio.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -825,10 +620,6 @@
<translation>&amp;Pagar a:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Introduce una etiqueta a esta dirección para añadirla a tu guia</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -848,6 +639,10 @@
<source>Message:</source>
<translation>Mensaje:</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Pagar a:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -898,38 +693,10 @@
<source>Verify &amp;Message</source>
<translation>&amp;Firmar Mensaje</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Click en "Firmar Mensage" para conseguir firma</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Por favor, revise la dirección Bitcoin e inténtelo denuevo</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Ha fallado el desbloqueo de la billetera</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Firma fallida</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mensaje firmado</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mensaje comprobado</translation>
- </message>
-</context>
+ </context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>bitcoin core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[red-de-pruebas]</translation>
</message>
@@ -942,334 +709,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Abierto hasta %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/fuera de linea</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/no confirmado</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmaciónes</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Estado</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generado</translation>
- </message>
- <message>
- <source>From</source>
- <translation>De</translation>
- </message>
- <message>
- <source>To</source>
- <translation>A</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>propia dirección</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiqueta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Credito</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>no aceptada</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debito</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Comisión transacción</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Cantidad total</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaje</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentario</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID de Transacción</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transacción</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidad</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, no ha sido emitido satisfactoriamente todavía</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconocido</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalles de transacción</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Esta ventana muestra información detallada sobre la transacción</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Abierto hasta %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmado (%1 confirmaciones)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Este bloque no ha sido recibido por otros nodos y probablemente no sea aceptado !</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Recibido de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pagar a usted mismo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Estado de transacción. Pasa el raton sobre este campo para ver el numero de confirmaciónes.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Fecha y hora cuando se recibió la transaccion</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipo de transacción.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Cantidad restada o añadida al balance</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Todo</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Hoy</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Esta semana</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Esta mes</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Mes pasado</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Este año</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Rango...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Recibido con</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado a</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>A ti mismo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Otra</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Introduce una dirección o etiqueta para buscar</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Cantidad minima</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copia dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copia etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar Cantidad</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Edita etiqueta</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Mostrar detalles de la transacción</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivos separados por coma (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmado</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Rango:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>para</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Enviar monedas</translation>
- </message>
-</context>
-<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>
- <message>
- <source>Backup Wallet</source>
- <translation>Respaldar billetera</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Datos de billetera (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Ha fallado el respaldo</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1292,6 +741,10 @@
</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>bitcoin core</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>Conecta solo al nodo especificado
</translation>
@@ -1322,20 +775,11 @@
<translation>Atención</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrompió, guardado fallido</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Contraseña para las conexiones JSON-RPC
</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Este mensaje de ayuda
-</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permite búsqueda DNS para addnode y connect
</translation>
@@ -1345,30 +789,10 @@
<translation>Cargando direcciónes...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Error cargando wallet.dat: Billetera corrupta</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Error cargando wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Dirección -proxy invalida: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>No se pudo resolver la dirección fija: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>No se pudo resolver la dirección ip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Cantidad inválida para -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondos insuficientes</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_CO.ts b/src/qt/locale/bitcoin_es_CO.ts
new file mode 100644
index 0000000000..df189190f6
--- /dev/null
+++ b/src/qt/locale/bitcoin_es_CO.ts
@@ -0,0 +1,284 @@
+<TS language="es_CO" version="2.1">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation>Click derecho para editar la dirección o etiqueta</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation>Crear una nueva dirección</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Nuevo</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>Copiar la dirección actualmente seleccionada al sistema de portapapeles</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Copiar</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>C&amp;errar</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Borrar la dirección actualmente seleccionada de la lista</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Exportar</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Borrar</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation>Diálogo de contraseña</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation>Poner contraseña</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation>Nueva contraseña</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Repetir nueva contraseña</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>Synchronizing with network...</source>
+ <translation>Sincronizando con la red...</translation>
+ </message>
+ <message>
+ <source>Node</source>
+ <translation>Nodo</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation>Mostrar vista general de la billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation>&amp;Transacciones</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation>S&amp;alir</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation>Salir de la aplicación</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>Acerca de &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation>Mostrar información sobre Qt</translation>
+ </message>
+ <message>
+ <source>&amp;Options...</source>
+ <translation>&amp;Opciones</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet...</source>
+ <translation>&amp;Billetera Encriptada</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet...</source>
+ <translation>&amp;Billetera Copia de seguridad...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase...</source>
+ <translation>&amp;Cambiar contraseña...</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses...</source>
+ <translation>&amp;Enviando Direcciones...</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>&amp;Recibiendo Direcciones...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI...</source>
+ <translation>Abrir &amp;URL...</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation>Enviando monedas a una dirección de Bitcoin</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation>Cambiar la contraseña usando la encriptación de la billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Debug window</source>
+ <translation>&amp;Ventana desarrollador</translation>
+ </message>
+ <message>
+ <source>Open debugging and diagnostic console</source>
+ <translation>Abrir consola de diagnóstico y desarrollo</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message...</source>
+ <translation>&amp;Verificar Mensaje...</translation>
+ </message>
+ <message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>Billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Enviar</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation>&amp;Recibir</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <translation>&amp;Mostrar / Ocultar</translation>
+ </message>
+ <message>
+ <source>Show or hide the main Window</source>
+ <translation>Mostrar u ocultar la Ventana Principal</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Archivo</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation>&amp;Configuraciones</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Ayuda</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ </context>
+<context>
+ <name>OpenURIDialog</name>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ </context>
+<context>
+ <name>QObject</name>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ </context>
+<context>
+ <name>SplashScreen</name>
+ </context>
+<context>
+ <name>TrafficGraphWidget</name>
+ </context>
+<context>
+ <name>TransactionDescDialog</name>
+ </context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Insufficient funds</source>
+ <translation>Fondos Insuficientes</translation>
+ </message>
+ <message>
+ <source>Loading wallet...</source>
+ <translation>Cargando billetera...</translation>
+ </message>
+ <message>
+ <source>Cannot write default address</source>
+ <translation>No se puede escribir la dirección por defecto</translation>
+ </message>
+ <message>
+ <source>Rescanning...</source>
+ <translation>Reescaneando</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation>Listo Cargando</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts
index 60347070df..ba963d2b80 100644
--- a/src/qt/locale/bitcoin_es_DO.ts
+++ b/src/qt/locale/bitcoin_es_DO.ts
@@ -22,10 +22,6 @@
<translation>&amp;Cerrar</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiar dirección</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Borrar de la lista la dirección seleccionada</translation>
</message>
@@ -41,69 +37,6 @@
<source>&amp;Delete</source>
<translation>&amp;Eliminar</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Escoja la dirección para enviar monedas</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Escoja la dirección para recibir monedas</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Escoger</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Enviando dirección</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Recibiendo dirección</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Estas son sus direcciones Bitcoin para enviar pagos. Compruebe siempre la cantidad y la dirección receptora antes de transferir 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>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copiar &amp;etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editar</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportar la lista de direcciones </translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivos de columnas separadas por coma (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Error exportando</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -123,82 +56,6 @@
<source>Repeat new passphrase</source>
<translation>Repita la nueva contraseña</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Cifrar la cartera</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operación requiere su contraseña para desbloquear la cartera</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquear cartera</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operación requiere su contraseña para descifrar la cartera.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Descifrar la certare</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambiar contraseña</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmar cifrado de la cartera</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation>Atencion: ¡Si cifra su monedero y pierde la contraseña perderá &lt;b&gt;TODOS SUS BITCOINS&lt;/b&gt;!"</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>¿Seguro que desea cifrar su monedero?</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: Cualquier copia de seguridad que haya realizado previamente de su archivo de monedero debe reemplazarse con el nuevo archivo de monedero cifrado. Por razones de seguridad, las copias de seguridad previas del archivo de monedero no cifradas serán inservibles en cuanto comience a usar el nuevo monedero cifrado.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Aviso: ¡La tecla de bloqueo de mayúsculas está activada!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Monedero cifrado</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Ha fallado el cifrado del monedero</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Ha fallado el cifrado del monedero debido a un error interno. El monedero no ha sido cifrado.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Las contraseñas no coinciden.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Ha fallado el desbloqueo del monedero</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contraseña introducida para descifrar el monedero es incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Ha fallado el descifrado del monedero</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Se ha cambiado correctamente la contraseña del monedero.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -278,10 +135,6 @@
<translation>Abrir URI...</translation>
</message>
<message>
- <source>Importing blocks from disk...</source>
- <translation>Importando bloques de disco...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindexando bloques en disco...</translation>
</message>
@@ -362,18 +215,10 @@
<translation>Barra de pestañas</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Núcleo de Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Solicitar pagos (genera codigo QR y URL's de Bitcoin)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Acerca del Núcleo de Bitcoin</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Mostrar la lista de direcciones de envío y etiquetas</translation>
</message>
@@ -443,13 +288,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta de red</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -511,130 +349,6 @@
<source>Priority</source>
<translation>Prioridad</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar identificador de transacción</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloquear lo no gastado</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Desbloquear lo no gastado</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar donación</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiar después de aplicar donación</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridad</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar Cambio</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>lo más alto</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>más alto</translation>
- </message>
- <message>
- <source>high</source>
- <translation>alto</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medio-alto</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>medio</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>bajo-medio</translation>
- </message>
- <message>
- <source>low</source>
- <translation>bajo</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>más bajo</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>lo más bajo</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloqueado)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>ninguno</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>si</translation>
- </message>
- <message>
- <source>no</source>
- <translation>no</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Puede variar +/- 1 byte por entrada.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Las transacciones con alta prioridad son más propensas a ser incluidas dentro de un bloque.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>Enviar desde %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(cambio)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -658,38 +372,6 @@
<source>&amp;Address</source>
<translation>&amp;Dirección</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nueva dirección de recepción</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nueva dirección de envío</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editar dirección de recepción</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editar dirección de envío</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>La dirección introducida "%1" ya está presente en la libreta de direcciones.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>La dirección introducida "%1" no es una dirección Bitcoin válida.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>No se pudo desbloquear el monedero.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ha fallado la generación de la nueva clave.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -717,18 +399,10 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Núcleo de Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>versión</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Acerca del Núcleo de Bitcoin</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Opciones de la línea de órdenes</translation>
</message>
@@ -740,7 +414,7 @@
<source>command-line options</source>
<translation>opciones de la línea de órdenes</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -748,18 +422,6 @@
<translation>Bienvenido</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Bienvenido al Núcleo de 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>Al ser la primera vez que se ejecuta el programa, puede elegir dónde almacenará sus datos Bitcoin-Qt.</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-Qt va a descargar y guardar una copia de la cadena de bloques de Bitcoin. Se almacenará al menos %1GB de datos en este directorio, que irá creciendo con el tiempo. El monedero se guardará también en este directorio.</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>Utilizar el directorio de datos predeterminado</translation>
</message>
@@ -768,10 +430,6 @@
<translation>Utilice un directorio de datos personalizado:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Núcleo de Bitcoin</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
@@ -794,10 +452,6 @@
<source>Select payment request file</source>
<translation>Seleccione archivo de sulicitud de pago</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Abrir archivo de solicitud de pago</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -830,6 +484,10 @@
<translation>&amp;Red</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>Monedero</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation>Experto</translation>
</message>
@@ -958,53 +616,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Gestión de URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Dirección de pago no válida %1</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>La cantidad del pago solicitado (%1) es demasiado pequeña (considerada polvo).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Error en petición de pago</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>No se pudo iniciar bitcoin: manejador de pago-al-clic</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>Refund from %1</source>
- <translation>Devolución de %1</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>Error en la comunicación con %1: %2</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Respuesta errónea del servidor %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pago aceptado</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Error en petición de red</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -1027,31 +638,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>Guardar Imagen...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>Copiar imagen</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Guardar código QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Imágenes PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nombre del cliente</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/D</translation>
</message>
@@ -1072,10 +660,6 @@
<translation>General</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Utilizando la versión OpenSSL</translation>
- </message>
- <message>
<source>Startup time</source>
<translation>Hora de inicio</translation>
</message>
@@ -1132,10 +716,6 @@
<translation>Fuera:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Fecha de compilación</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Archivo de registro de depuración</translation>
</message>
@@ -1218,14 +798,6 @@
<source>Remove</source>
<translation>Eliminar</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cantidad</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1245,71 +817,8 @@
<source>&amp;Save Image...</source>
<translation>Guardar Imagen...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Solicitar pago a %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Información de pago</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidad</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaje</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI resultante demasiado larga. Intente reducir el texto de la etiqueta / mensaje.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Error al codificar la URI en el código QR.</translation>
- </message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaje</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidad</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(Ningun mensaje)</translation>
- </message>
- </context>
-<context>
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
@@ -1368,6 +877,10 @@
<translation>Dirección propia</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Comisión de transacción:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Enviar a múltiples destinatarios de una vez</translation>
</message>
@@ -1395,86 +908,6 @@
<source>S&amp;end</source>
<translation>&amp;Enviar</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirmar el envío de monedas</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 a %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar donación</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiar después de aplicar donación</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridad</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar Cambio</translation>
- </message>
- <message>
- <source>or</source>
- <translation>o</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>La cantidad sobrepasa su saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>El total sobrepasa su saldo cuando se incluye la tasa de envío de %1</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>¡Ha fallado la creación de la transacción!</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 transacción fue rechazada. Esto puede haber ocurrido si alguna de las monedas ya estaba gastada o si ha usado una copia de wallet.dat y las monedas se gastaron en la copia pero no se han marcado como gastadas aqui.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Alerta: Dirección de Bitcoin inválida</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Alerta: Dirección de Bitcoin inválida</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>¿Está seguro que desea enviar?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>añadido como comisión de transacción</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1487,10 +920,6 @@
<translation>&amp;Pagar a:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Etiquete esta dirección para añadirla a la libreta</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -1519,6 +948,10 @@
<translation>Eliminar esta transacción</translation>
</message>
<message>
+ <source>Message:</source>
+ <translation>Mensaje:</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>
@@ -1604,70 +1037,10 @@
<source>Reset all verify message fields</source>
<translation>Limpiar todos los campos de la verificación de mensaje</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Haga clic en "Firmar mensaje" para generar la firma</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>La dirección introducida es inválida.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Verifique la dirección e inténtelo de nuevo.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>La dirección introducida no corresponde a una clave.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Se ha cancelado el desbloqueo del monedero. </translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>No se dispone de la clave privada para la dirección introducida.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Ha fallado la firma del mensaje.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mensaje firmado.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>No se puede decodificar la firma.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Compruebe la firma e inténtelo de nuevo.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>La firma no coincide con el resumen del mensaje.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>La verificación del mensaje ha fallado.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mensaje verificado.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Núcleo de Bitcoin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Los desarrolladores del Núcleo de Bitcoin</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1680,402 +1053,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Abierto hasta %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/fuera de línea</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/no confirmado</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmaciones</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Estado</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Fuente</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generado</translation>
- </message>
- <message>
- <source>From</source>
- <translation>De</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Para</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>dirección propia</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiqueta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Crédito</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>no aceptada</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Débito</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Comisión de transacción</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Cantidad neta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaje</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentario</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Vendedor</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>Las monedas generadas deben madurar %1 bloques antes de que puedan ser gastadas. Una vez que generas este bloque, es propagado por la red para ser añadido a la cadena de bloques. Si falla el intento de meterse en la cadena, su estado cambiará a "no aceptado" y ya no se puede gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del tuyo.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Información de depuración</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transacción</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>entradas</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidad</translation>
- </message>
- <message>
- <source>true</source>
- <translation>verdadero</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falso</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, todavía no se ha sido difundido satisfactoriamente</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconocido</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalles de transacción</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Esta ventana muestra información detallada sobre la transacción</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Abierto hasta %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmado (%1 confirmaciones)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Este bloque no ha sido recibido por otros nodos y probablemente no sea aceptado!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Recibidos de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pago propio</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(nd)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Estado de transacción. Pasa el ratón sobre este campo para ver el número de confirmaciones.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Fecha y hora en que se recibió la transacción.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipo de transacción.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Cantidad retirada o añadida al saldo.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Todo</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Hoy</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Esta semana</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Este mes</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Mes pasado</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Este año</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Rango...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Recibido con</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado a</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>A usted mismo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Otra</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Introduzca una dirección o etiqueta que buscar</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Cantidad mínima</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copiar dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar identificador de transacción</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Editar etiqueta</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Mostrar detalles de la transacción</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Exportar historial de transacciones</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Error exportando</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Ha habido un error al intentar guardar la transacción con %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exportación finalizada</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>La transacción ha sido guardada en %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivos de columnas separadas por coma (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmado</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Rango:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>para</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>No se ha cargado ningún monedero</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Enviar monedas</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportar</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>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Respaldo de monedero</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Datos de monedero (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Ha fallado el respaldo</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Ha habido un error al intentar guardar los datos del monedero en %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Los datos del monedero se han guardado con éxito en %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Se ha completado con éxito la copia de respaldo</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2109,6 +1096,10 @@
<translation>Aceptar conexiones desde el exterior (predeterminado: 1 si no -proxy o -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Núcleo de Bitcoin</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>
@@ -2129,10 +1120,6 @@
<translation>Atención: ¡Parece que no estamos completamente de acuerdo con nuestros pares! Podría necesitar una actualización, u otros nodos podrían necesitarla.</translation>
</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>Aviso: ¡Recuperados datos de wallet.dat corrupto! El wallet.dat original se ha guardado como wallet.{timestamp}.bak en %s; si hubiera errores en su saldo o transacciones, deberá restaurar una copia de seguridad.</translation>
- </message>
- <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;category&gt; puede ser:</translation>
</message>
@@ -2209,10 +1196,6 @@
<translation>El monedero %s se encuentra fuera del directorio de datos %s</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>
- <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>Ejecutar un comando cuando se reciba una alerta importante o cuando veamos un fork demasiado largo (%s en cmd se reemplazará por el mensaje)</translation>
</message>
@@ -2225,14 +1208,6 @@
<translation>Información</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Inválido por el monto -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Inválido por el monto -mintxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>RPC server options:</source>
<translation>Opciones del sservidor RPC:</translation>
</message>
@@ -2274,10 +1249,6 @@
<translation>Aviso</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrupto. Ha fallado la recuperación.</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Contraseña para las conexiones JSON-RPC
</translation>
@@ -2287,11 +1258,6 @@
<translation>Ejecutar un comando cuando cambia el mejor bloque (%s en cmd se sustituye por el hash de bloque)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Este mensaje de ayuda
-</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permitir búsquedas DNS para -addnode, -seednode y -connect</translation>
</message>
@@ -2300,14 +1266,6 @@
<translation>Cargando direcciones...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Error al cargar wallet.dat: el monedero está dañado</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Error al cargar wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Dirección -proxy inválida: '%s'</translation>
</message>
@@ -2316,18 +1274,6 @@
<translation>La red especificada en -onlynet '%s' es desconocida</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>No se puede resolver la dirección de -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>No se puede resolver la dirección de -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Cantidad inválida para -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondos insuficientes</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_ES.ts b/src/qt/locale/bitcoin_es_ES.ts
index b19387d9ed..c66a477cc2 100644
--- a/src/qt/locale/bitcoin_es_ES.ts
+++ b/src/qt/locale/bitcoin_es_ES.ts
@@ -26,10 +26,6 @@
<translation>C&amp;errar</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiar Direccón</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Elimina la dirección seleccionada de la lista</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Eliminar</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Elige la dirección a la que enviar las monedas</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Elige la direccón con la que recibir monedas</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>E&amp;legir</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Enviando direcciones</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Recibiendo direcciones</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>Estas son tus direcciones de Bitcoin para enviar pagos. Comprueba siempre la cantidad y la dirección receptora antes de enviar 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 tus direcciones de Bitcoin para recibir pagos. Se recomienda usar una nueva dirección receptora para cada transacción</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copiar &amp;Etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editar</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportar Lista de Direcciones</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivo separado por comas (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportacón Fallida</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Ha ocurrido un error intentando guardar la lista de direcciones en %1. Por favor intentalo de nuevo.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Repite la nueva contraseña</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Encriptar cartera</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operacón necesita tu contraseña de la cartera para desbloquear la cartera.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquear cartera</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operación requiere tu contraseña de la cartera para desencriptar la cartera.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desencriptar cartera</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambiar contraseña</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmar encriptación de la cartera</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation>Advertencia: Si encriptas tu cartera y pierdes tu contraseña, &lt;b&gt;PERDERÃS TODOS TUS BITCOINS&lt;/B&gt;</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Estás seguro ue deseas encriptar tu cartera?</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 finalizar el proceso de encriptación. Recuerda que encriptar tu cartera no protege completamente tus bitcoins de ser robados por malware infectando tu ordenador.</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: Cualquier copia de seguridad anterior del archivo de tu cartera debería ser remplazado con el nuevo archivo encriptado. Por motivos de seguridad, las copias de seguridad anteriores de la cartera desencriptada quedaran inusables tan pronto como empieces a usar la nueva cartera encriptada.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Advertencia: La Tecla de Bloqueo de Mayusculas esta activada!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Cartera encriptada</translation>
- </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>Introduzca la nueva contraseña de la cartera. &lt;br/&gt;Por favor utilice una contraseña de &lt;b&gt;diez o mas caracteres aleatorios&lt;/b&gt;, o &lt;b&gt;ocho o mas palabras&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Introduzca la antigua contraseña y la nueva contraseña en la cartera.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <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>
- <translation>La encriptación de la cartera ha fallado debido a un error interno. Tu cartera no ha sido encriptada.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Las contraseñas proporcianadas no se corresponden.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Desbloqueo de la cartera fallido</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contraseña introducida para desencriptar la cartera es incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Desencriptación de la cartera fallida</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Contraseña de la cartera cambiada correctamente</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -298,14 +139,6 @@
<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>Importando bloques desde disco...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindexando bloques en el disco...</translation>
</message>
@@ -319,18 +152,19 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
- </context>
+ <message>
+ <source>&amp;Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation>Dirección</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -350,18 +184,12 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -370,31 +198,12 @@
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Copiar Direccón</translation>
</message>
</context>
<context>
<name>SendCoinsDialog</name>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -412,58 +221,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportacón Fallida</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivo separado por comas (*.csv)</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportar</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporta los datos de la pestaña actual a un archivo</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_MX.ts b/src/qt/locale/bitcoin_es_MX.ts
index e9a80e2f5f..0a6ea1e1dd 100644
--- a/src/qt/locale/bitcoin_es_MX.ts
+++ b/src/qt/locale/bitcoin_es_MX.ts
@@ -2,6 +2,10 @@
<context>
<name>AddressBookPage</name>
<message>
+ <source>Right-click to edit address or label</source>
+ <translation>Click derecho para editar tu dirección o etiqueta</translation>
+ </message>
+ <message>
<source>Create a new address</source>
<translation>Crear una dirección nueva</translation>
</message>
@@ -11,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation>Copiar el domicilio seleccionado al portapapeles del sistema</translation>
+ <translation>Copiar la dirección seleccionada al portapapeles del sistema</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -22,10 +26,6 @@
<translation>Cerrar</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiar dirección</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Eliminar la dirección actualmente seleccionada de la lista</translation>
</message>
@@ -41,73 +41,14 @@
<source>&amp;Delete</source>
<translation>&amp;Borrar</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Elija una dirección a la cual enviar monedas</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Elija la dirección con la cual recibir monedas</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>Elegir</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Enviando direcciones</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Recibiendo direcciones</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>Estas son tus direcciones de Bitcoin para enviar pagos. Siempre revise la cantidad y la dirección receptora antes de enviar 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 tus direcciones Bitcoin para recibir pagos. Es recomendado usar una nueva dirección receptora para cada transacción.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copiar &amp;Etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editar</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportar Lista de direcciones</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Arhchivo separado por comas (*.CSV)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportación fallida</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Domicilio</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation>Dialogo de contraseña</translation>
+ </message>
+ <message>
<source>Enter passphrase</source>
<translation>Ingrese la contraseña</translation>
</message>
@@ -119,87 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Repita la nueva contraseña</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Encriptar cartera.</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operación necesita la contraseña de su cartera para desbloquear su cartera.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquear cartera.</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operación necesita la contraseña de su cartera para desencriptar su cartera.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desencriptar cartera</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambiar contraseña</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmar la encriptación de cartera</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation>Advertencia: Si encripta su cartera y pierde su contraseña, &lt;b&gt;PERDERà TODOS SUS BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>¿Está seguro que desea encriptar su cartera?</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Advertencia: ¡La tecla Bloq Mayus está activada!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Cartera encriptada</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <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>
- <translation>La encriptación de la cartera falló debido a un error interno. Su cartera no fue encriptada.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Las contraseñas dadas no coinciden</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <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 desencriptación de la cartera es incorrecto</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>La desencriptación de la cartera fallo</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>La contraseña de la cartera ha sido exitosamente cambiada.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation>IP/Máscara de red</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
- <translation>Sign &amp;mensaje</translation>
+ <translation>Firmar &amp;mensaje</translation>
</message>
<message>
<source>Synchronizing with network...</source>
@@ -259,21 +132,17 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>&amp;Enviando direcciones...</translation>
+ <translation>Direcciones de &amp;envío...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>&amp;Recibiendo direcciones...</translation>
+ <translation>Direcciones de &amp;recepción...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
<translation>Abrir &amp;URL...</translation>
</message>
<message>
- <source>Importing blocks from disk...</source>
- <translation>Importando bloques desde el disco...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindexando bloques en el disco...</translation>
</message>
@@ -295,13 +164,33 @@
</message>
<message>
<source>Open debugging and diagnostic console</source>
- <translation>Abrir la consola de depuración y disgnostico</translation>
+ <translation>Abrir consola de depuración y diagnostico</translation>
</message>
<message>
<source>&amp;Verify message...</source>
<translation>&amp;Verificar mensaje...</translation>
</message>
<message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>Cartera</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Enviar</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation>&amp;Recibir</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <translation>&amp;Mostrar / Ocultar</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation>&amp;Archivo</translation>
</message>
@@ -318,16 +207,20 @@
<translation>Pestañas</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>nucleo Bitcoin</translation>
- </message>
- <message>
<source>&amp;Command-line options</source>
<translation>opciones de la &amp;Linea de comandos</translation>
</message>
<message>
- <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>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>Aviso</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Información </translation>
</message>
<message>
<source>Up to date</source>
@@ -335,7 +228,7 @@
</message>
<message>
<source>Catching up...</source>
- <translation>Resiviendo...</translation>
+ <translation>Recibiendo...</translation>
</message>
<message>
<source>Sent transaction</source>
@@ -355,11 +248,12 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
+ <source>Quantity:</source>
+ <translation>Cantidad</translation>
+ </message>
+ <message>
<source>Bytes:</source>
<translation>Bytes:</translation>
</message>
@@ -376,6 +270,14 @@
<translation>Cuota:</translation>
</message>
<message>
+ <source>After Fee:</source>
+ <translation>Después de los cargos por comisión. </translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>Cambio</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>Monto</translation>
</message>
@@ -388,46 +290,10 @@
<translation>Confirmado </translation>
</message>
<message>
- <source>Copy address</source>
- <translation>Copiar dirección </translation>
+ <source>Priority</source>
+ <translation>Prioridad</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copiar capa </translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>copiar monto</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>copiar cantidad</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>copiar cuota</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>copiar despues de cuota</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>copiar prioridad</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>copiar cambio</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -442,55 +308,27 @@
<source>&amp;Address</source>
<translation>&amp;Dirección</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nueva dirección de entregas</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nueva dirección de entregas</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editar dirección de entregas</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editar dirección de envios</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>El domicilio ingresado "%1" ya existe en la libreta de direcciones</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>No se puede desbloquear la cartera</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>La generación de la nueva clave fallo</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
+ <message>
+ <source>name</source>
+ <translation>nombre</translation>
+ </message>
</context>
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>nucleo Bitcoin</translation>
- </message>
- <message>
<source>version</source>
- <translation>Versión</translation>
+ <translation>versión</translation>
</message>
<message>
<source>(%1-bit)</source>
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Acerca de Bitcoin Core</translation>
+ <source>Command-line options</source>
+ <translation>opciones de la Linea de comandos</translation>
</message>
<message>
<source>Usage:</source>
@@ -500,12 +338,12 @@
<source>command-line options</source>
<translation>Opciones de comando de lineas</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
- <source>Bitcoin Core</source>
- <translation>nucleo Bitcoin</translation>
+ <source>Error</source>
+ <translation>Error</translation>
</message>
</context>
<context>
@@ -521,6 +359,14 @@
<source>Active command-line options that override above options:</source>
<translation>Activar las opciones de linea de comando que sobre escriben las siguientes opciones:</translation>
</message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>Cartera</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>Ninguno </translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
@@ -530,9 +376,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -543,18 +386,27 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
+ <message>
+ <source>Debug window</source>
+ <translation>Depurar ventana</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation>Monto:</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta</translation>
</message>
<message>
+ <source>&amp;Message:</source>
+ <translation>Mensaje:</translation>
+ </message>
+ <message>
<source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
<translation>Mensaje opcional para agregar a la solicitud de pago, el cual será mostrado cuando la solicitud este abierta. Nota: El mensaje no se manda con el pago a travéz de la red de Bitcoin.</translation>
</message>
@@ -566,54 +418,23 @@
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
<translation>Monto opcional a solicitar. Dejarlo vacion o en cero no solicita un monto especifico.</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copiar capa </translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>copiar monto</translation>
- </message>
-</context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>Domicilio</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Monto</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Monto</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
<message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Copiar dirección</translation>
</message>
</context>
<context>
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
- <translation>Mandar monedas</translation>
+ <translation>Enviar monedas</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation>Cantidad</translation>
</message>
<message>
<source>Bytes:</source>
@@ -632,76 +453,28 @@
<translation>Cuota:</translation>
</message>
<message>
- <source>Send to multiple recipients at once</source>
- <translation>Enviar a múltiples receptores a la vez</translation>
+ <source>After Fee:</source>
+ <translation>Después de los cargos por comisión. </translation>
</message>
<message>
- <source>Balance:</source>
- <translation>Saldo:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation>Confirme la acción de enviar</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirme para mandar monedas</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>copiar cantidad</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>copiar monto</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>copiar cuota</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>copiar despues de cuota</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>copiar prioridad</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>copiar cambio</translation>
- </message>
- <message>
- <source>or</source>
- <translation>o</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>El monto a pagar debe ser mayor a 0</translation>
+ <source>Change:</source>
+ <translation>Cambio</translation>
</message>
<message>
- <source>Transaction creation failed!</source>
- <translation>¡La creación de transacion falló!</translation>
+ <source>fast</source>
+ <translation>rápido</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 transación fue rechazada! Esto puede ocurrir si algunas de tus monedas en tu cartera han sido gastadas, al igual que si usas una cartera copiada y la monedas fueron gastadas en la copia pero no se marcaron como gastadas.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Advertencia: Dirección de Bitcoin invalida</translation>
+ <source>Send to multiple recipients at once</source>
+ <translation>Enviar a múltiples receptores a la vez</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
+ <source>Balance:</source>
+ <translation>Saldo:</translation>
</message>
<message>
- <source>Warning: Unknown change address</source>
- <translation>Advertencia: Cambio de dirección desconocido</translation>
+ <source>Confirm the send action</source>
+ <translation>Confirme la acción de enviar</translation>
</message>
</context>
<context>
@@ -715,10 +488,6 @@
<translation>Pagar &amp;a:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Ingrese una etiqueta para esta dirección para agregarlo en su libreta de direcciones.</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta</translation>
</message>
@@ -754,10 +523,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Apagando el nucleo de Bitcoin...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>No apague su computadora hasta que esta ventana desaparesca.</translation>
</message>
@@ -776,292 +541,62 @@
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
+ <message>
+ <source>Signature</source>
+ <translation>Firma</translation>
+ </message>
</context>
<context>
<name>SplashScreen</name>
- <message>
- <source>Bitcoin Core</source>
- <translation>nucleo Bitcoin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Los desarrolladores de Bitcoin Core</translation>
- </message>
</context>
<context>
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Abrir hasta %1</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/No confirmado</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmaciones</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Monto</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, no ha sido transmitido aun</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconocido</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalles de la transacción</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Este panel muestras una descripción detallada de la transacción</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Abrir hasta %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confimado (%1 confirmaciones)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Este bloque no fue recibido por ningun nodo y probablemente no fue aceptado !</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Sent to</source>
- <translation>Enviar a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pagar a si mismo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado </translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Fecha y hora en que la transacción fue recibida </translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Escriba una transacción</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Cantidad removida del saldo o agregada </translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Todo</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Hoy</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Esta semana </translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Este mes </translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>El mes pasado </translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Este año</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Recivido con</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviar a</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Para ti mismo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado </translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Otro</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Ingrese dirección o capa a buscar </translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Monto minimo </translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copiar dirección </translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar capa </translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>copiar monto</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Editar capa </translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Exportar el historial de transacción</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportación fallida</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Ocurrio un error intentando guardar el historial de transaciones a %1</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exportacion satisfactoria</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Arhchivo separado por comas (*.CSV)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmado </translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Domicilio</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>to</source>
- <translation>Para</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
+ <name>bitcoin-core</name>
<message>
- <source>No wallet has been loaded.</source>
- <translation>No se há cargado la cartera.</translation>
+ <source>Options:</source>
+ <translation>Opciones:</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>Mandar monedas</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportar</translation>
+ <source>Bitcoin Core</source>
+ <translation>nucleo Bitcoin</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportar la información en la tabla actual a un archivo</translation>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;categoria&gt; puede ser:</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Ocurrio un error tratando de guardar la información de la cartera %1</translation>
+ <source>Verifying blocks...</source>
+ <translation>Verificando bloques...</translation>
</message>
- </context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>&lt;category&gt; can be:</source>
- <translation>&lt;categoria&gt; puede ser:</translation>
+ <source>Verifying wallet...</source>
+ <translation>Verificando cartera...</translation>
</message>
<message>
<source>Wallet options:</source>
<translation>Opciones de cartera:</translation>
</message>
<message>
+ <source>Information</source>
+ <translation>Información </translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>Aviso</translation>
+ </message>
+ <message>
<source>Loading addresses...</source>
<translation>Cargando direcciones...</translation>
</message>
@@ -1077,5 +612,9 @@
<source>Done loading</source>
<translation>Carga completa</translation>
</message>
- </context>
+ <message>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_UY.ts b/src/qt/locale/bitcoin_es_UY.ts
index 5029333b5b..c565a63cd8 100644
--- a/src/qt/locale/bitcoin_es_UY.ts
+++ b/src/qt/locale/bitcoin_es_UY.ts
@@ -2,35 +2,36 @@
<context>
<name>AddressBookPage</name>
<message>
+ <source>Right-click to edit address or label</source>
+ <translation>Clic derecho para editar dirección o etiqueta</translation>
+ </message>
+ <message>
<source>Create a new address</source>
<translation>Crear una nueva dirección </translation>
</message>
<message>
- <source>Copy the currently selected address to the system clipboard</source>
- <translation>Copia la dirección seleccionada al portapapeles del sistema</translation>
+ <source>&amp;New</source>
+ <translation>Nuevo</translation>
</message>
<message>
- <source>&amp;Delete</source>
- <translation>&amp;Borrar</translation>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>Copia la dirección seleccionada al portapapeles del sistema</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivos separados por coma (*.csv)</translation>
+ <source>&amp;Copy</source>
+ <translation>Copiar</translation>
</message>
- </context>
-<context>
- <name>AddressTableModel</name>
<message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>C&amp;lose</source>
+ <translation>Cerrar</translation>
</message>
<message>
- <source>Address</source>
- <translation>Direccion </translation>
+ <source>&amp;Export</source>
+ <translation>Exportar</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(Sin etiqueta)</translation>
+ <source>&amp;Delete</source>
+ <translation>&amp;Borrar</translation>
</message>
</context>
<context>
@@ -47,63 +48,7 @@
<source>Repeat new passphrase</source>
<translation>Repetir nueva contraseña</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Monedero cifrado</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operacion necesita la contraseña del monedero para desbloquear el mismo</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Monedero destrabado</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operacion necesita la contraseña del monedero para descifrar el mismo</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Monedero descifrado</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambiar contraseña</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirme el cifrado del monedero</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Monedero cifrado</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Fallo en el cifrado del monedero</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Fallo en el cifrado del monedero a causa de un error interno. Su monedero no esta cifrado</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Las contraseñas suministradas no coinciden.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Fallo en el desbloqueo del mondero</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contraseña introducida para el descifrado del monedero es incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Fallo en el descifrado del monedero</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -130,18 +75,58 @@
<translation>Buscar en el historial de transacciones</translation>
</message>
<message>
+ <source>E&amp;xit</source>
+ <translation>Salida</translation>
+ </message>
+ <message>
<source>Quit application</source>
<translation>Salir de la aplicacion </translation>
</message>
<message>
+ <source>Show information about Qt</source>
+ <translation>Mostrar informacioón sobre</translation>
+ </message>
+ <message>
<source>&amp;Options...</source>
<translation>&amp;Opciones...</translation>
</message>
<message>
+ <source>&amp;Backup Wallet...</source>
+ <translation>Respaldar Billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase...</source>
+ <translation>Cambiar contraseña</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses...</source>
+ <translation>Enviando direcciones</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Recibiendo direcciones</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation>Enviar monedas a una dirección Bitcoin</translation>
+ </message>
+ <message>
<source>Change the passphrase used for wallet encryption</source>
<translation>Cambie la clave utilizada para el cifrado del monedero</translation>
</message>
<message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>Billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <translation>Mostrar / Ocultar</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation>&amp;Archivo</translation>
</message>
@@ -158,6 +143,18 @@
<translation>Barra de herramientas</translation>
</message>
<message>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>Alerta</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Información</translation>
+ </message>
+ <message>
<source>Up to date</source>
<translation>A la fecha</translation>
</message>
@@ -166,6 +163,17 @@
<translation>Ponerse al dia...</translation>
</message>
<message>
+ <source>Type: %1
+</source>
+ <translation>Tipo: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Dirección: %1</translation>
+ </message>
+ <message>
<source>Sent transaction</source>
<translation>Transaccion enviada</translation>
</message>
@@ -183,56 +191,53 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
- <source>Date</source>
- <translation>Fecha</translation>
+ <source>Quantity:</source>
+ <translation>Cantidad:</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(Sin etiqueta)</translation>
+ <source>Bytes:</source>
+ <translation>Bytes:</translation>
</message>
- </context>
-<context>
- <name>EditAddressDialog</name>
<message>
- <source>Edit Address</source>
- <translation>Editar dirección</translation>
+ <source>Amount:</source>
+ <translation>AMonto:</translation>
</message>
<message>
- <source>&amp;Label</source>
- <translation>&amp;Etiqueta</translation>
+ <source>Priority:</source>
+ <translation>Prioridad:</translation>
</message>
<message>
- <source>&amp;Address</source>
- <translation>&amp;Direccion </translation>
+ <source>Change:</source>
+ <translation>Cambio:</translation>
</message>
<message>
- <source>New receiving address</source>
- <translation>Nueva dirección de recepción </translation>
+ <source>Date</source>
+ <translation>Fecha</translation>
</message>
<message>
- <source>New sending address</source>
- <translation>Nueva dirección de envío </translation>
+ <source>Confirmed</source>
+ <translation>Confirmado</translation>
</message>
<message>
- <source>Edit receiving address</source>
- <translation>Editar dirección de recepcion </translation>
+ <source>Priority</source>
+ <translation>Prioridad</translation>
</message>
+</context>
+<context>
+ <name>EditAddressDialog</name>
<message>
- <source>Edit sending address</source>
- <translation>Editar dirección de envío </translation>
+ <source>Edit Address</source>
+ <translation>Editar dirección</translation>
</message>
<message>
- <source>Could not unlock wallet.</source>
- <translation>No se puede abrir el monedero.</translation>
+ <source>&amp;Label</source>
+ <translation>&amp;Etiqueta</translation>
</message>
<message>
- <source>New key generation failed.</source>
- <translation>Fallo en la nueva clave generada.</translation>
+ <source>&amp;Address</source>
+ <translation>&amp;Direccion </translation>
</message>
</context>
<context>
@@ -243,6 +248,10 @@
</context>
<context>
<name>Intro</name>
+ <message>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
</context>
<context>
<name>OpenURIDialog</name>
@@ -253,6 +262,10 @@
<source>Options</source>
<translation>Opciones</translation>
</message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>Billetera</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
@@ -262,19 +275,17 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
+ <message>
+ <source>&amp;Information</source>
+ <translation>Información</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -286,34 +297,35 @@
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Direccion </translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>Copy &amp;Address</source>
+ <translation>Copiar Dirección</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
+ <name>SendCoinsDialog</name>
<message>
- <source>Date</source>
- <translation>Fecha</translation>
+ <source>Send Coins</source>
+ <translation>Enviar monedas</translation>
</message>
<message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>Quantity:</source>
+ <translation>Cantidad:</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(Sin etiqueta)</translation>
+ <source>Bytes:</source>
+ <translation>Bytes:</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation>Enviar monedas</translation>
+ <source>Amount:</source>
+ <translation>AMonto:</translation>
+ </message>
+ <message>
+ <source>Priority:</source>
+ <translation>Prioridad:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>Cambio:</translation>
</message>
<message>
<source>Send to multiple recipients at once</source>
@@ -327,18 +339,6 @@
<source>Confirm the send action</source>
<translation>Confirmar el envío</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirmar el envio de monedas</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>La cantidad a pagar debe ser mayor que 0.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Sin etiqueta)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -351,10 +351,6 @@
<translation>Pagar &amp;A:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Introduzca una etiqueta para esta dirección para añadirla a su libreta de direcciones</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -370,6 +366,10 @@
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Pagar A:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -400,74 +400,28 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Abrir hasta %1</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconocido</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Abrir hasta %1</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
+ <name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>TransactionView</name>
+ <name>bitcoin-core</name>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivos separados por coma (*.csv)</translation>
+ <source>Options:</source>
+ <translation>Opciones:</translation>
</message>
<message>
- <source>Date</source>
- <translation>Fecha</translation>
+ <source>Information</source>
+ <translation>Información</translation>
</message>
<message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>Warning</source>
+ <translation>Alerta</translation>
</message>
<message>
- <source>Address</source>
- <translation>Direccion </translation>
- </message>
- </context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- </context>
-<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Enviar monedas</translation>
+ <source>Error</source>
+ <translation>Error</translation>
</message>
</context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
- <name>bitcoin-core</name>
- </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_VE.ts b/src/qt/locale/bitcoin_es_VE.ts
index f9db056553..432adc57ee 100644
--- a/src/qt/locale/bitcoin_es_VE.ts
+++ b/src/qt/locale/bitcoin_es_VE.ts
@@ -22,8 +22,8 @@
<translation>&amp;Copiar</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiar Dirección</translation>
+ <source>C&amp;lose</source>
+ <translation>C&amp;errar</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -41,65 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Borrar</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Elige la dirección para enviar monedas</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Elige la dirección para recibir monedas</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Envío de direcciones</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Recepción de direcciones</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>Estas son tus direcciones Bitcoin para realizar pagos. Siempre checa el monto y la dirección de recepción antes de enviar 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 tus direcciones Bitcoin para recibir pagos. Es recomendable usar una nueva dirección para cada transacción.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copiar &amp;Etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editar</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportar lista de direcciones</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivo separado por comas (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportación fallida</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -119,86 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Repetir nueva frase de contraseña</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Encriptar billetera</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operación necesita tu frase de contraseña de la billetera para desbloquearla.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquear billetera</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operacción necesita tu frase de contraseña para desepcriptar la billetera</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desencriptar billetera</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambiar frase secreta</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmar encriptación de billetera</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation>Aviso: Si encriptas tu billetera y pierdes tu frase secreta, ¡PERDERÃS TODOS TUS BITCOINS!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>¿Está seguro que desea encriptar su billetera?</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: Algunas copias de seguridad que hayas hecho de tu archivo de billetera deberían ser reemplazadas con la billetera encriptada generada recientemente. Por razones de seguridad, las copias de seguridad previas del archivo de billetera sin cifrar serán inútiles tan pronto uses la nueva billetera encriptada.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Aviso: El bloqueo de mayúsculas está activado.</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Billetera encriptada</translation>
- </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>Introduce la nueva frase secreta a la billetera. Por favor use una frase secreta de diez o más caracteres aleatorios, u ocho o más palabras.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Encriptación de billetera fallida</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Encriptación de billetera fallida debido a un error interno. Tu billetera no fue encriptada.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Las frases secretas introducidas no concuerdan.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Desbloqueo de billetera fallido</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La frase secreta introducida para la desencriptación de la billetera fué incorrecta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Desencriptación de billetera fallida</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>La frase secreta de la billetera fué cambiada exitosamente.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -230,16 +91,20 @@
<translation>Buscar historial de transacciones</translation>
</message>
<message>
+ <source>E&amp;xit</source>
+ <translation>S&amp;alir</translation>
+ </message>
+ <message>
<source>Quit application</source>
<translation>Quitar aplicación</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Cliente Bitcoin Core</translation>
+ <source>&amp;Options...</source>
+ <translation>&amp;Opciones...</translation>
</message>
<message>
- <source>Importing blocks from disk...</source>
- <translation>Importando bloques desde el disco...</translation>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Recepción de direcciones</translation>
</message>
<message>
<source>Reindexing blocks on disk...</source>
@@ -278,10 +143,6 @@
<translation>&amp;Recibir</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Mostrar información acerca de Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Mostar / Ocultar</translation>
</message>
@@ -310,8 +171,8 @@
<translation>&amp;Configuración</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <source>&amp;Command-line options</source>
+ <translation>Opciones de línea de comandos</translation>
</message>
<message>
<source>%1 and %2</source>
@@ -367,13 +228,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta de red</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -447,134 +301,6 @@
<source>Priority</source>
<translation>Prioridad</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar monto</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de la transacción</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloqueo no gastado</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Desbloqueo no gastado</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar comisión</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridad</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copiar dust</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar cambio</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>Más alto</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>superior</translation>
- </message>
- <message>
- <source>high</source>
- <translation>alto</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medio-alto</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>medio</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>bajo-medio</translation>
- </message>
- <message>
- <source>low</source>
- <translation>bajo</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>inferior</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>más bajo</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloqueado)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>ninguno</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Puede variar +/- %1 satoshi(s) por entrada.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>si</translation>
- </message>
- <message>
- <source>no</source>
- <translation>no</translation>
- </message>
- <message>
- <source>This means a fee of at least %1 per kB is required.</source>
- <translation>Esto significa que se requiere al menos de una comisión de %1 por kB</translation>
- </message>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Puede variar +/- 1 byte por entrada.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transacciones con mayor prioridad son más probables de ser incluidas en un bloque.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>Cambio desde %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(cambio)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -598,38 +324,6 @@
<source>&amp;Address</source>
<translation>&amp;Dirección</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nueva dirección de recibo</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nueva dirección de envío</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editar dirección de envío</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editar dirección de envío</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>La dirección introducida "%1" ya está en el libro de direcciones.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>La dirección introducida "%1" no es una dirección Bitcoin válida.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>No se pudo desbloquear la billetera.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Creación de la nueva llave fallida</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -657,10 +351,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>versión</translation>
</message>
@@ -669,10 +359,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Acerca de Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Opciones de línea de comandos</translation>
</message>
@@ -684,14 +370,10 @@
<source>command-line options</source>
<translation>opciones de línea de comandos</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<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 descargará y almacenará una copia de la cadena de bloques Bitcoin. Al menos %1GB de datos serán almacenados en este directorio, y crecerá con el tiempo. La billetera será también almacenada en este directorio.</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>Usar el directorio de datos por defecto</translation>
</message>
@@ -700,10 +382,6 @@
<translation>Usa un directorio de datos personalizado:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Error: Directorio de datos especificado "%1" no puede ser creado.</translation>
</message>
@@ -730,10 +408,6 @@
<source>Select payment request file</source>
<translation>Seleccionar archivo de solicitud de pago</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Seleccionar archivo de solicitud de pago para abrir</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -746,15 +420,32 @@
<translation>&amp;Main</translation>
</message>
<message>
+ <source>&amp;Network</source>
+ <translation>&amp;Red</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>Billetera</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation>Experto</translation>
+ </message>
+ <message>
<source>none</source>
<translation>ninguno</translation>
</message>
</context>
<context>
<name>OverviewPage</name>
- </context>
-<context>
- <name>PaymentServer</name>
+ <message>
+ <source>Available:</source>
+ <translation>Disponible:</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation>Pendiente:</translation>
+ </message>
</context>
<context>
<name>PeerTableModel</name>
@@ -767,54 +458,40 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
- </context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar monto</translation>
- </message>
-</context>
-<context>
- <name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Dirección</translation>
+ <source>&amp;Information</source>
+ <translation>Información</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Monto</translation>
+ <source>In:</source>
+ <translation>Entrada:</translation>
</message>
<message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>Out:</source>
+ <translation>Salida:</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
+ <name>ReceiveCoinsDialog</name>
<message>
- <source>Date</source>
- <translation>Fecha</translation>
+ <source>&amp;Amount:</source>
+ <translation>Monto:</translation>
</message>
<message>
- <source>Label</source>
- <translation>Etiqueta</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;Etiqueta:</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Monto</translation>
+ <source>Show</source>
+ <translation>Mostrar</translation>
</message>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
<message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Copiar Dirección</translation>
</message>
</context>
<context>
@@ -847,43 +524,19 @@
<source>Dust:</source>
<translation>Polvo:</translation>
</message>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
<message>
- <source>Copy quantity</source>
- <translation>Copiar cantidad</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar monto</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar comisión</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridad</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar cambio</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sin etiqueta)</translation>
+ <source>A&amp;mount:</source>
+ <translation>Monto:</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation>Copiar dust</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;Etiqueta:</translation>
</message>
</context>
<context>
- <name>SendCoinsEntry</name>
- </context>
-<context>
<name>ShutdownWindow</name>
</context>
<context>
@@ -891,111 +544,17 @@
</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>Fecha</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Monto</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Copy address</source>
- <translation>Copiar dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar monto</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de la transacción</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportación fallida</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Archivo separado por comas (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmado</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Fecha</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportar</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportar los datos en la pestaña actual a un archivo</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Copia de seguridad fallida</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Copia de seguridad completada</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1022,6 +581,10 @@
<translation>Correr en segundo plano como daemon y aceptar comandos</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Enlazar dirección dada y siempre escuchar en ella. Usar [host]:port notación para IPv6</translation>
</message>
@@ -1046,10 +609,6 @@
<translation>Esta es una compilación de prueba pre-lanzamiento - use bajo su propio riesgo - no utilizar para aplicaciones de minería o mercantes</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Deshabilitar para enlezar a %s en esta computadora. Bitcoin Core probablemente ya está ejecutándose.</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Aviso: ¡La red no parece estar totalmente de acuerdo! Algunos mineros parecen estar teniendo inconvenientes.</translation>
</message>
@@ -1058,10 +617,6 @@
<translation>Aviso: ¡No parecen estar totalmente de acuerdo con nuestros compañeros! Puede que tengas que actualizar, u otros nodos tengan que actualizarce.</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>Aviso: wallet.dat está corrupto, ¡datos salvados! wallet.dat original guardado como wallet.{timestamp}.bak en %s; si tus transacciones o balance está incorrecto deberías restaurarlo desde una copia de seguridad.</translation>
- </message>
- <message>
<source>Information</source>
<translation>Información</translation>
</message>
diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts
index 1d6d1b89e5..0d659fd719 100644
--- a/src/qt/locale/bitcoin_et.ts
+++ b/src/qt/locale/bitcoin_et.ts
@@ -22,10 +22,6 @@
<translation>S&amp;ulge</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopeeri Aadress</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Kustuta märgistatud aadress loetelust</translation>
</message>
@@ -41,45 +37,6 @@
<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>
- <message>
- <source>Copy &amp;Label</source>
- <translation>&amp;Märgise kopeerimine</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Muuda</translation>
- </message>
- <message>
- <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>
- <message>
- <source>Label</source>
- <translation>Silt</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Aadress</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(silti pole)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -99,82 +56,6 @@
<source>Repeat new passphrase</source>
<translation>Korda salafraasi</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Krüpteeri rahakott</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>See toiming nõuab sinu rahakoti salafraasi.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Tee rahakott lukust lahti.</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>See toiming nõuab sinu rahakoti salafraasi.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dekrüpteeri rahakott.</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Muuda salafraasi</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Kinnita rahakoti krüpteering</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>Hoiatus: Kui sa kaotad oma, rahakoti krüpteerimisel kasutatud, salafraasi, siis &lt;b&gt;KAOTAD KA KÕIK OMA BITCOINID&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Kas soovid oma rahakoti krüpteerida?</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>TÄHTIS: Kõik varasemad rahakoti varundfailid tuleks üle kirjutada äsja loodud krüpteeritud rahakoti failiga. Turvakaalutlustel tühistatakse krüpteerimata rahakoti failid alates uue, krüpteeritud rahakoti, kasutusele võtust.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Hoiatus: Caps Lock on sisse lülitatud!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Rahakott krüpteeritud</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Tõrge rahakoti krüpteerimisel</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Rahakoti krüpteering ebaõnnestus tõrke tõttu. Sinu rahakotti ei krüpteeritud.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Salafraasid ei kattu.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Rahakoti avamine ebaõnnestus</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Rahakoti salafraas ei ole õige.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Rahakoti dekrüpteerimine ei õnnestunud</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Rahakoti salafraasi muutmine õnnestus.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -242,10 +123,6 @@
<translation>Ava &amp;URI...</translation>
</message>
<message>
- <source>Importing blocks from disk...</source>
- <translation>Impordi blokid kettalt...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Kettal olevate blokkide re-indekseerimine...</translation>
</message>
@@ -326,8 +203,8 @@
<translation>Vahelehe tööriistariba</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoini tuumik</translation>
+ <source>&amp;Command-line options</source>
+ <translation>Käsurea valikud</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
@@ -429,13 +306,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Võrgu Häire</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -461,70 +331,6 @@
<source>Confirmed</source>
<translation>Kinnitatud</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Aadressi kopeerimine</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Märgise kopeerimine</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopeeri summa</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <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>
</context>
<context>
<name>EditAddressDialog</name>
@@ -540,38 +346,6 @@
<source>&amp;Address</source>
<translation>&amp;Aadress</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Uus sissetulev aadress</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Uus väljaminev aadress</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Sissetulevate aadresside muutmine</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Väljaminevate aadresside muutmine</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Selline aadress on juba olemas: "%1"</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Sisestatud aadress "%1" ei ole Bitcoinis kehtiv.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Rahakotti ei avatud</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Tõrge uue võtme loomisel.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -583,18 +357,10 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoini tuumik</translation>
- </message>
- <message>
<source>version</source>
<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>
@@ -606,7 +372,7 @@
<source>command-line options</source>
<translation>käsurea valikud</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -614,10 +380,6 @@
<translation>Teretulemast</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoini tuumik</translation>
- </message>
- <message>
<source>Error</source>
<translation>Tõrge</translation>
</message>
@@ -640,6 +402,10 @@
<translation>Valikud</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation>&amp;Peamine</translation>
+ </message>
+ <message>
<source>MB</source>
<translation>MB</translation>
</message>
@@ -760,17 +526,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI käsitsemine</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Bitcoin ei käivitu: vajuta-maksa toiming</translation>
- </message>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -785,19 +540,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>Save QR Code</source>
- <translation>Salvesta QR kood</translation>
- </message>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Kliendi nimi</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -810,12 +554,12 @@
<translation>&amp;Informatsioon</translation>
</message>
<message>
- <source>General</source>
- <translation>Ãœldine</translation>
+ <source>Debug window</source>
+ <translation>Debugimise aken</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Kasutan OpenSSL versiooni</translation>
+ <source>General</source>
+ <translation>Ãœldine</translation>
</message>
<message>
<source>Startup time</source>
@@ -874,10 +618,6 @@
<translation>&amp;Konsool</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Valmistusaeg</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Debugimise logifail</translation>
</message>
@@ -932,77 +672,14 @@
<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>
</context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Aadress</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kogus</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Silt</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Sõnum</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Tulemuseks on liiga pikk URL, püüa lühendada märgise/teate teksti.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Tõrge URI'st QR koodi loomisel</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Kuupäev</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Silt</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Sõnum</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kogus</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(silti pole)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(sõnum puudub)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(summa puudub)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Kopeeri Aadress</translation>
</message>
-</context>
+ </context>
<context>
<name>SendCoinsDialog</name>
<message>
@@ -1010,6 +687,10 @@
<translation>Müntide saatmine</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>Liiga suur summa</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Kogus:</translation>
</message>
@@ -1022,6 +703,10 @@
<translation>Tasu:</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Tehingu tasu:</translation>
+ </message>
+ <message>
<source>Choose...</source>
<translation>Vali...</translation>
</message>
@@ -1065,39 +750,7 @@
<source>S&amp;end</source>
<translation>S&amp;aada</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Müntide saatmise kinnitamine</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopeeri summa</translation>
- </message>
- <message>
- <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>
- <translation>Makstav summa peab olema suurem kui 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Summa ületab jäägi.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Summa koos tehingu tasuga %1 ületab sinu jääki.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(silti pole)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -1109,10 +762,6 @@
<translation>Maksa &amp;:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Aadressiraamatusse sisestamiseks märgista aadress</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Märgis</translation>
</message>
@@ -1132,6 +781,10 @@
<source>Message:</source>
<translation>Sõnum:</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Maksa :</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -1202,70 +855,10 @@
<source>Reset all verify message fields</source>
<translation>Tühjenda kõik sõnumi kinnitamise väljad</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Signatuuri genereerimiseks vajuta "Allkirjasta Sõnum"</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Sisestatud aadress ei kehti.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Palun kontrolli aadressi ning proovi uuesti.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Sisestatud aadress ei viita võtmele.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Rahakoti avamine katkestati.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Sisestatud aadressi privaatvõti ei ole saadaval.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Sõnumi signeerimine ebaõnnestus.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Sõnum signeeritud.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Signatuuri ei õnnestunud dekodeerida.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Palun kontrolli signatuuri ning proovi uuesti.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Signatuur ei kattunud sõnumi kokkuvõttega.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Sõnumi kontroll ebaõnnestus.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Sõnum kontrollitud.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <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>
@@ -1278,362 +871,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Avatud kuni %1</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/kinnitamata</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 kinnitust</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Staatus</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Kuupäev</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Allikas</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Genereeritud</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Saatja</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Saaja</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>oma aadress</translation>
- </message>
- <message>
- <source>label</source>
- <translation>märgis</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Krediit</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>mitte aktsepteeritud</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Deebet</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Tehingu tasu</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Neto summa</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Sõnum</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Kommentaar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Tehingu ID</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Debug'imise info</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Tehing</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Sisendid</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kogus</translation>
- </message>
- <message>
- <source>true</source>
- <translation>õige</translation>
- </message>
- <message>
- <source>false</source>
- <translation>vale</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, veel esitlemata</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>tundmatu</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Tehingu üksikasjad</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Paan kuvab tehingu detailid</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Kuupäev</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tüüp</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Avatud kuni %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Kinnitatud (%1 kinnitust)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Antud klotsi pole saanud ükski osapool ning tõenäoliselt seda ei aktsepteerita!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Loodud, kuid aktsepteerimata</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Silt</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Saadud koos</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Kellelt saadud</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Saadetud</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Makse iseendale</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Mine'itud</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Tehingu staatus. Kinnituste arvu kuvamiseks liigu hiire noolega selle peale.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Tehingu saamise kuupäev ning kellaaeg.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tehingu tüüp.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Jäägile lisatud või eemaldatud summa.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Kõik</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Täna</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Jooksev nädal</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Jooksev kuu</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Eelmine kuu</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Jooksev aasta</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Ulatus...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Saadud koos</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Saadetud</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Iseendale</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Mine'itud</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Muu</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Otsimiseks sisesta märgis või aadress</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Vähim summa</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Aadressi kopeerimine</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Märgise kopeerimine</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopeeri summa</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopeeri tehingu ID</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Märgise muutmine</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>Kinnitatud</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Kuupäev</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tüüp</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Silt</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Aadress</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Ulatus:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>saaja</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Müntide saatmine</translation>
- </message>
-</context>
-<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>
- <message>
- <source>Backup Wallet</source>
- <translation>Varundatud Rahakott</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Rahakoti andmed (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Varundamine nurjus</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Varundamine õnnestus</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1664,6 +911,10 @@
<translation>Luba välisühendusi (vaikeväärtus: 1 kui puudub -proxy või -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoini tuumik</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>
@@ -1676,10 +927,6 @@
<translation>See on test-versioon - kasutamine omal riisikol - ära kasuta mining'uks ega kaupmeeste programmides</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>Hoiatus: toimus wallet.dat faili andmete päästmine! Originaal wallet.dat nimetati kaustas %s ümber wallet.{ajatempel}.bak'iks, jäägi või tehingute ebakõlade puhul tuleks teha backup'ist taastamine.</translation>
- </message>
- <message>
<source>Block creation options:</source>
<translation>Blokeeri loomise valikud:</translation>
</message>
@@ -1732,6 +979,10 @@
<translation>Rahakoti valikud:</translation>
</message>
<message>
+ <source>(default: %u)</source>
+ <translation>(vaikimisi: %u)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Informatsioon</translation>
</message>
@@ -1772,10 +1023,6 @@
<translation>Hoiatus</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat fail on katki, päästmine ebaõnnestus</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>JSON-RPC ühenduste salasõna</translation>
</message>
@@ -1784,10 +1031,6 @@
<translation>Käivita käsklus, kui parim plokk muutub (käskluse %s asendatakse ploki hash'iga)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Käesolev abitekst</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>-addnode, -seednode ja -connect tohivad kasutada DNS lookup'i</translation>
</message>
@@ -1796,18 +1039,10 @@
<translation>Aadresside laadimine...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Vigane -proxi aadress: '%s'</translation>
</message>
@@ -1816,18 +1051,6 @@
<translation>Kirjeldatud tundmatu võrgustik -onlynet'is: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Tundmatu -bind aadress: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Tundmatu -externalip aadress: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>-paytxfee=&lt;amount&gt; jaoks vigane kogus: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Liiga suur summa</translation>
</message>
diff --git a/src/qt/locale/bitcoin_eu_ES.ts b/src/qt/locale/bitcoin_eu_ES.ts
index 4da6cc0dce..cbe246f443 100644
--- a/src/qt/locale/bitcoin_eu_ES.ts
+++ b/src/qt/locale/bitcoin_eu_ES.ts
@@ -26,10 +26,6 @@
<translation>&amp;Itxi</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopiatu helbidea</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Ezabatu aukeratutako helbideak listatik</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Ezabatu</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Aukeratu helbidea txanponak bidaltzeko</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Aukeratu helbidea txanponak jasotzeko</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Aukeratu</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Helbideak bidaltzen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Helbideak jasotzen</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Hauek dira zure Bitcoin helbideak dirua bidaltzeko. Beti egiaztatu diru-kantitatea eta jasotzeko helbidea bidali baino lehen.</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>Hauek dira zure Bitcoin helbideak dirua jasotzeko. Gomendagarria da erabiltzea jasotzeko helbide berri bat operazio bakoitzeko.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopiatu &amp;Etiketa</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editatu</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Esportatu helbide lista</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Komaz bereizitako artxiboa (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Esportatua okerra</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Errakuntza bat egon da gordetzen %1 helbide listan. Mesedez, saiatu berriro.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiketa</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Helbidea</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(etiketarik ez)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,79 +60,7 @@
<source>Repeat new passphrase</source>
<translation>Errepikatu pasahitz berria</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Enkriptatu zorroa</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Eragiketa honek zorroaren pasahitza behar du zorroa desblokeatzeko.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desblokeatu zorroa</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Eragiketa honek zure zorroaren pasahitza behar du, zorroa desenkriptatzeko.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desenkriptatu zorroa</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Aldatu pasahitza</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Berretsi zorroaren enkriptazioa</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>Abisua: Zuk enkriptatzen baduzu zure diruzorroa eta zure pasahitza galtzen baduzu, &lt;b&gt;BITCOIN GUZTIAK GALDUKO DITUZU&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Seguru zaude nahi duzula zure diruzorroa enkriptatu?</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 orain itxiko da enkriptazio prozezua amaitzeko. Gogoratu enkriptatzean zure diruzorroa ez duzula guztiz babesten zure Bitcoinak lapurretatik infektatzen zure ordenagailua Malwareekin.</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>GARRANTZITSUA: Aurreko seguritate-kopiak ordeztuko dire berriekin, enkriptatutak. Segurtasun arrazoigaitik, aurreko kopiak ezin dira erabili hasiko zarenean zure diruzorro enkriptatu berriarekin.</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Zorroa enkriptatuta</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Zorroaren enkriptazioak huts egin du</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Zorroaren enkriptazioak huts egin du barne-errore baten ondorioz. Zure zorroa ez da enkriptatu.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Eman dituzun pasahitzak ez datoz bat.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Zorroaren desblokeoak huts egin du</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Zorroa desenkriptatzeko sartutako pasahitza okerra da.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Zorroaren desenkriptazioak huts egin du</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -250,6 +107,10 @@
<translation>&amp;Aukerak...</translation>
</message>
<message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Helbideak jasotzen</translation>
+ </message>
+ <message>
<source>Change the passphrase used for wallet encryption</source>
<translation>Aldatu zorroa enkriptatzeko erabilitako pasahitza</translation>
</message>
@@ -295,9 +156,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
@@ -311,18 +169,6 @@
<source>Date</source>
<translation>Data</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopiatu helbidea</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiatu etiketa</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(etiketarik ez)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -338,34 +184,6 @@
<source>&amp;Address</source>
<translation>&amp;Helbidea</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Jasotzeko helbide berria</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Bidaltzeko helbide berria</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editatu jasotzeko helbidea</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editatu bidaltzeko helbidea</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Sartu berri den helbidea, "%1", helbide-liburuan dago jadanik.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ezin desblokeatu zorroa.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Gako berriaren sorrerak huts egin du.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -394,9 +212,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -407,54 +222,28 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation>Kopurua</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Etiketa:</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Kopiatu etiketa</translation>
+ <source>&amp;Message:</source>
+ <translation>Mezua</translation>
</message>
</context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Helbidea</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kopurua</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiketa</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiketa</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kopurua</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(etiketarik ez)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Kopiatu helbidea</translation>
</message>
</context>
<context>
@@ -479,18 +268,6 @@
<source>Confirm the send action</source>
<translation>Berretsi bidaltzeko ekintza</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Berretsi txanponak bidaltzea</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Ordaintzeko kopurua 0 baino handiagoa izan behar du.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(etiketarik ez)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -503,10 +280,6 @@
<translation>Ordaindu &amp;honi:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Sartu etiketa bat helbide honetarako, eta gehitu zure helbide-liburuan</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiketa:</translation>
</message>
@@ -526,6 +299,10 @@
<source>Message:</source>
<translation>Mezua</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Ordaindu honi:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -556,240 +333,22 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Zabalik %1 arte</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/konfirmatu gabe</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 konfirmazioak</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kopurua</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ez da arrakastaz emititu oraindik</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>ezezaguna</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transakzioaren xehetasunak</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Panel honek transakzioaren deskribapen xehea erakusten du</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Mota</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Zabalik %1 arte</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Konfirmatuta (%1 konfirmazio)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Bloke hau ez du beste inongo nodorik jaso, eta seguruenik ez da onartuko!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Sent to</source>
- <translation>Hona bidalia: </translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Ordainketa zeure buruari</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Bildua</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Transakzioaren egoera. Pasatu sagua gainetik konfirmazio kopurua ikusteko.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Transakzioa jasotako data eta ordua.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Transakzio mota.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Saldoan kendu edo gehitutako kopurua.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Denak</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Gaur</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Aste honetan</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Hil honetan</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Azken hilean</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Aurten</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Muga...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Jasota honekin: </translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Hona bidalia: </translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Zeure buruari</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Bildua</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Beste</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Sartu bilatzeko helbide edo etiketa</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Kopuru minimoa</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopiatu helbidea</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiatu etiketa</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Esportatua okerra</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Komaz bereizitako artxiboa (*.csv)</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Mota</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiketa</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Helbidea</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Bidali txanponak</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Esportatu</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Esportatu datuak uneko fitxategian</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
<translation>Aukerak</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Laguntza mezu hau</translation>
- </message>
- <message>
<source>Rescanning...</source>
<translation>Birbilatzen...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts
index 3ef9766604..98543ded46 100644
--- a/src/qt/locale/bitcoin_fa.ts
+++ b/src/qt/locale/bitcoin_fa.ts
@@ -15,27 +15,23 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation>Ú©Ù¾ÛŒ نشانی انتخاب شده به حاÙظهٔ سیستم</translation>
+ <translation>Ú©Ù¾ÛŒ نشانی انتخاب شده کنونی به حاÙظه‌ی سیستم</translation>
</message>
<message>
<source>&amp;Copy</source>
- <translation>&amp;رونوشت</translation>
+ <translation>&amp;کپی</translation>
</message>
<message>
<source>C&amp;lose</source>
<translation>&amp;بستن</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;کپی نشانی</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
- <translation>حذ٠نشانی انتخاب‌شده از لیست</translation>
+ <translation>حذ٠نشانی انتخاب‌شده کنونی از لیست</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>خروجی گرÙتن داده‌های برگهٔ Ùعلی به یک پرونده</translation>
+ <translation>خروجی گرÙتن داده‌های برگه‌ی Ùعلی به یک Ùایل</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -45,69 +41,6 @@
<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>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>
- <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>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;ویرایش</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>استخراج لیست آدرس</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>پروندهٔ نوع CSV جداشونده با کاما (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>استخراج انجام نشد</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>آدرس</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(بدون برچسب)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -127,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>تکرار گذرواژهٔ جدید</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>رمزنگاری کی٠پول</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>انجام این عملیات نیازمند گذرواژهٔ کی٠پول شما برای باز کردن Ù‚ÙÙ„ آن است.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>باز کردن Ù‚ÙÙ„ کی٠پول</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>انجام این عملیات نیازمند گذرواژهٔ کی٠پول شما برای رمزگشایی کردن آن است.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>رمزگشایی کی٠پول</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>تغییر گذرواژه</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>هشدار: کلید Caps Lock روشن است!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>کی٠پول رمزنگاری شد</translation>
- </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>رمز جدید کی٠پول خود را وارد کنید.&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>
- <translation>رمزنگاری کی٠پول با شکست مواجه شد</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>رمزنگاری کی٠پول بنا به یک خطای داخلی با شکست مواجه شد. کی٠پول شما رمزنگاری نشد.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>گذرواژه‌های داده شده با هم تطابق ندارند.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>بازگشایی Ù‚ÙÙ„ Ú©ÛŒÙ‌پول با شکست مواجه شد</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>گذرواژهٔ وارد شده برای رمزگشایی کی٠پول نادرست بود.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>رمزگشایی ناموÙÙ‚ کی٠پول</translation>
+ <source>IP/Netmask</source>
+ <translation>آی‌پی/نت‌ماسک</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>گذرواژهٔ کی٠پول با موÙقیت عوض شد.</translation>
+ <source>Banned Until</source>
+ <translation>مسدود شده تا</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -258,6 +111,14 @@
<translation>خروج از برنامه</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;حدود%1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>نمایش اطلاعات دربارهٔ %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>دربارهٔ &amp;کیوت</translation>
</message>
@@ -294,10 +155,6 @@
<translation>باز کردن &amp;آدرس</translation>
</message>
<message>
- <source>Importing blocks from disk...</source>
- <translation>دریاÙت بلوک‌ها از دیسک...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>بازنشانی بلوک‌ها روی دیسک...</translation>
</message>
@@ -342,10 +199,6 @@
<translation>&amp;دریاÙت</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>نمایش اطلاعات در مورد بیت‌کوین</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;نمایش/ عدم نمایش</translation>
</message>
@@ -382,14 +235,6 @@
<translation>نوارابزار برگه‌ها</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation> هسته Bitcoin </translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>درباره هسته ی بیت کوین</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>نمایش لیست آدرس های ارسال و لیبل ها</translation>
</message>
@@ -397,6 +242,10 @@
<source>Show the list of used receiving addresses and labels</source>
<translation>نمایش لیست آدرس های دریاÙت Ùˆ لیبل ها</translation>
</message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation>گزینه‌های خط‌Ùرمان</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n ارتباط Ùعال با شبکهٔ بیت‌کوین</numerusform></translation>
@@ -418,6 +267,14 @@
<translation><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></translation>
+ </message>
+ <message>
<source>%1 behind</source>
<translation>%1 عقب‌تر</translation>
</message>
@@ -450,6 +307,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>
@@ -467,13 +354,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>پیام شبکه</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -508,6 +388,10 @@
<translation>پول خورد:</translation>
</message>
<message>
+ <source>(un)select all</source>
+ <translation>(لغو)انتخاب همه</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation>مدل درختی</translation>
</message>
@@ -543,78 +427,6 @@
<source>Priority</source>
<translation>اولویت</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>کپی نشانی</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>کپی برچسب</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>کپی مقدار</translation>
- </message>
- <message>
- <source>Copy transaction ID</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>none</source>
- <translation>هیچکدام</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>بله</translation>
- </message>
- <message>
- <source>no</source>
- <translation>خیر</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(بدون برچسب)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(تغییر)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -630,38 +442,6 @@
<source>&amp;Address</source>
<translation>&amp;نشانی</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>نشانی دریاÙتی جدید</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>نشانی ارسالی جدید</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>ویرایش نشانی دریاÙتی</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>ویرایش نشانی ارسالی</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>نشانی وارد شده «%1» در حال حاضر در دÙترچه وجود دارد.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>نشانی وارد شده «%1» یک نشانی معتبر بیت‌کوین نیست.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>نمی‌توان کی٠پول را رمزگشایی کرد.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>ایجاد کلید جدید با شکست مواجه شد.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -689,16 +469,12 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation> هسته Bitcoin </translation>
- </message>
- <message>
<source>version</source>
<translation>نسخه</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>درباره هسته ی بیت کوین</translation>
+ <source>About %1</source>
+ <translation>درباره %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -712,7 +488,7 @@
<source>command-line options</source>
<translation>گزینه‌های خط Ùرمان</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -720,12 +496,8 @@
<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>
+ <source>Welcome to %1.</source>
+ <translation>به %1 خوش‌آمدید.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -736,16 +508,20 @@
<translation>استÙاده از یک مسیر سÙارشی:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation> هسته Bitcoin </translation>
- </message>
- <message>
<source>Error</source>
<translation>خطا</translation>
</message>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n گیگابایت Ùضا موجود است</numerusform></translation>
+ </message>
</context>
<context>
<name>OpenURIDialog</name>
+ <message>
+ <source>Open URI</source>
+ <translation>بازکردن آدرس</translation>
+ </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -758,6 +534,14 @@
<translation>&amp;عمومی</translation>
</message>
<message>
+ <source>Accept connections from outside</source>
+ <translation>پذیرش اتصالات از بیرون</translation>
+ </message>
+ <message>
+ <source>Allow incoming connections</source>
+ <translation>اجازه دادن به اتصالات دریاÙتی</translation>
+ </message>
+ <message>
<source>Reset all client options to default.</source>
<translation>بازنشانی تمام تنظیمات به پیش‌Ùرض.</translation>
</message>
@@ -770,6 +554,10 @@
<translation>&amp;شبکه</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>کی٠پول</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation>استخراج</translation>
</message>
@@ -794,6 +582,18 @@
<translation>درگاه پراکسی (مثال 9050)</translation>
</message>
<message>
+ <source>IPv4</source>
+ <translation>آی‌پی نسخه 4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>آی‌پی نسخه 6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>تور</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;پنجره</translation>
</message>
@@ -906,40 +706,33 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>مدیریت URI</translation>
- </message>
+ <name>PeerTableModel</name>
<message>
- <source>Payment request rejected</source>
- <translation>درخواست پرداخت رد شد.</translation>
+ <source>Ping Time</source>
+ <translation>زمان پینگ</translation>
</message>
+</context>
+<context>
+ <name>QObject</name>
<message>
- <source>Payment request error</source>
- <translation>خطای درخواست پرداخت</translation>
+ <source>Amount</source>
+ <translation>مبلغ</translation>
</message>
<message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>نمی‌توان بیت‌کوین را اجرا کرد: کنترل‌کنندهٔ کلیک-و-پرداخت</translation>
+ <source>%1 d</source>
+ <translation>%1 روز</translation>
</message>
<message>
- <source>Payment request expired.</source>
- <translation>درخواست پرداخت منقضی شد.</translation>
+ <source>%1 h</source>
+ <translation>%1 ساعت</translation>
</message>
<message>
- <source>Invalid payment request.</source>
- <translation>درخواست پرداخت نامعتبر</translation>
+ <source>%1 m</source>
+ <translation>%1 دقیقه</translation>
</message>
- </context>
-<context>
- <name>PeerTableModel</name>
- </context>
-<context>
- <name>QObject</name>
<message>
- <source>Amount</source>
- <translation>مبلغ</translation>
+ <source>%1 s</source>
+ <translation>%1 ثانیه</translation>
</message>
<message>
<source>None</source>
@@ -949,21 +742,14 @@
<source>N/A</source>
<translation>ناموجود</translation>
</message>
- </context>
-<context>
- <name>QRImageWidget</name>
<message>
- <source>Save QR Code</source>
- <translation>ذخیرهٔ کد QR</translation>
+ <source>%1 ms</source>
+ <translation>%1 میلیونم ثانیه</translation>
</message>
- </context>
+</context>
<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>نام کلاینت</translation>
- </message>
- <message>
<source>N/A</source>
<translation>ناموجود</translation>
</message>
@@ -976,8 +762,12 @@
<translation>&amp;اطلاعات</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>نسخهٔ OpenSSL استÙاده شده</translation>
+ <source>Debug window</source>
+ <translation>پنجرهٔ اشکالزدایی</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>عمومی</translation>
</message>
<message>
<source>Startup time</source>
@@ -1004,6 +794,10 @@
<translation>تعداد Ùعلی بلوک‌ها</translation>
</message>
<message>
+ <source>Memory usage</source>
+ <translation>مصر٠حاÙظه</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>دریاÙتی</translation>
</message>
@@ -1020,6 +814,18 @@
<translation>سرویس ها</translation>
</message>
<message>
+ <source>Last Receive</source>
+ <translation>آخرین دریاÙتی</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>زمان پینگ</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>انتظار پینگ</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>زمان آخرین بلوک</translation>
</message>
@@ -1036,8 +842,8 @@
<translation>جمع کل:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>ساخت تاریخ</translation>
+ <source>In:</source>
+ <translation>در:</translation>
</message>
<message>
<source>Debug log file</source>
@@ -1048,10 +854,6 @@
<translation>پاکسازی کنسول</translation>
</message>
<message>
- <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>
<translation>دکمه‌های بالا Ùˆ پایین برای پیمایش تاریخچه Ùˆ &lt;b&gt;Ctrl-L&lt;/b&gt; برای پاک کردن صÙحه.</translation>
</message>
@@ -1060,87 +862,80 @@
<translation>برای نمایش یک مرور کلی از دستورات ممکن، عبارت &lt;b&gt;help&lt;/b&gt; را بنویسید.</translation>
</message>
<message>
- <source>Unknown</source>
- <translation>ناشناخته</translation>
+ <source>%1 B</source>
+ <translation>%1 بایت</translation>
</message>
-</context>
-<context>
- <name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>&amp;برچسب:</translation>
- </message>
- <message>
- <source>Show</source>
- <translation>نمایش</translation>
+ <source>%1 KB</source>
+ <translation>%1 کیلوبایت</translation>
</message>
<message>
- <source>Remove</source>
- <translation>حذ٠کردن</translation>
+ <source>%1 MB</source>
+ <translation>%1 مگابایت</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>کپی برچسب</translation>
+ <source>%1 GB</source>
+ <translation>%1 گیگابایت</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>کپی مقدار</translation>
+ <source>never</source>
+ <translation>هرگز</translation>
</message>
-</context>
-<context>
- <name>ReceiveRequestDialog</name>
<message>
- <source>QR Code</source>
- <translation>کد QR</translation>
+ <source>Yes</source>
+ <translation>بله</translation>
</message>
<message>
- <source>Address</source>
- <translation>نشانی</translation>
+ <source>No</source>
+ <translation>خیر</translation>
</message>
<message>
- <source>Amount</source>
- <translation>مبلغ</translation>
+ <source>Unknown</source>
+ <translation>ناشناخته</translation>
</message>
+</context>
+<context>
+ <name>ReceiveCoinsDialog</name>
<message>
- <source>Label</source>
- <translation>برچسب</translation>
+ <source>&amp;Amount:</source>
+ <translation>مبلغ:</translation>
</message>
<message>
- <source>Message</source>
- <translation>پیام</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;برچسب:</translation>
</message>
<message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URL ایجاد شده خیلی طولانی است. سعی کنید طول برچسب و یا پیام را کمتر کنید.</translation>
+ <source>&amp;Message:</source>
+ <translation>پیام:</translation>
</message>
<message>
- <source>Error encoding URI into QR Code.</source>
- <translation>خطا در تبدیل نشانی اینترنتی به صورت کد QR.</translation>
+ <source>Clear</source>
+ <translation>پاک‌کردن</translation>
</message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
<message>
- <source>Date</source>
- <translation>تاریخ</translation>
+ <source>Show</source>
+ <translation>نمایش</translation>
</message>
<message>
- <source>Label</source>
- <translation>برچسب</translation>
+ <source>Remove</source>
+ <translation>حذ٠کردن</translation>
</message>
+</context>
+<context>
+ <name>ReceiveRequestDialog</name>
<message>
- <source>Message</source>
- <translation>پیام</translation>
+ <source>QR Code</source>
+ <translation>کد QR</translation>
</message>
<message>
- <source>Amount</source>
- <translation>مبلغ</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;کپی نشانی</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(بدون برچسب)</translation>
+ <source>&amp;Save Image...</source>
+ <translation>&amp;ذخیره عکس...</translation>
</message>
- </context>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
@@ -1148,6 +943,10 @@
<translation>ارسال سکه</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>بود جه نا کاÙÛŒ </translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>تعداد:</translation>
</message>
@@ -1176,6 +975,30 @@
<translation>پول خورد:</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>هزینهٔ تراکنش:</translation>
+ </message>
+ <message>
+ <source>Hide</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>
@@ -1203,43 +1026,7 @@
<source>S&amp;end</source>
<translation>&amp;ارسال</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>ارسال سکه را تأیید کنید</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>کپی مقدار</translation>
- </message>
- <message>
- <source>or</source>
- <translation>یا</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>مبلغ پرداخت باید بیشتر از ۰ باشد.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>میزان پرداخت از تراز شما بیشتر است.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>با احتساب هزینهٔ %1 برای هر تراکنش، مجموع میزان پرداختی از مبلغ تراز شما بیشتر می‌شود.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>درخواست پرداخت منقضی شد.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(بدون برچسب)</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>آیا مطمئن هستید که می خواهید ارسال کنید؟</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -1251,10 +1038,6 @@
<translation>پرداخ&amp;ت به:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>برای این نشانی یک برچسب وارد کنید تا در دÙترچهٔ آدرس ذخیره شود</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;برچسب:</translation>
</message>
@@ -1290,9 +1073,21 @@
<source>Message:</source>
<translation>پیام:</translation>
</message>
- </context>
+ <message>
+ <source>Pay To:</source>
+ <translation>پرداخت به:</translation>
+ </message>
+ <message>
+ <source>Memo:</source>
+ <translation>یادداشت:</translation>
+ </message>
+</context>
<context>
<name>ShutdownWindow</name>
+ <message>
+ <source>%1 is shutting down...</source>
+ <translation>%1 در حال خاموش شدن است...</translation>
+ </message>
</context>
<context>
<name>SignVerifyMessageDialog</name>
@@ -1372,70 +1167,10 @@
<source>Reset all verify message fields</source>
<translation>بازنشانی تمام Ùیلدهای پیام</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>برای ایجاد یک امضای جدید روی «امضای پیام» کلیک کنید</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>نشانی وارد شده نامعتبر است.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>امضای پیام با شکست مواجه شد.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>پیام امضا شد.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>امضا نمی‌تواند کدگشایی شود.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>لطÙاً امضا را بررسی نموده Ùˆ دوباره تلاش کنید.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>امضا با خلاصهٔ پیام مطابقت ندارد.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>شناسایی پیام با شکست مواجه شد.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>پیام شناسایی شد.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation> هسته Bitcoin </translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>توسعه‌دهندگان هسته بیت‌کوین</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>آزمایش شبکه</translation>
</message>
@@ -1448,394 +1183,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>باز تا %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/Ø¢Ùلاین</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/تأیید نشده</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 تأییدیه</translation>
- </message>
- <message>
- <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>
- </message>
- <message>
- <source>Source</source>
- <translation>منبع</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>تولید شده</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Ùرستنده</translation>
- </message>
- <message>
- <source>To</source>
- <translation>گیرنده</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>آدرس شما</translation>
- </message>
- <message>
- <source>label</source>
- <translation>برچسب</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>بدهی</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>بلوغ در %n بلوک دیگر</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>پذیرÙته نشد</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>اعتبار</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>هزینهٔ تراکنش</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>مبلغ خالص</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>پیام</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>نظر</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>شناسهٔ تراکنش</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>اطلاعات اشکال‌زدایی</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>تراکنش</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>ورودی‌ها</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>مبلغ</translation>
- </message>
- <message>
- <source>true</source>
- <translation>درست</translation>
- </message>
- <message>
- <source>false</source>
- <translation>نادرست</translation>
- </message>
- <message>
- <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>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>جزئیات تراکنش</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>این پانل شامل توصی٠کاملی از جزئیات تراکنش است</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>نوع</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>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>تأیید شده (%1 تأییدیه)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>این بلوک از هیچ همتای دیگری دریاÙت نشده است Ùˆ احتمال می‌رود پذیرÙته نشود!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>تولید شده ولی قبول نشده</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Ø¢Ùلاین</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>برچسب</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>تایید نشده</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>دریاÙت‌شده با</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>دریاÙت‌شده از</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>ارسال‌شده به</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>پر داخت به خودتان</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>استخراج‌شده</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(ناموجود)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>وضعیت تراکنش. نشانگر را روی این Ùیلد Ù†Ú¯Ù‡ دارید تا تعداد تأییدیه‌ها نشان داده شود.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>تاریخ Ùˆ ساعت دریاÙت تراکنش.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>نوع تراکنش.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>مبلغ کسر شده Ùˆ یا اضاÙÙ‡ شده به تراز.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>همه</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>امروز</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>این Ù‡Ùته</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>این ماه</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>ماه گذشته</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>امسال</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>محدوده...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>دریاÙت‌شده با </translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>ارسال به</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>به خودتان</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>استخراج‌شده</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>دیگر</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>برای جست‌‌وجو نشانی یا برچسب را وارد کنید</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>مبلغ حداقل</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>کپی نشانی</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>کپی برچسب</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>کپی مقدار</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>کپی شناسهٔ تراکنش</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>ویرایش برچسب</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>نمایش جزئیات تراکنش</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>استخراج انجام نشد</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>استخراج موÙÙ‚</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>پروندهٔ نوع CSV جداشونده با کاما (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>تأیید شده</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>نوع</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>برچسب</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>نشانی</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>شناسه</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>محدوده:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>به</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>ارسال وجه</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;صدور</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>داده ها نوار٠جاری را به Ùایل انتقال دهید</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>نسخهٔ پشتیبان کی٠پول</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>دادهٔ کی٠پول (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>خطا در پشتیبان‌گیری</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>پشتیبان‌گیری موÙÙ‚</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1866,6 +1223,10 @@
<translation>پذیرش اتصالات از بیرون (پیش Ùرض:1 بدون پراکسی یا اتصال)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation> هسته Bitcoin </translation>
+ </message>
+ <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>مقید به نشانی داده شده باشید Ùˆ همیشه از آن پیروی کنید. از نشانه گذاری استاندار IPv6 به صورت Host]:Port] استÙاده کنید.</translation>
</message>
@@ -1886,6 +1247,14 @@
<translation>تنها در گره (های) مشخص شده متصل شوید</translation>
</message>
<message>
+ <source>Connection options:</source>
+ <translation>گزینه‌های اتصال:</translation>
+ </message>
+ <message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>حق تألی٠(C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>یک پایگاه داده ÛŒ بلوک خراب یاÙت شد</translation>
</message>
@@ -1898,6 +1267,10 @@
<translation>خطا در آماده سازی پایگاه داده ی بلوک</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>خطا در بارگیری %s</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>خطا در بارگذاری پایگاه داده ها</translation>
</message>
@@ -1918,14 +1291,34 @@
<translation>در حال پیاده‌سازی...</translation>
</message>
<message>
+ <source>Loading banlist...</source>
+ <translation>بارگذاری لیست‌سیاه...</translation>
+ </message>
+ <message>
+ <source>Print this help message and exit</source>
+ <translation>چاپ ایت پیام کمک و خروج</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>چاپ نسخه و خروج</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
- <translation>در حال بازبینی بلوک ها...</translation>
+ <translation>در حال بازبینی بلوک‌ها...</translation>
</message>
<message>
<source>Verifying wallet...</source>
<translation>در حال بازبینی کی٠پول...</translation>
</message>
<message>
+ <source>Wallet options:</source>
+ <translation>گزینه‌های کی٠پول:</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(پیش‌Ùرض %u)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>اطلاعات</translation>
</message>
@@ -1938,6 +1331,18 @@
<translation>Ùایل debug.log را در startup مشتری Ú©ÙˆÚ†Ú© Ú©Ù† (پیش Ùرض:1 اگر اشکال زدایی روی نداد)</translation>
</message>
<message>
+ <source>Transaction amount too small</source>
+ <translation>مقدار تراکنش بسیار کم است</translation>
+ </message>
+ <message>
+ <source>Transaction amounts must be positive</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>
@@ -1946,6 +1351,10 @@
<translation>هشدار</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>هشدار: قوانین جدید ناشناخته‌ای Ùعال شده‌اند (نسخه‌بیت %i)</translation>
+ </message>
+ <message>
<source>Password for JSON-RPC connections</source>
<translation>JSON-RPC عبارت عبور برای ارتباطات</translation>
</message>
@@ -1954,10 +1363,6 @@
<translation>زمانی که بهترین بلاک تغییر کرد، دستور را اجرا کن (%s در cmd با block hash جایگزین شده است)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>پیام کمکی</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>به DNS اجازه بده تا برای addnode ، seednode و اتصال جستجو کند</translation>
</message>
@@ -1966,14 +1371,6 @@
<translation>بار گیری آدرس ها</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>خطا در بارگیری wallet.dat: کی٠پول خراب شده است</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>خطا در بارگیری wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>آدرس پراکسی اشتباه %s</translation>
</message>
@@ -1982,18 +1379,6 @@
<translation>شبکه مشخص شده غیرقابل شناسایی در onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>آدرس قابل اتصال- شناسایی نیست %s</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>آدرس خارجی قابل اتصال- شناسایی نیست %s</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>میزان وجه اشتباه برای paytxfee=&lt;میزان وجه&gt;: %s</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>بود جه نا کاÙÛŒ </translation>
</message>
diff --git a/src/qt/locale/bitcoin_fa_IR.ts b/src/qt/locale/bitcoin_fa_IR.ts
index fd9de2e049..8faa3ce659 100644
--- a/src/qt/locale/bitcoin_fa_IR.ts
+++ b/src/qt/locale/bitcoin_fa_IR.ts
@@ -22,10 +22,6 @@
<translation>بستن</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>کپی آدرس</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>حذ٠آدرس های انتخاب شده از لیست</translation>
</message>
@@ -41,65 +37,6 @@
<source>&amp;Delete</source>
<translation>حذÙ</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>
- <message>
- <source>Receiving addresses</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>
- <message>
- <source>Exporting Failed</source>
- <translation>صدور با شکست مواجه شد</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>حساب</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(برچسب ندارد)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -119,74 +56,6 @@
<source>Repeat new passphrase</source>
<translation>رمز/پَس ÙرÙیز را دوباره وارد کنید</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>wallet را رمزگذاری کنید</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>برای انجام این عملکرد به رمز/پَس ÙرÙیزÙwallet نیاز است تا آن را از حالت Ù‚ÙÙ„ درآورد.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>باز کردن Ù‚ÙÙ„ wallet </translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>برای کش٠رمز walletØŒ به رمز/پَس ÙرÙیزÙwallet نیاز است.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>کش٠رمز wallet</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>تغییر رمز/پَس ÙرÙیز</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>رمزگذاری wallet را تایید کنید</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>اخطار: کلید Caps Lock Ùعال است!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>تایید رمزگذاری</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>رمز قدیمی و جدید کی٠پول را وارد کنید.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>رمزگذاری تایید نشد</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>رمزگذاری به علت خطای داخلی تایید نشد. wallet شما رمزگذاری نشد</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>رمزهای/پَس ÙرÙیزهای٠وارد شده با هم تطابق ندارند</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Ù‚ÙÙ„ wallet باز نشد</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>رمزهای/پَس ÙرÙیزهای٠وارد شده wallet برای کش٠رمز اشتباه است.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>کش٠رمز wallet انجام نشد</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>رمز عبور کی٠پول با موÙقیت تغییر کرد.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -250,6 +119,10 @@
<translation>تغییر رمز/پَس ÙرÙیز</translation>
</message>
<message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>دریاÙت آدرس ها</translation>
+ </message>
+ <message>
<source>Backup wallet to another location</source>
<translation>گرÙتن نسخه پیشتیبان در آدرسی دیگر</translation>
</message>
@@ -319,13 +192,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>هشدار شبکه</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
@@ -343,22 +209,6 @@
<source>Confirmed</source>
<translation>تایید شده</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>آدرس را کپی کنید</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>برچسب را کپی کنید</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>میزان وجه کپی شود</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(برچسب ندارد)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -374,35 +224,6 @@
<source>&amp;Address</source>
<translation>حساب&amp;</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>حساب دریاÙت کننده جدید
-</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>حساب ارسال کننده جدید</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>ویرایش حساب دریاÙت کننده</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>ویرایش حساب ارسال کننده</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>آدرس وارد شده "%1" یک آدرس صحیح برای bitcoin نسشت</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>عدم توانیی برای Ù‚ÙÙ„ گشایی wallet</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>عدم توانیی در ایجاد کلید جدید</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -435,6 +256,14 @@
<translation>انتخاب/آپشن</translation>
</message>
<message>
+ <source>&amp;Network</source>
+ <translation>شبکه</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>کی٠پول</translation>
+ </message>
+ <message>
<source>&amp;OK</source>
<translation>و تایید</translation>
</message>
@@ -459,9 +288,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -472,15 +298,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>نام کنسول RPC</translation>
- </message>
- <message>
<source>Client version</source>
<translation>ویرایش کنسول RPC</translation>
</message>
@@ -504,66 +323,23 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>و برچسب</translation>
+ <source>&amp;Amount:</source>
+ <translation>میزان وجه:</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>برچسب را کپی کنید</translation>
+ <source>&amp;Label:</source>
+ <translation>و برچسب</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>میزان وجه کپی شود</translation>
+ <source>&amp;Message:</source>
+ <translation>پیام:</translation>
</message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>حساب</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>میزان</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>برچسب</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>پیام</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>متن وارد شده طولانی است، متن٠برچسب/پیام را کوتاه کنید</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>خطای تبدیل URI به کد QR</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>برچسب</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>پیام</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>میزان</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(برچسب ندارد)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>کپی آدرس</translation>
</message>
</context>
<context>
@@ -573,6 +349,10 @@
<translation>سکه های ارسالی</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>وجوه ناکاÙÛŒ</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>میزان وجه:</translation>
</message>
@@ -592,27 +372,7 @@
<source>S&amp;end</source>
<translation>و ارسال</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>تایید ارسال بیت کوین ها</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>میزان وجه کپی شود</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>میزان پرداخت باید بیشتر از 0 باشد</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>مقدار مورد نظر از مانده حساب بیشتر است.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(برچسب ندارد)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -624,10 +384,6 @@
<translation>پرداخت و به چه کسی</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>یک برچسب برای این آدرس بنویسید تا به دÙترچه آدرسهای شما اضاÙÙ‡ شود</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>و برچسب</translation>
</message>
@@ -659,10 +415,6 @@
<context>
<name>ShutdownWindow</name>
<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>
@@ -685,6 +437,10 @@
<source>Alt+P</source>
<translation>Alt Ùˆ P</translation>
</message>
+ <message>
+ <source>Sign &amp;Message</source>
+ <translation>و امضای پیام </translation>
+ </message>
</context>
<context>
<name>SplashScreen</name>
@@ -697,287 +453,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>باز کن تا %1</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1 / تایید نشده</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 تایید</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>label</source>
- <translation>برچسب</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>پیام</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>شناسه کاربری</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>میزان</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>ØŒ هنوز با موÙقیت ارسال نگردیده است</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>ناشناس</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>جزئیات تراکنش</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>این بخش جزئیات تراکنش را نشان می دهد</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>گونه</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>باز کن تا %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>تایید شده (%1 تاییدها)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>این block توسط گره های دیگری دریاÙت نشده است Ùˆ ممکن است قبول نشود</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>تولید شده اما قبول نشده است</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>برچسب</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>دریاÙت با</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>دریاÙت شده از</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>ارسال به</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>وجه برای شما </translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>استخراج شده</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>خالی</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>وضعیت تراکنش. با اشاره به این بخش تعداد تاییدها نمایش داده می شود</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>زمان Ùˆ تاریخی Ú©Ù‡ تراکنش دریاÙت شده است</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>نوع تراکنش</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>میزان وجه Ú©Ù… شده یا اضاÙÙ‡ شده به حساب</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>همه</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>امروز</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>این Ù‡Ùته</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>این ماه</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>ماه گذشته</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>این سال</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>حدود..</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>دریاÙت با</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>ارسال به</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>به شما</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>استخراج شده</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>دیگر</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>آدرس یا برچسب را برای جستجو وارد کنید</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>حداقل میزان وجه</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>آدرس را کپی کنید</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>برچسب را کپی کنید</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>میزان وجه کپی شود</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>برچسب را ویرایش کنید</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>صدور با شکست مواجه شد</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>صدور با موÙقیت انجام شد</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv) Ùایل جداگانه دستوری</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>تایید شده</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>گونه</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>برچسب</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>حساب</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>شناسه کاربری</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>دامنه:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>به</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>سکه های ارسالی</translation>
- </message>
-</context>
-<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>
- <message>
- <source>Backup Wallet</source>
- <translation>گرÙتن نسخه پیشتیبان از Wallet</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>داده های Wallet
-(*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>عملیات گرÙتن نسخه پیشتیبان انجام نشد</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1024,22 +509,10 @@
<translation>دستور را وقتی بهترین بلاک تغییر کرد اجرا کن (%s در دستور توسط block hash جایگزین شده است)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>این پیام راهنما</translation>
- </message>
- <message>
<source>Loading addresses...</source>
<translation>لود شدن آدرسها..</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>خطا در هنگام لود شدن wallet.dat: Wallet corrupted</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>خطا در هنگام لود شدن wallet.dat</translation>
- </message>
- <message>
<source>Set minimum block size in bytes (default: %u)</source>
<translation>تنظیم کمینه اندازه بلاک بر حسب بایت (پیش Ùرض: %u)</translation>
</message>
@@ -1056,10 +529,6 @@
<translation>Ùایل pid را مشخص کنید (پیش Ùرض: %s)</translation>
</message>
<message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>میزان اشتباه است for -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>وجوه ناکاÙÛŒ</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts
index 71ea96644b..b7b3115e25 100644
--- a/src/qt/locale/bitcoin_fi.ts
+++ b/src/qt/locale/bitcoin_fi.ts
@@ -26,10 +26,6 @@
<translation>S&amp;ulje</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopioi osoite</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Poista valittu osoite listalta</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Poista</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Valitse osoite johon kolikot lähetetään</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Valitse osoite johon vastaanotetaan kolikoita</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>V&amp;alitse</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Lähettävä osoite</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Vastaanottava osoite</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>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 transaktiolle.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopioi &amp;nimike</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Muokkaa</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Vie osoitekirja</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Vienti epäonnistui</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Virhe tallentaessa osoitelistaa %1. Yritä uudelleen.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Nimi</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Osoite</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ei nimikettä)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Toista uusi tunnuslause</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Salaa lompakko</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Tätä toimintoa varten sinun täytyy antaa lompakon tunnuslause sen avaamiseksi.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Avaa lompakko</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Tätä toimintoa varten sinun täytyy antaa lompakon tunnuslause salauksen purkuun.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Pura lompakon salaus</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Vaihda tunnuslause</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Vahvista lompakon salaus</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>Varoitus: Jos salaat lompakkosi ja menetät tunnuslauseesi, &lt;b&gt;MENETÄT KAIKKI BITCOINISI&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Haluatko varmasti salata lompakkosi?</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 sammuu nyt viimeistelläkseen kryptaamisen. Muista että lompakon kryptaaminen ei voi täysin suojata bitcoinejasi varkaudelta malwaren saastuttamalla tietokoneella.</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>TÄRKEÄÄ: Kaikki vanhat lompakon varmuuskopiot pitäisi korvata uusilla suojatuilla varmuuskopioilla. Turvallisuussyistä edelliset varmuuskopiot muuttuvat turhiksi, kun aloitat suojatun lompakon käytön.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Varoitus: Caps Lock on käytössä!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Lompakko salattu</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Syötä vanha ja uusi salasana lompakolle.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Lompakon salaus epäonnistui</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Lompakon salaaminen epäonnistui sisäisen virheen vuoksi. Lompakkoasi ei salattu.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Annetut tunnuslauseet eivät täsmää.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Lompakon avaaminen epäonnistui.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Annettu tunnuslause oli väärä.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Lompakon salauksen purku epäonnistui.</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Verkon peite</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Lompakon tunnuslause vaihdettiin onnistuneesti.</translation>
+ <source>Banned Until</source>
+ <translation>Estetty kunnes</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -262,6 +111,10 @@
<translation>Sulje ohjelma</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Tietoja %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Tietoja &amp;Qt</translation>
</message>
@@ -298,14 +151,6 @@
<translation>Avaa &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core ohjelma</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Tuodaan lohkoja levyltä</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Ladataan lohkoindeksiä...</translation>
</message>
@@ -350,10 +195,6 @@
<translation>&amp;Vastaanota</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Näytä tietoja Bitcoin Core:sta</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Näytä / Piilota</translation>
</message>
@@ -390,22 +231,10 @@
<translation>Välilehtipalkki</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin-ydin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Pyydä maksuja (Luo QR koodit ja bitcoin: URIt)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Tietoja Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Muokkaa kokoonpanoasetuksia Bitcoin Corelle</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Näytä lähettämiseen käytettyjen osoitteiden ja nimien lista</translation>
</message>
@@ -421,10 +250,6 @@
<source>&amp;Command-line options</source>
<translation>&amp;Komentorivin valinnat</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Näytä Bitcoin Core ohjeet saadaksesi listan mahdollisista Bitcoinin komentorivivalinnoista</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n aktiivinen yhteys Bitcoin-verkkoon</numerusform><numerusform>%n aktiivista yhteyttä Bitcoin-verkkoon</numerusform></translation>
@@ -537,13 +362,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Verkkohälytys</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -621,150 +439,6 @@
<source>Priority</source>
<translation>Prioriteetti</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopioi osoite</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopioi nimi</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopioi määrä</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopioi siirtotunnus</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Lukitse käyttämättömät</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Avaa käyttämättömät</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopioi määrä</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopioi palkkio</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopioi palkkion jälkeen</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopioi tavut</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopioi prioriteetti</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopioi tomu</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopioi vaihtoraha</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>korkein</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>korkeampi</translation>
- </message>
- <message>
- <source>high</source>
- <translation>korkea</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>keski-korkea</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>keskisuuri</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>pieni-keskisuuri</translation>
- </message>
- <message>
- <source>low</source>
- <translation>pieni</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>pienempi</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>pienin</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 lukittu)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>ei mitään</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Tämä nimi muuttuu punaiseksi mikäli rahansiirron koko on suurempi kuin 1000 tavua.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>Tämä nimi muuttuu punaiseksi mikäli prioriteetti on pienempi kuin "medium".</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than %1.</source>
- <translation>Tämä nimike muuttuu punaiseksi mikäli mikä tahansa saaja vastaanottaa pienemmän määrän kuin %1.</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Saattaa vaihdella +/- %1 satoshia per syöte.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>kyllä</translation>
- </message>
- <message>
- <source>no</source>
- <translation>ei</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Voi vaihdella +/- 1 tavu per syöte</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Rahansiirrot korkeammalla prioriteetilla sisällytetään varmemmin lohkoon.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ei nimeä)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>Vaihda %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(vaihtoraha)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -788,38 +462,6 @@
<source>&amp;Address</source>
<translation>&amp;Osoite</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Uusi vastaanottava osoite</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Uusi lähettävä osoite</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Muokkaa vastaanottajan osoitetta</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Muokkaa lähtevää osoitetta</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Osoite "%1" on jo osoitekirjassa.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Antamasi osoite "%1" ei ole validi Bitcoin-osoite.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Lompakkoa ei voitu avata.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Uuden avaimen luonti epäonnistui.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -847,10 +489,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin-ydin</translation>
- </message>
- <message>
<source>version</source>
<translation>versio</translation>
</message>
@@ -859,10 +497,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Tietoja Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Komentorivi parametrit</translation>
</message>
@@ -874,24 +508,36 @@
<source>command-line options</source>
<translation>komentorivi parametrit</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Tervetuloa</translation>
+ <source>UI Options:</source>
+ <translation>Käyttöliittymän asetukset:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Valitse datahakemisto käynnistyksen yhteydessä (oletus: %u)</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Tervetuloa Bitcoin Core</translation>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Aseta kieli, esimerkiksi "de_DE" (oletus: järjestelmän kieli)</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>Tämän on ensimmäinen kerta kun Bitcoin Core on käynnistetty joten voit valita data-hakemiston paikan.</translation>
+ <source>Start minimized</source>
+ <translation>Käynnistä pienennettynä</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 lataa ja tallentaa kopion Bitcoinin lohkoketjusta. Vähintään %1GB dataa tullaan tallentamaan tähän hakemistoon ja tarve kasvaa ajan myötä. Lomakko tullaan myös tallentamaan tähän hakemistoon.</translation>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Aseta maksupyynnöille SSL-juurivarmenteet (oletus: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Näytä aloitusruutu käynnistyksen yhteydessä (oletus: %u)</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>Tervetuloa</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -902,10 +548,6 @@
<translation>Määritä oma kansio:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin-ydin</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Virhe: Annettu datahakemistoa "%1" ei voida luoda.</translation>
</message>
@@ -940,10 +582,6 @@
<source>Select payment request file</source>
<translation>Valitse maksupyynnön tiedosto</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Valitse maksypyynnön tiedosto avattavaksi</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -980,6 +618,10 @@
<translation>IP osoite proxille (esim. 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>Minimoi ikkuna ohjelman sulkemisen sijasta kun ikkuna suljetaan. Kun tämä asetus on käytössä, ohjelma suljetaan vain valittaessa valikosta Poistu.</translation>
+ </message>
+ <message>
<source>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>Ulkopuoliset URL-osoitteet (esim. block explorer,) jotka esiintyvät siirrot-välilehdellä valikossa. %s URL-osoitteessa korvataan siirtotunnuksella. Useampi URL-osoite on eroteltu pystyviivalla |.</translation>
</message>
@@ -1004,14 +646,6 @@
<translation>&amp;Verkko</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Käynnistä Bitcoin Core automaattisesti järjestelmään kirjautumisen jälkeen.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Käynnistä Bitcoin Core järjestelmään kirjautuessa</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt;0 = jätä näin monta ydintä vapaaksi)</translation>
</message>
@@ -1064,6 +698,34 @@
<translation>Proxyn Portti (esim. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Vertaisten saavuttamiseen käytettävät verkkotyypit:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Ilmoittaa, mikäli oletetettua SOCKS5-välityspalvelinta käytetään tämän verkkotyypin kautta vertaisten saavuttamiseen.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Yhdistä Bitcoin-verkkoon erillisen SOCKS5-välityspalvelimen kautta piilotettuja Tor-palveluja varten.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Käytä erillistä SOCKS5-välityspalvelinta saavuttaaksesi vertaisia piilotettujen Tor-palveluiden kautta:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Ikkuna</translation>
</message>
@@ -1212,97 +874,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI käsittely</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Virheellinen maksuosoite %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Maksupyyntö hylätty</translation>
- </message>
- <message>
- <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>
- <translation>Maksupyyntö %1 on liian pieni (huomioidaan tomuna).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Maksupyyntövirhe</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Ei voida käynnistää bitcoin: klikkaa-maksu käsittelijää</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Maksupyynnön haku URL on virheellinen: %1</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>URIa ei voitu jäsentää! Tämä voi johtua kelvottomasta Bitcoin-osoitteesta tai virheellisistä URI parametreista.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Maksupyynnön tiedoston käsittely</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Maksupyynnön tiedostoa ei voida lukea! Tämä voi aiheutua sopimattomasta maksupyyntötiedostosta.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Maksupyyntö on vanhentunut.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>Varmistamattomia maksupyyntöjä kustomoituun maksupalveluun ei tueta.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Epäkelpo maksupyyntö.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>Maksupalautus %1:sta</translation>
- </message>
- <message>
- <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
- <translation>Maksupyyntö %1 on liian suuri (%2 tavua, sallittu %3 tavua).</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>Virhe kommunikoidessa %1n kanssa: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Maksupyyntöä ei voida jäsentää!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Huono vastaus palvelimelta %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Rahansiirto tunnistettu</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Tietoverkon pyyntövirhe</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1357,31 +928,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Tallenna kuva</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopioi kuva</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Tallenna QR-koodi</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG kuva (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Pääteohjelman nimi</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Ei saatavilla</translation>
</message>
@@ -1402,10 +950,6 @@
<translation>Yleinen</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Käytössä oleva OpenSSL-versio</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Käyttää BerkeleyDB-versiota</translation>
</message>
@@ -1434,6 +978,18 @@
<translation>Nykyinen Lohkojen määrä</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation>Muistiallas</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Tämänhetkinen rahansiirtojen määrä</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Muistin käyttö</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Vastaanotetut</translation>
</message>
@@ -1446,10 +1002,18 @@
<translation>&amp;Vertaiset</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>Estetyt vertaiset</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>Valitse vertainen eriteltyjä tietoja varten.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Sallittu</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Suunta</translation>
</message>
@@ -1458,6 +1022,18 @@
<translation>Versio</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Alkaen lohkosta</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Synkronoidut ylätunnisteet</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Synkronoidut lohkot</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Käyttöliittymä</translation>
</message>
@@ -1486,6 +1062,14 @@
<translation>Vasteaika</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>Tämänhetkisen merkittävän yhteyskokeilun kesto.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Yhteyskokeilun odotus</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Ajan poikkeama</translation>
</message>
@@ -1522,10 +1106,6 @@
<translation>Ulos:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Kääntöpäiväys</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Debug lokitiedosto</translation>
</message>
@@ -1534,8 +1114,32 @@
<translation>Tyhjennä konsoli</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Tervetuloa Bitcoin Coren RPC-konsoliin.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Katkaise yhteys solmukohtaan</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Estä solmukohta</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;tunti</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;päivä</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;viikko</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;vuosi</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Poista solmukohdan esto</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>
@@ -1562,6 +1166,10 @@
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(solmukohdan id: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>%1 kautta</translation>
</message>
@@ -1660,18 +1268,6 @@
<source>Remove</source>
<translation>Poista</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopioi nimi</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopioi viesti</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopioi määrä</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1691,73 +1287,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Tallenna kuva</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Vastaanota maksu %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Maksutiedot</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Osoite</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Määrä</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nimi</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Viesti</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Tuloksen URI liian pitkä, yritä lyhentää otsikon tekstiä / viestiä.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Virhe käännettäessä URI:a QR-koodiksi.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Aika</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nimi</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Viesti</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Määrä</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ei nimeä)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(ei viestiä)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(ei määrää)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1854,6 +1383,10 @@
<translation>Muokattu:</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Älykästä rahansiirtokulua ei ole vielä alustettu. Tähän kuluu yleensä aikaa muutaman lohkon verran...)</translation>
+ </message>
+ <message>
<source>Confirmation time:</source>
<translation>Vahvistusaika:</translation>
</message>
@@ -1866,14 +1399,6 @@
<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>
@@ -1905,102 +1430,6 @@
<source>S&amp;end</source>
<translation>&amp;Lähetä</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Hyväksy Bitcoinien lähettäminen</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 to %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopioi määrä</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopioi määrä</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopioi palkkio</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopioi palkkion jälkeen</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopioi tavut</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopioi prioriteetti</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopioi vaihtoraha</translation>
- </message>
- <message>
- <source>or</source>
- <translation>tai</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Määrä ylittää käytettävissä olevan saldon.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Kokonaismäärä ylittää saldosi kun %1 maksukulu lisätään summaan.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Rahansiirron luonti epäonnistui!</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>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>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Rahansiirtokulua %1 ja sitä suurempia määriä pidetään järjenvastaisen korkeana kuluna.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Maksupyyntö on vanhentunut.</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>Vastaanottajan osoite ei ole kelvollinen. Tarkistathan uudelleen.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Varoitus: Virheellinen Bitcoin osoite</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ei nimeä)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Varoitus: Tuntematon vaihtorahan osoite</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopioi tomu</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Haluatko varmasti lähettää?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>lisätty rahansiirtomaksuna</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2013,10 +1442,6 @@
<translation>Maksun saaja:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Anna nimi tälle osoitteelle, jos haluat lisätä sen osoitekirjaan</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Nimi:</translation>
</message>
@@ -2084,10 +1509,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin core sulkeutuu...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Älä sammuta tietokonetta ennenkuin tämä ikkuna katoaa.</translation>
</message>
@@ -2170,70 +1591,10 @@
<source>Reset all verify message fields</source>
<translation>Tyhjennä kaikki varmista-viesti-kentät</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Klikkaa "Allekirjoita Viesti luodaksesi allekirjoituksen </translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Syötetty osoite on virheellinen.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Tarkista osoite ja yritä uudelleen.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Syötetyn osoitteen avainta ei löydy.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Lompakon avaaminen peruttiin.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Yksityistä avainta syötetylle osoitteelle ei ole saatavilla.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Viestin allekirjoitus epäonnistui.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Viesti allekirjoitettu.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Allekirjoitusta ei pystytty tulkitsemaan.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Tarkista allekirjoitus ja yritä uudelleen.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Allekirjoitus ei täsmää viestin tiivisteeseen.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Viestin varmistus epäonnistui.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Viesti varmistettu.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin-ydin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Bitcoin Core kehittäjät</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2246,414 +1607,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Avoinna %1 asti</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>ristiriitainen</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/vahvistamaton</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 vahvistusta</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Tila</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>lähetetty %n noodin läpi</numerusform><numerusform>lähetetty %n noodin läpi</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Päivämäärä</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Lähde</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generoitu</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Lähettäjä</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Saaja</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>oma osoite</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>vain katseltava</translation>
- </message>
- <message>
- <source>label</source>
- <translation>nimi</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Credit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>kypsyy %n lohkon kuluttua</numerusform><numerusform>kypsyy %n lohkon kuluttua</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>ei hyväksytty</translation>
- </message>
- <message>
- <source>Debit</source>
- <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>
- <message>
- <source>Net amount</source>
- <translation>Netto määrä</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Viesti</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Viesti</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Siirtotunnus</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Kauppias</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>Luodut kolikot täytyy kypsyttää %1 lohkoa kunnes ne voidaan käyttää. Kun loit tämän lohkon, se lähetettiin verkkoon lisänä lohkoketjuun. Jos se epäonnistuu pääsemään ketjuun sen tila tulee muuttumaan "ei hyväksytty" ja sitä ei voida käyttää. Tämä voi ajoittain tapahtua kun toisen solmun lohko luodaan samanaikaisesti omasi kanssa.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Debug tiedot</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Rahansiirto</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Sisääntulot</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Määrä</translation>
- </message>
- <message>
- <source>true</source>
- <translation>tosi</translation>
- </message>
- <message>
- <source>false</source>
- <translation>epätosi</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ei ole vielä onnistuneesti lähetetty</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Avoinna %n lisälohkolle</numerusform><numerusform>Avoinna %n lisälohkolle</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>tuntematon</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Rahansiirron yksityiskohdat</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Tämä ruutu näyttää yksityiskohtaisen tiedon rahansiirrosta</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Päivämäärä</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Laatu</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>Epäkypsä (%1 varmistusta, saatavilla %2 jälkeen)</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Avoinna %n lisälohkolle</numerusform><numerusform>Avoinna %n lisälohkolle</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Avoinna %1 asti</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Vahvistettu (%1 vahvistusta)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Tätä lohkoa ei vastaanotettu mistään muusta solmusta ja sitä ei mahdollisesti hyväksytä!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generoitu mutta ei hyväksytty</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nimi</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Varmistamaton</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Varmistetaan (%1 kehoitetusta %2 varmistuksesta)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Ristiriitainen</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Vastaanotettu osoitteella</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Vastaanotettu</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Saaja</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Maksu itsellesi</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Louhittu</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>vain katseltava</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(ei saatavilla)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Rahansiirron tila. Siirrä osoitin kentän päälle nähdäksesi vahvistusten lukumäärä.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Rahansiirron vastaanottamisen päivämäärä ja aika.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Rahansiirron laatu.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Onko rahansiirrossa mukana ainoastaan katseltava osoite vai ei.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Saldoon lisätty tai siitä vähennetty määrä.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Kaikki</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Tänään</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Tällä viikolla</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Tässä kuussa</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Viime kuussa</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Tänä vuonna</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Alue...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Vastaanotettu osoitteella</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Saaja</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Itsellesi</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Louhittu</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Muu</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Anna etsittävä osoite tai tunniste</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimimäärä</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopioi osoite</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopioi nimi</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopioi määrä</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopioi siirtotunnus</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Muokkaa nimeä</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Näytä rahansiirron yksityiskohdat</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <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>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Rahansiirron historian tallentamisessa tapahtui virhe paikkaan %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Vienti onnistui</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Rahansiirron historia tallennettiin onnistuneesti paikkaan %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Vahvistettu</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Aika</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Laatu</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nimi</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Osoite</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Alue:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>kenelle</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2661,85 +1621,80 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Lomakkoa ei ole ladattu.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Lähetä Bitcoineja</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
+ <name>bitcoin-core</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Vie...</translation>
+ <source>Options:</source>
+ <translation>Asetukset:</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Vie auki olevan välilehden tiedot tiedostoon</translation>
+ <source>Specify data directory</source>
+ <translation>Määritä data-hakemisto</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Varmuuskopioi lompakko</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Yhdistä noodiin hakeaksesi naapurien osoitteet ja katkaise yhteys</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Lompakkodata (*.dat)</translation>
+ <source>Specify your own public address</source>
+ <translation>Määritä julkinen osoitteesi</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Varmuuskopio epäonnistui</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Hyväksy merkkipohjaiset- ja JSON-RPC-käskyt</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Lompakon tallennuksessa tapahtui virhe %1.</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Jos &lt;category&gt; on toimittamatta tai jos &lt;category&gt; = 1, tulosta kaikki debug-tieto.</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Lompakko tallennettiin onnistuneesti tiedostoon %1.</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>Karsinta konfiguroitu alle minimin %d MiB. Käytä surempaa numeroa.</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>Varmuuskopio Onnistui</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Karsinta: viime lompakon synkronisointi menee karsitun datan taakse. Sinun tarvitsee ajaa -reindex (lataa koko lohkoketju uudelleen tapauksessa jossa karsiva noodi)</translation>
</message>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Asetukset:</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>Vähennä levytilan tarvetta karsimalla (poistamalla) vanhoja lohkoja. Tämä tila ei ole yhteensopiva -txindex ja -rescan -parametrien kanssa. Varoitus: Tämän asetuksen peruutus vaatii koko lohkoketjun uudelleenlataamisen. (oletus: 0 = poista karsinta käytöstä, &gt;%u = kohdekoko muodossa MiB jota käytetään lohkotiedostoille) </translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>Määritä data-hakemisto</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Uudelleenskannaukset eivät ole mahdollisia karsivassa tilassa. Sinun täytyy käyttää -reindex joka lataa koko lohkoketjun uudelleen.</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Yhdistä noodiin hakeaksesi naapurien osoitteet ja katkaise yhteys</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Virhe: Kriittinen sisäinen virhe kohdattiin, katso debug.log lisätietoja varten</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Määritä julkinen osoitteesi</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Kulu (muodossa %s/kB) joka lisätään rahansiirtoihin joita lähetät (oletus: %s)</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Hyväksy merkkipohjaiset- ja JSON-RPC-käskyt</translation>
+ <source>Pruning blockstore...</source>
+ <translation>Karsitaan lohkovarastoa...</translation>
</message>
<message>
<source>Run in the background as a daemon and accept commands</source>
<translation>Aja taustalla daemonina ja hyväksy komennot</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>HTTP-palvelinta ei voitu käynnistää. Katso debug-lokista lisätietoja.</translation>
+ </message>
+ <message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Hyväksy yhteyksiä ulkopuolelta (vakioasetus: 1 jos -proxy tai -connect ei määritelty)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin-ydin</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee on asetettu erittäin suureksi! Tämä on rahansiirtokulu jonka voit maksaa kun arvioitu rahansirtokulu ei ole saatavilla.</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>
@@ -2756,8 +1711,8 @@
<translation>Tämä on esi-julkaistu testiversio - Käytä omalla riskillä - Ei saa käytää louhimiseen tai kauppasovelluksiin.</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Ei voida yhdistää %s tässä tietokoneessa. Bitcoin Core on luultavasti jo käynnissä.</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Käytä UPnP:ta kuuntelevan portin kartoitukseen (oletus: 1 kun kuunnellaan ja -proxy ei käytössä)</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
@@ -2768,8 +1723,12 @@
<translation>Varoitus: Olemme vertaisverkon kanssa ristiriidassa! Sinun tulee päivittää tai toisten solmujen tulee päivitää.</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>Varoitus: wallet.dat -lompakkotiedosto on korruptoitunut, tiedot pelastettu. Alkuperäinen wallet.dat -lompakkotiedosto on tallennettu wallet.{timestamp}.bak kansioon %s; jos balanssisi tai siirtohistoria on virheellinen, sinun tulisi palauttaa lompakkotiedosto varmuuskopiosta.</translation>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Salli vertaisten yhdistää annetusta verkkomaskista tai IP-osoitteesta. Voidaan määrittää useampia kertoja.</translation>
+ </message>
+ <message>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool on oltava vähintään %d MB</translation>
</message>
<message>
<source>&lt;category&gt; can be:</source>
@@ -2804,6 +1763,10 @@
<translation>Haluatko uudelleenrakentaa lohkotietokannan nyt?</translation>
</message>
<message>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Ota rahansiirtojen raakavedosten julkaisu käyttöön osoitteessa &lt;address&gt;</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Virhe alustaessa lohkotietokantaa</translation>
</message>
@@ -2884,16 +1847,12 @@
<translation>Lompakon valinnat:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Varoitus: Tämä versio on vanhentunut; päivittämistä vaaditaan!</translation>
- </message>
- <message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Sinun tulee uudelleenrakentaa tietokanta käyttäen -reindex vaihtaen -txindex</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>Salli JSON-RPC-yhteydet määritetystä lähteestä. Kelvolliset arvot &lt;ip&gt; ovat yksittäinen IP (esim. 1.2.3.4), verkko/verkkomaski (esim. 1.2.3.4/255.255.255.0) tai verkko/luokaton reititys (esim. 1.2.3.4/24). Tätä valintatapaa voidaan käyttää useita kertoja</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Ei voida lukita data-hakemistoa %s. Bitcoin Core on luultavasti jo käynnissä.</translation>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Paljasta omat IP-osoitteet (oletus: 1 kun kuunnellaan ja -externalip tai -proxy ei ole käytössä)</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>
@@ -2904,10 +1863,6 @@
<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>(default: %u)</source>
<translation>(oletus: %u)</translation>
</message>
@@ -2916,26 +1871,10 @@
<translation>Hyväksy julkisia REST-pyyntöjä (oletus: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Aktivoidaan parhainta ketjua...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>-whitebind -osoitetta '%s' ei voida jäsentää</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Yhdistä SOCKS5 proxin kautta</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Bitcoin kehittäjät</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <translation>Virhe ladattaessa wallet.dat-tiedostoa: Tarvitset uudemman version Bitcoinista</translation>
- </message>
- <message>
<source>Error reading from database, shutting down.</source>
<translation>Virheitä tietokantaa luettaessa, ohjelma pysäytetään.</translation>
</message>
@@ -2944,12 +1883,8 @@
<translation>Tietoa</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Virheellinen määrä -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Virheellinen määrä -mintxfee=&lt;amount&gt;: '%s'</translation>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>Pidä enimmillään &lt;n&gt; yhdistämiskelvotonta rahansiirtoa muistissa (oletus: %u)</translation>
</message>
<message>
<source>Node relay options:</source>
@@ -2960,8 +1895,8 @@
<translation>RPC-palvelimen valinnat:</translation>
</message>
<message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Vastaanota ja näytä P2P-verkon hälytyksiä (oletus: %u)</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Uudelleenskannaa lohkoketju käynnistyksen yhteydessä puuttuvien lompakon rahansiirtojen vuoksi</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
@@ -2980,10 +1915,22 @@
<translation>Siirron vahvistus epäonnistui</translation>
</message>
<message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Rahansiirron määrä on liian pieni kattaakseen maksukulun</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Tämä on ohjelmistoa kokeelliseen käyttöön.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Tor-hallintaportin salasana (oletus: tyhjä)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Tor-hallintaportti jota käytetään jos onion-kuuntelu on käytössä (oletus: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Siirtosumma liian pieni</translation>
</message>
@@ -2992,28 +1939,36 @@
<translation>Siirtosumman tulee olla positiivinen</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Rahansiirto on liian suuri maksukulukäytännölle</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Siirtosumma liian iso</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Käyttäjätunnus JSON-RPC-yhteyksille</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Päivitä lompakko viimeisimpään formaattiin käynnistyksen yhteydessä</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Lompakko tarvitsee uudelleenkirjoittaa: käynnistä Bitcoin uudelleen</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Käyttäjätunnus JSON-RPC-yhteyksille</translation>
</message>
<message>
<source>Warning</source>
<translation>Varoitus</translation>
</message>
<message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Toimitaanko tilassa jossa ainoastaan lohkot sallitaan (oletus: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Tyhjennetään kaikki rahansiirrot lompakosta....</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat -lompakkotiedosto korruptoitunut, korjaaminen epäonnistui</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>ZeroMQ-ilmoitusasetukset:</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3024,10 +1979,6 @@
<translation>Suorita käsky kun paras lohko muuttuu (%s cmd on vaihdettu block hashin kanssa)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Tämä ohjeviesti</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Salli DNS kyselyt -addnode, -seednode ja -connect yhteydessä</translation>
</message>
@@ -3036,8 +1987,20 @@
<translation>Ladataan osoitteita...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Virhe ladattaessa wallet.dat-tiedostoa: Lompakko vioittunut</translation>
+ <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee on asetettu erittäin suureksi! Tämänkokoisia kuluja saatetaan maksaa yhdessä rahansiirrossa.</translation>
+ </message>
+ <message>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee on asetettu erittäin suureksi! Tämä on rahansiirtokulu, jonka maksat, mikäli lähetät rahansiirron.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Älä pidä rahansiirtoja muistivarannoissa kauemmin kuin &lt;n&gt; tuntia (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Kuinka läpikäyvä lohkojen -checkblocks -todennus on (0-4, oletus: %u)</translation>
</message>
<message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
@@ -3048,12 +2011,8 @@
<translation>(oletus: %s)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Virhe ladattaessa wallet.dat-tiedostoa</translation>
- </message>
- <message>
- <source>Generate coins (default: %u)</source>
- <translation>Luo kolikoita (oletus: %u)</translation>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Pyydä vertaisten osoitteita aina DNS-kyselyjen avulla (oletus: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3068,14 +2027,38 @@
<translation>Virheellinen proxy-osoite '%s'</translation>
</message>
<message>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Kuuntele JSON-RPC-yhteyksiä portissa &lt;port&gt; (oletus: %u tai testnet: %u)</translation>
+ </message>
+ <message>
<source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
<translation>Kuuntele yhteyksiä portissa &lt;port&gt; (oletus: %u tai testnet: %u)</translation>
</message>
<message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>Ylläpidä enimmillään &lt;n&gt; yhteyttä vertaisiin (oletus: %u)</translation>
+ </message>
+ <message>
<source>Make the wallet broadcast transactions</source>
<translation>Aseta lompakko kuuluttamaan rahansiirtoja</translation>
</message>
<message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Maksimi yhteyttä kohden käytettävä vastaanottopuskurin koko, &lt;n&gt;*1000 tavua (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Maksimi yhteyttä kohden käytettävä lähetyspuskurin koko, &lt;n&gt;*1000 tavua (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>Prepend debug output with timestamp (default: %u)</source>
+ <translation>Lisää debug-tietojen alkuun aikaleimat (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Välitä ja louhi dataa kantavia rahansiirtoja (oletus: %u)</translation>
+ </message>
+ <message>
<source>Relay non-P2SH multisig (default: %u)</source>
<translation>Välitä ei-P2SH-multisig (oletus: %u)</translation>
</message>
@@ -3096,6 +2079,10 @@
<translation>Määritä asetustiedosto (oletus: %s)</translation>
</message>
<message>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>Määritä yhteyden aikakatkaisu millisekunneissa (minimi: 1, oletus: %d)</translation>
+ </message>
+ <message>
<source>Specify pid file (default: %s)</source>
<translation>Määritä pid-tiedosto (oletus: %s)</translation>
</message>
@@ -3104,20 +2091,12 @@
<translation>Käytä vahvistamattomia vaihtorahoja lähetettäessä rahansiirtoja (oletus: %u)</translation>
</message>
<message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation>Tuntematon verkko -onlynet parametrina: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>-bind osoitteen '%s' selvittäminen epäonnistui</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>-externalip osoitteen '%s' selvittäminen epäonnistui</translation>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>Aikaväli sopimattomien vertaisten yhteyksien katkaisuun (oletus: %u)</translation>
</message>
<message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>-paytxfee=&lt;amount&gt;: '%s' on virheellinen</translation>
+ <source>Unknown network specified in -onlynet: '%s'</source>
+ <translation>Tuntematon verkko -onlynet parametrina: '%s'</translation>
</message>
<message>
<source>Insufficient funds</source>
diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts
index d43e08cf9d..0b538d7664 100644
--- a/src/qt/locale/bitcoin_fr.ts
+++ b/src/qt/locale/bitcoin_fr.ts
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation>Copier l'adresse courante sélectionnée dans le presse-papiers</translation>
+ <translation>Copier l'adresse sélectionnée actuellement dans le presse-papiers</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -26,16 +26,12 @@
<translation>&amp;Fermer</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copier l'adresse</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
- <translation>Supprimer l'adresse actuellement sélectionnée de la liste</translation>
+ <translation>Supprimer de la liste l'adresse sélectionnée actuellement</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>Exporter les données de l'onglet courant vers un fichier</translation>
+ <translation>Exporter les données de l'onglet actuel vers un fichier</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Supprimer</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Choisir l'adresse à laquelle envoyer des pièces</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Choisir l'adresse avec laquelle recevoir des pièces</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>C&amp;hoisir</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Adresses d'envoi</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Adresses de réception</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Voici vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l'adresse du destinataire avant d'envoyer des pièces.</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation>Voici vos adresses Bitcoin pour recevoir des paiements. Il est recommandé d'utiliser une nouvelle adresse de réception pour chaque transaction.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copier l'é&amp;tiquette</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Modifier</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exporter la liste d'adresses</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Valeurs séparées par des virgules (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>L'exportation a échoué</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Une erreur est survenue lors de l'enregistrement de la liste d'adresses vers %1. Veuillez ressayer plus tard.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Étiquette</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(aucune étiquette)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Répéter la phrase de passe</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Chiffrer le portefeuille</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Cette opération nécessite votre phrase de passe pour déverrouiller le portefeuille.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Déverrouiller le portefeuille</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Cette opération nécessite votre phrase de passe pour déchiffrer le portefeuille.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Déchiffrer le portefeuille</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Changer la phrase de passe</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmer le chiffrement du portefeuille</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>Avertissement : si vous chiffrez votre portefeuille et perdez votre phrase de passe, vous &lt;b&gt;PERDREZ TOUS VOS BITCOINS&lt;/b&gt; !</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Avertissement : la touche Verr. Maj. est activée !</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Portefeuille chiffré</translation>
- </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>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>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>
- <translation>Le chiffrement du portefeuille a échoué</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Le chiffrement du portefeuille a échoué en raison d'une erreur interne. Votre portefeuille n'a pas été chiffré.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Les phrases de passe saisies ne correspondent pas.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Le déverrouillage du portefeuille a échoué</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La phrase de passe saisie pour déchiffrer le portefeuille était incorrecte.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Le déchiffrage du portefeuille a échoué</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/masque réseau</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>La phrase de passe du portefeuille a été modifiée avec succès.</translation>
+ <source>Banned Until</source>
+ <translation>Banni jusqu'au</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -243,7 +92,7 @@
</message>
<message>
<source>Show general overview of wallet</source>
- <translation>Afficher une vue d’ensemble du portefeuille</translation>
+ <translation>Afficher une vue d’ensemble du porte-monnaie</translation>
</message>
<message>
<source>&amp;Transactions</source>
@@ -262,6 +111,14 @@
<translation>Quitter l’application</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>À &amp;propos de %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Afficher des informations à propos de %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>À propos de &amp;Qt</translation>
</message>
@@ -274,12 +131,16 @@
<translation>&amp;Options…</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Modifier les options de configuration de %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
- <translation>&amp;Chiffrer le portefeuille...</translation>
+ <translation>&amp;Chiffrer le porte-monnaie...</translation>
</message>
<message>
<source>&amp;Backup Wallet...</source>
- <translation>Sauvegarder le &amp;portefeuille...</translation>
+ <translation>Sauvegarder le &amp;porte-monnaie...</translation>
</message>
<message>
<source>&amp;Change Passphrase...</source>
@@ -298,14 +159,6 @@
<translation>Ouvrir un &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Client Bitcoin Core</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importation des blocs à partir du disque...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Réindexation des blocs sur le disque...</translation>
</message>
@@ -315,11 +168,11 @@
</message>
<message>
<source>Backup wallet to another location</source>
- <translation>Sauvegarder le portefeuille vers un autre emplacement</translation>
+ <translation>Sauvegarder le porte-monnaie vers un autre emplacement</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation>Modifier la phrase de passe utilisée pour le chiffrement du portefeuille</translation>
+ <translation>Modifier la phrase de passe utilisée pour le chiffrement du porte-monnaie</translation>
</message>
<message>
<source>&amp;Debug window</source>
@@ -339,7 +192,7 @@
</message>
<message>
<source>Wallet</source>
- <translation>Portefeuille</translation>
+ <translation>Porte-monnaie</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -350,10 +203,6 @@
<translation>&amp;Recevoir</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Montrer des informations à propos de Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Afficher / Cacher</translation>
</message>
@@ -363,7 +212,7 @@
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation>Chiffrer les clefs privées de votre portefeuille</translation>
+ <translation>Chiffrer les clefs privées de votre porte-monnaie</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
@@ -390,22 +239,10 @@
<translation>Barre d'outils des onglets</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Demander des paiements (génère des codes QR et des URIs bitcoin:)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
@@ -421,15 +258,19 @@
<source>&amp;Command-line options</source>
<translation>Options de ligne de &amp;commande</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Afficher le message d'aide de Bitcoin Core pour obtenir une liste des options de ligne de commande Bitcoin possibles.</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n connexion active avec le réseau Bitcoin</numerusform><numerusform>%n connexions actives avec le réseau Bitcoin</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Indexation des blocs sur le disque...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Traitement des blocs sur le disque...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Aucune source de blocs disponible...</translation>
</message>
@@ -486,6 +327,14 @@
<translation>À jour</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Afficher le message d'aide de %1 pour obtenir la liste des options de ligne de commande Bitcoin possibles.</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>Client %1</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Rattrapage en cours…</translation>
</message>
@@ -529,18 +378,11 @@
</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>
+ <translation>Le porte-monnaie est &lt;b&gt;chiffré&lt;/b&gt; et est actuellement &lt;b&gt;déverrouillé&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>Le portefeuille est &lt;b&gt;chiffré&lt;/b&gt; et actuellement &lt;b&gt;verrouillé&lt;/b&gt;</translation>
- </message>
-</context>
-<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerte réseau</translation>
+ <translation>Le porte-monnaie est &lt;b&gt;chiffré&lt;/b&gt; et actuellement &lt;b&gt;verrouillé&lt;/b&gt;</translation>
</message>
</context>
<context>
@@ -621,146 +463,6 @@
<source>Priority</source>
<translation>Priorité</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copier l’adresse</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copier l’étiquette</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copier le montant</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copier l'ID de la transaction</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Verrouiller ce qui n'est pas dépensé</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Déverrouiller ce qui n'est pas dépensé</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copier la quantité</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copier les frais</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copier le montant après les frais</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copier les octets</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copier la priorité</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copier la poussière</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copier la monnaie</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>la plus élevée</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>plus élevée</translation>
- </message>
- <message>
- <source>high</source>
- <translation>élevée</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>moyennement-élevée</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>moyenne</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>moyennement-basse</translation>
- </message>
- <message>
- <source>low</source>
- <translation>basse</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>plus basse</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>la plus basse</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 verrouillé)</translation>
- </message>
- <message>
- <source>none</source>
- <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>
- <message>
- <source>yes</source>
- <translation>oui</translation>
- </message>
- <message>
- <source>no</source>
- <translation>non</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Peut varier +/- 1 octet par entrée.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Les transactions à priorité plus haute sont plus à même d'être incluses dans un bloc.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(aucune étiquette)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>monnaie de %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(monnaie)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -784,38 +486,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresse</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nouvelle adresse de réception</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nouvelle adresse d’envoi</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Modifier l’adresse de réception</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Modifier l’adresse d'envoi</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>L’adresse fournie « %1 » est déjà présente dans le carnet d'adresses.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>L'adresse fournie « %1 » n'est pas une adresse Bitcoin valide.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Impossible de déverrouiller le portefeuille.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Échec de génération de la nouvelle clef.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -843,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>version</translation>
</message>
@@ -855,8 +521,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>À propos de Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>À propos de %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -870,6 +536,34 @@
<source>command-line options</source>
<translation>options de ligne de commande</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>Options de l'IU :</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Choisir un répertoire de données au démarrage (par défaut : %u)</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 : -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Afficher l'écran d'accueil au démarrage (par défaut : %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Réinitialiser tous les paramètres changés dans l'IUG</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -878,16 +572,16 @@
<translation>Bienvenue</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Bienvenue à Bitcoin Core.</translation>
+ <source>Welcome to %1.</source>
+ <translation>Bienvenue à %1.</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>Comme c'est la première fois que le logiciel est lancé, vous pouvez choisir où Bitcoin Core stockera ses données.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Puisque c'est la première fois que le logiciel est lancé, vous pouvez choisir où %1 stockera ses données.</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 va télécharger et stocker une copie de la chaîne de blocs Bitcoin. Au moins %1Go de données seront stockées dans ce répertoire et cela augmentera avec le temps. Le portefeuille sera également stocké dans ce répertoire.</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 téléchargera et stockera une copie de la chaîne de blocs de Bitcoin. Au moins %2 Go de données seront stockés dans ce répertoire et sa taille augmentera avec le temps. Le porte-monnaie sera également stocké dans ce répertoire.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -898,10 +592,6 @@
<translation>Utiliser un répertoire de données personnalisé :</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Erreur : le répertoire de données spécifié « %1 » ne peut pas être créé.</translation>
</message>
@@ -913,7 +603,11 @@
<source>%n GB of free space available</source>
<translation><numerusform>%n Go d'espace libre disponible</numerusform><numerusform>%n Go d'espace libre disponibles</numerusform></translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(sur %n Go nécessaire)</numerusform><numerusform>(sur %n Go nécessaires)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -932,10 +626,6 @@
<source>Select payment request file</source>
<translation>Choisir le fichier de demande de paiement</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Choisir le fichier de demande de paiement à ouvrir</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -948,6 +638,14 @@
<translation>Réglages &amp;principaux</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Démarrer %1 automatiquement après avoir ouvert une session sur l'ordinateur.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Démarrer %1 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>
@@ -976,10 +674,6 @@
<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>
@@ -1004,20 +698,12 @@
<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>
<message>
<source>W&amp;allet</source>
- <translation>&amp;Portefeuille</translation>
+ <translation>&amp;Porte-monnaie</translation>
</message>
<message>
<source>Expert</source>
@@ -1064,10 +750,46 @@
<translation>Port du serveur mandataire (par ex. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Utilisé pour rejoindre les pairs par :</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>S'affiche, si le mandataire SOCKS5 par défaut fourni est utilisé pour atteindre les pairs par ce type de réseau.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Se connecter au réseau Bitcoin au travers d'un mandataire SOCKS5 séparé pour les services cachés de Tor.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Utiliser un mandataire SOCKS5 séparé pour atteindre les pairs grâce aux services cachés de Tor :</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Fenêtre</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Cacher l'icône dans la zone de notification.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Cacher l'icône de la zone de notification</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Afficher uniquement une icône système après minimisation.</translation>
</message>
@@ -1088,6 +810,10 @@
<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 %1.</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 %1.</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unité d'affichage des montants :</translation>
</message>
@@ -1144,7 +870,7 @@
</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>Les informations affichées peuvent être obsolètes. Votre portefeuille est automatiquement synchronisé avec le réseau Bitcoin lorsque la connexion s'établit, or ce processus n'est pas encore terminé.</translation>
+ <translation>Les informations affichées peuvent être obsolètes. Votre porte-monnaie est automatiquement synchronisé avec le réseau Bitcoin lorsque la connexion s'établit, or ce processus n'est pas encore terminé.</translation>
</message>
<message>
<source>Watch-only:</source>
@@ -1172,7 +898,7 @@
</message>
<message>
<source>Mined balance that has not yet matured</source>
- <translation>Le solde généré n'est pas encore mûr</translation>
+ <translation>Le solde miné n'est pas encore mûr</translation>
</message>
<message>
<source>Balances</source>
@@ -1212,97 +938,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Gestion des URIs</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Adresse de paiement invalide %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>La demande de paiement est rejetée</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Le réseau de la demande de paiement ne correspond pas au réseau du client.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>La demande de paiement n'est pas initialisée.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Le paiement demandé d'un montant de %1 est trop faible (considéré comme de la poussière).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Erreur de demande de paiement</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Impossible de démarrer le gestionnaire de cliquer-pour-payer bitcoin :</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>L'URL de récupération de la demande de paiement est invalide : %1</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>L'URI ne peut pas être analysé ! Ceci peut être causé par une adresse Bitcoin invalide ou par des paramètres d'URI mal formés.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Gestion des fichiers de demande de paiement</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <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>Error communicating with %1: %2</source>
- <translation>Erreur de communication avec %1 : %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>La demande de paiement ne peut pas être analysée !</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Mauvaise réponse du serveur %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Le paiement a été confirmé</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Erreur de demande réseau</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1329,7 +964,7 @@
</message>
<message>
<source>%1 d</source>
- <translation>%1 d</translation>
+ <translation>%1 j</translation>
</message>
<message>
<source>%1 h</source>
@@ -1357,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Sauvegarder l'image...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copier l'image</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Sauvegarder le code QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Image PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nom du client</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N.D.</translation>
</message>
@@ -1402,14 +1014,14 @@
<translation>Général</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Version d'OpenSSL utilisée</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Version BerkeleyDB utilisée</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Datadir</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Heure de démarrage</translation>
</message>
@@ -1434,8 +1046,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>Réserve de mémoire</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Nombre actuel de transactions</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Utilisation de la mémoire</translation>
</message>
<message>
<source>Received</source>
@@ -1450,10 +1070,18 @@
<translation>&amp;Pairs</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>Pairs bannis</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>Choisir un pair pour voir l'information détaillée.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Dans la liste blanche</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Direction</translation>
</message>
@@ -1462,10 +1090,34 @@
<translation>Version</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Bloc de départ</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>En-têtes synchronisés</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Blocs synchronisés</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Agent utilisateur</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Ouvrir le journal de débogage de %1 depuis le répertoire de données actuel. Ceci peut prendre quelques secondes pour les journaux de grande taille.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Diminuer la taille de police</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Augmenter la taille de police</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Services</translation>
</message>
@@ -1490,6 +1142,14 @@
<translation>Temps de ping</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>La durée d'un ping actuellement en cours.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Attente du ping</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Décalage temporel</translation>
</message>
@@ -1526,10 +1186,6 @@
<translation>Sortant :</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Date de compilation</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Journal de débogage</translation>
</message>
@@ -1538,8 +1194,36 @@
<translation>Nettoyer la console</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Bienvenue dans le console RPC de Bitcoin Core.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Déconnecter le nœud</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Bannir le nœud pendant</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;heure</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;jour</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;semaine</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;an</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Réhabiliter le nœud</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Bienvenue sur la console RPC de %1.</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,6 +1250,10 @@
<translation>%1 Go</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(ID de nœud : %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>par %1</translation>
</message>
@@ -1664,18 +1352,6 @@
<source>Remove</source>
<translation>Enlever</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copier l’étiquette</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copier le message</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copier le montant</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1695,73 +1371,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Sauvegarder l'image...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Demande de paiement à %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informations de paiement</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Montant</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Étiquette</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Message</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>L'URI résultant est trop long, essayez de réduire le texte d'étiquette / de message.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Erreur d'encodage de l'URI en code QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Étiquette</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Message</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Montant</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(pas d'étiquette)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(pas de message)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(aucun montant)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1882,14 +1491,6 @@
<translation>rapide</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <translation>Envoyer si possible une transaction sans frais</translation>
- </message>
- <message>
- <source>(confirmation may take longer)</source>
- <translation>(la confirmation pourrait prendre plus longtemps)</translation>
- </message>
- <message>
<source>Send to multiple recipients at once</source>
<translation>Envoyer à plusieurs destinataires à la fois</translation>
</message>
@@ -1921,110 +1522,6 @@
<source>S&amp;end</source>
<translation>E&amp;nvoyer</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirmer l’envoi des pièces</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 à %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copier la quantité</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copier le montant</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copier les frais</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copier le montant après les frais</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copier les octets</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copier la priorité</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copier la monnaie</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ou</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Le montant dépasse votre solde.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Le montant dépasse votre solde lorsque les frais de transaction de %1 sont inclus.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>La création de la transaction a échoué !</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 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 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>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>
- <translation>Avertissement : adresse Bitcoin invalide</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(pas d'étiquette)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Avertissement : adresse de monnaie rendue inconnue</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copier la poussière</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Êtes-vous sûr de vouloir envoyer ?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>ajouté en tant que frais de transaction</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2037,10 +1534,6 @@
<translation>&amp;Payer à :</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Saisir une étiquette pour cette adresse afin de l’ajouter à votre carnet d’adresses</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>É&amp;tiquette :</translation>
</message>
@@ -2112,8 +1605,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Arrêt de Bitcoin Core...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>Arrêt de %1...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2206,70 +1699,10 @@
<source>Reset all verify message fields</source>
<translation>Réinitialiser tous les champs de vérification de message</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Cliquez sur « Signer le message » pour générer la signature</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>L'adresse saisie est invalide.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Veuillez vérifier l'adresse et réessayer.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>L'adresse saisie ne fait pas référence à une clef.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Le déverrouillage du portefeuille a été annulé.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>La clef privée n'est pas disponible pour l'adresse indiquée.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>La signature du message a échoué.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Le message a été signé.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>La signature n'a pu être décodée.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Veuillez vérifier la signature et réessayer.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>La signature ne correspond pas à l'empreinte du message.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Échec de la vérification du message.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Message vérifié.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Les développeurs Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2282,682 +1715,416 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Ouvert jusqu'à %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>en conflit</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/hors ligne</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/non confirmée</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmations</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>État</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, diffusée à travers %n nœud</numerusform><numerusform>, diffusée à travers %n nœuds</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Source</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Généré</translation>
- </message>
- <message>
- <source>From</source>
- <translation>De</translation>
- </message>
- <message>
- <source>To</source>
- <translation>À</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>votre propre adresse</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>juste-regarder</translation>
- </message>
- <message>
- <source>label</source>
- <translation>étiquette</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Crédit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>arrive à maturité dans %n bloc de plus</numerusform><numerusform>arrive à maturité dans %n blocs de plus</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>refusé</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Débit</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Débit total</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Crédit total</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Frais de transaction</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Montant net</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Message</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Commentaire</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID de la transaction</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Marchand</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>Les pièces générées doivent mûrir pendant %1 blocs avant de pouvoir être dépensées. Lorsque vous avez généré ce bloc, il a été diffusé sur le réseau pour être ajouté à la chaîne de blocs. S’il échoue a intégrer la chaîne, son état sera modifié en « non accepté » et il ne sera pas possible de le dépenser. Ceci peut arriver occasionnellement si un autre nœud génère un bloc à quelques secondes du votre.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Informations de débogage</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transaction</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Entrants</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Montant</translation>
- </message>
- <message>
- <source>true</source>
- <translation>vrai</translation>
- </message>
- <message>
- <source>false</source>
- <translation>faux</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, n’a pas encore été diffusée avec succès</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Ouvert pour %n bloc de plus</numerusform><numerusform>Ouvert pour %n blocs de plus</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>inconnu</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Détails de la transaction</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Ce panneau affiche une description détaillée de la transaction</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Date</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Type</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>Immature (%1 confirmations, sera disponible après %2)</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Ouvert pour %n bloc de plus</numerusform><numerusform>Ouvert pour %n blocs de plus</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Ouvert jusqu'à %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmée (%1 confirmations)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ce bloc n’a été reçu par aucun autre nœud et ne sera probablement pas accepté !</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Généré mais pas accepté</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Hors ligne</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Étiquette</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Non confirmé</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Confirmation (%1 sur %2 confirmations recommandées)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>En conflit</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Reçue avec</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Reçue de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Envoyée à</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Paiement à vous-même</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Miné</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>juste-regarder</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n.d)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>État de la transaction. Laissez le pointeur de la souris sur ce champ pour voir le nombre de confirmations.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Date et heure de réception de la transaction.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Type de transaction.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Une adresse juste-regarder est-elle impliquée dans cette transaction.</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation>Intention/but de la transaction défini par l'utilisateur.</translation>
- </message>
+ <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Amount removed from or added to balance.</source>
- <translation>Montant ajouté ou enlevé au solde.</translation>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Unité d'affichage des montants. Cliquer pour choisir une autre unité.</translation>
</message>
</context>
<context>
- <name>TransactionView</name>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Options:</source>
+ <translation>Options :</translation>
+ </message>
<message>
- <source>All</source>
- <translation>Toutes</translation>
+ <source>Specify data directory</source>
+ <translation>Spécifier le répertoire de données</translation>
</message>
<message>
- <source>Today</source>
- <translation>Aujourd’hui</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Se connecter à un nœud pour obtenir des adresses de pairs puis se déconnecter</translation>
</message>
<message>
- <source>This week</source>
- <translation>Cette semaine</translation>
+ <source>Specify your own public address</source>
+ <translation>Spécifier votre propre adresse publique</translation>
</message>
<message>
- <source>This month</source>
- <translation>Ce mois-ci</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Accepter les commandes de JSON-RPC et de la ligne de commande</translation>
</message>
<message>
- <source>Last month</source>
- <translation>Le mois dernier</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Si &lt;category&gt; n'est pas indiqué ou si &lt;category&gt; = 1, extraire toutes les données de débogage.</translation>
</message>
<message>
- <source>This year</source>
- <translation>Cette année</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>L'élagage est configuré au-dessous du minimum de %d Mio. Veuillez utiliser un nombre plus élevé.</translation>
</message>
<message>
- <source>Range...</source>
- <translation>Intervalle…</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Élagage : la dernière synchronisation de porte-monnaie va par-delà les données élaguées. Vous devez -reindex (réindexer, télécharger de nouveau toute la chaîne de blocs en cas de nœud élagué)</translation>
</message>
<message>
- <source>Received with</source>
- <translation>Reçue avec</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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 est incompatible avec -txindex et -rescan. Avertissement : ramener ce paramètre à sa valeur antérieure exige un nouveau téléchargement de la chaîne de blocs en entier (par défaut : 0 = désactiver l'élagage des blocs, &gt;%u = taille cible en Mio à utiliser pour les fichiers de blocs).</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Envoyée à</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Les rebalayages sont impossibles en mode élagage. Vous devrez utiliser -reindex, ce qui téléchargera de nouveau la chaîne de blocs en entier.</translation>
</message>
<message>
- <source>To yourself</source>
- <translation>À vous-même</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Erreur : une erreur interne fatale s'est produite. Voir debug.log pour plus de détails</translation>
</message>
<message>
- <source>Mined</source>
- <translation>Miné</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Les frais (en %s/ko) à ajouter aux transactions que vous envoyez (par défaut : %s)</translation>
</message>
<message>
- <source>Other</source>
- <translation>Autres</translation>
+ <source>Pruning blockstore...</source>
+ <translation>Élagage du magasin de blocs...</translation>
</message>
<message>
- <source>Enter address or label to search</source>
- <translation>Saisir une adresse ou une étiquette à rechercher</translation>
+ <source>Run in the background as a daemon and accept commands</source>
+ <translation>Fonctionner en arrière-plan en tant que démon et accepter les commandes</translation>
</message>
<message>
- <source>Min amount</source>
- <translation>Montant min.</translation>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Impossible de démarrer le serveur HTTP. Voir le journal de débogage pour plus de détails.</translation>
</message>
<message>
- <source>Copy address</source>
- <translation>Copier l’adresse</translation>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <translation>Accepter les connexions entrantes (par défaut : 1 si aucun -proxy ou -connect )</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Copier l’étiquette</translation>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Copier le montant</translation>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>La valeur -fallbackfee est très élevée ! Elle représente les frais de transaction que vous pourriez acquitter si aucune estimation de frais n'est proposée.</translation>
</message>
<message>
- <source>Copy transaction ID</source>
- <translation>Copier l'ID de la transaction</translation>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>Un taux de frais (en %s/Ko) qui sera utilisé si l'estimation de frais ne possède pas suffisamment de données (par défaut : %s)</translation>
</message>
<message>
- <source>Edit label</source>
- <translation>Modifier l’étiquette</translation>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Accepter les transactions relayées reçues de pairs de la liste blanche même si le nœud ne relaie pas les transactions (par défaut : %d)</translation>
</message>
<message>
- <source>Show transaction details</source>
- <translation>Afficher les détails de la transaction</translation>
+ <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>Export Transaction History</source>
- <translation>Exporter l'historique des transactions</translation>
+ <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <translation>Supprimer toutes les transactions du porte-monnaie et ne récupérer que ces parties de la chaîne de blocs avec -rescan au démarrage</translation>
</message>
<message>
- <source>Watch-only</source>
- <translation>Juste-regarder :</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é sous la licence MIT d'utilisation d'un logiciel. Consultez le fichier joint COPYING ou &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Exporting Failed</source>
- <translation>L'exportation a échoué</translation>
+ <source>Error loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>Erreur de chargement de %s : vous ne pouvez pas activer HD sur un porte-monnaie non HD existant</translation>
</message>
<message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Une erreur est survenue lors de l'enregistrement de l'historique des transactions vers %1.</translation>
+ <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 porte-monnaie change (%s dans la commande est remplacée par TxID)</translation>
</message>
<message>
- <source>Exporting Successful</source>
- <translation>Exportation réussie</translation>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>Réglage moyen maximal autorisé de décalage de l'heure d'un pair. La perspective locale du temps peut être influencée par les pairs, en avance ou en retard, de cette valeur. (Par défaut : %u secondes)</translation>
</message>
<message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>L'historique des transactions a été sauvegardée avec succès vers %1.</translation>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Frais totaux maximaux (en %s) à utiliser en une seule transaction de porte-monnaie ou transaction brute ; les définir trop bas pourrait interrompre les grosses transactions (par défaut : %s)</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Valeurs séparées par des virgules (*.csv)</translation>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>Si vous trouvez %s utile, vous pouvez y contribuer. Vous trouverez davantage d'informations à propos du logiciel sur %s.</translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>Confirmée</translation>
+ <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>
<message>
- <source>Date</source>
- <translation>Date</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>La base de données de blocs contient un bloc qui semble provenir du futur. Cela pourrait être causé par la date et l'heure erronées de votre ordinateur. Ne reconstruisez la base de données de blocs que si vous êtes certain que la date et l'heure de votre ordinateur sont justes.</translation>
</message>
<message>
- <source>Type</source>
- <translation>Type</translation>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation>Ceci est une pré-version de test - l'utiliser à vos risques et périls - ne pas l'utiliser pour miner ou pour des applications marchandes</translation>
</message>
<message>
- <source>Label</source>
- <translation>Étiquette</translation>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
+ <translation>Impossible de rebobiner la base de données à un état préfourche. Vous devrez retélécharger la chaîne de blocs</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresse</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Utiliser l'UPnP pour mapper le port d'écoute (par défaut : 1 lors de l'écoute et pas de mandataire -proxy)</translation>
</message>
<message>
- <source>ID</source>
- <translation>ID</translation>
+ <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
+ <translation>Avertissement : le réseau ne semble pas totalement d'accord ! Quelques mineurs semblent éprouver des difficultés.</translation>
</message>
<message>
- <source>Range:</source>
- <translation>Intervalle :</translation>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation>Avertissement : nous ne semblons pas être en accord complet avec nos pairs ! Vous pourriez avoir besoin d'effectuer une mise à niveau, ou d'autres nœuds du réseau pourraient avoir besoin d'effectuer une mise à niveau.</translation>
</message>
<message>
- <source>to</source>
- <translation>à</translation>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Pairs de la liste blanche se connectant à partir du masque réseau ou de l'IP donné. Peut être spécifié plusieurs fois.</translation>
</message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation>Unité d'affichage des montants. Cliquer pour choisir une autre unité.</translation>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>Vous devez reconstruire la base de données avec -reindex-chainstate pour changer -txindex</translation>
</message>
-</context>
-<context>
- <name>WalletFrame</name>
<message>
- <source>No wallet has been loaded.</source>
- <translation>Aucun portefeuille de chargé.</translation>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s corrompu, la récupération a échoué</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>Envoyer des pièces</translation>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool doit être d'au moins %d Mo</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Exporter</translation>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;category&gt; peut être :</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporter les données de l'onglet courant vers un fichier</translation>
+ <source>Append comment to the user agent string</source>
+ <translation>Ajouter un commentaire à la chaîne d'agent utilisateur</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Sauvegarder le portefeuille</translation>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Tenter de récupérer les clefs privées d'un porte-monnaie corrompu lors du démarrage</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Données de portefeuille (*.dat)</translation>
+ <source>Block creation options:</source>
+ <translation>Options de création de bloc :</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Échec de la sauvegarde</translation>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>Impossible de résoudre l'adresse -%s : « %s »</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Une erreur est survenue lors de l'enregistrement des données de portefeuille vers %1.</translation>
+ <source>Change index out of range</source>
+ <translation>L'index de changement est hors échelle</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Les données de portefeuille ont été enregistrées avec succès vers %1</translation>
+ <source>Connect only to the specified node(s)</source>
+ <translation>Ne se connecter qu'au(x) nœud(s) spécifié(s)</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>Sauvegarde réussie</translation>
+ <source>Connection options:</source>
+ <translation>Options de connexion :</translation>
</message>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Options :</translation>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Tous droits réservés (C) %i-%i</translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>Spécifier le répertoire de données</translation>
+ <source>Corrupted block database detected</source>
+ <translation>Base corrompue de données des blocs détectée</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Se connecter à un nœud pour obtenir des adresses de pairs puis se déconnecter</translation>
+ <source>Debugging/Testing options:</source>
+ <translation>Options de débogage/de test :</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Spécifier votre propre adresse publique</translation>
+ <source>Do not load the wallet and disable wallet RPC calls</source>
+ <translation>Ne pas charger le porte-monnaie et désactiver les appels RPC</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Accepter les commandes de JSON-RPC et de la ligne de commande</translation>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation>Voulez-vous reconstruire la base de données des blocs maintenant ?</translation>
</message>
<message>
- <source>Error: A fatal internal error occurred, see debug.log for details</source>
- <translation>Erreur : une erreur interne fatale s'est produite. Voir debug.log pour plus de détails</translation>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Activer la publication du bloc de hachage dans &lt;address&gt;</translation>
</message>
<message>
- <source>Run in the background as a daemon and accept commands</source>
- <translation>Fonctionner en arrière-plan en tant que démon et accepter les commandes</translation>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Activer la publication de la transaction de hachage dans &lt;address&gt;</translation>
</message>
<message>
- <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>Accepter les connexions entrantes (par défaut : 1 si aucun -proxy ou -connect )</translation>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Activer la publication du bloc brut dans &lt;address&gt;</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>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Activer la publication de la transaction brute dans &lt;address&gt;</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>
+ <source>Error initializing block database</source>
+ <translation>Erreur lors de l'initialisation de la base de données des blocs</translation>
</message>
<message>
- <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é sous la licence MIT d'utilisation d'un logiciel. Consultez le fichier joint COPYING ou &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation>Erreur lors de l'initialisation de l'environnement de la base de données du porte-monnaie %s !</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>
+ <source>Error loading %s</source>
+ <translation>Erreur lors du chargement de %s</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>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Erreur lors du chargement de %s : porte-monnaie corrompu</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>Ceci est une pré-version de test - l'utiliser à vos risques et périls - ne pas l'utiliser pour miner ou pour des applications marchandes</translation>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Erreur lors du chargement de %s : le porte-monnaie exige une version plus récente de %s</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Impossible de se lier à %s sur cet ordinateur. Bitcoin Core fonctionne probablement déjà.</translation>
+ <source>Error loading %s: You can't disable HD on a already existing HD wallet</source>
+ <translation>Erreur de chargement de %s : vous ne pouvez pas désactiver HD sur un porte-monnaie HD existant</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVERTISSEMENT : un nombre anormalement élevé de blocs a été généré, %d blocs reçus durant les %d dernières heures (%d attendus)</translation>
+ <source>Error loading block database</source>
+ <translation>Erreur du chargement de la base de données des blocs</translation>
</message>
<message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVERTISSEMENT : vérifiez votre connexion réseau, %d blocs reçus durant les %d dernières heures (%d attendus)</translation>
+ <source>Error opening block database</source>
+ <translation>Erreur lors de l'ouverture de la base de données des blocs</translation>
</message>
<message>
- <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>Avertissement : le réseau ne semble pas totalement d'accord ! Quelques mineurs semblent éprouver des difficultés.</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Erreur : l'espace disque est faible !</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>Avertissement : nous ne semblons pas être en accord complet avec nos pairs ! Vous pourriez avoir besoin d'effectuer une mise à niveau, ou d'autres nœuds du réseau pourraient avoir besoin d'effectuer une mise à niveau.</translation>
+ <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>
<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>Avertissement : wallet.dat corrompu, données récupérées ! Le fichier wallet.dat original a été enregistré en tant que wallet.{timestamp}.bak dans %s ; si votre solde ou transactions sont incorrects vous devriez effectuer une restauration depuis une sauvegarde.</translation>
+ <source>Importing...</source>
+ <translation>Importation...</translation>
</message>
<message>
- <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
- <translation>Pairs de la liste blanche se connectant à partir du masque réseau ou de l'IP donné. Peut être spécifié plusieurs fois.</translation>
+ <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <translation>Bloc de genèse incorrect ou introuvable. Mauvais répertoire de données pour le réseau ?</translation>
</message>
<message>
- <source>&lt;category&gt; can be:</source>
- <translation>&lt;category&gt; peut être :</translation>
+ <source>Invalid -onion address: '%s'</source>
+ <translation>Adresse -onion invalide : « %s »</translation>
</message>
<message>
- <source>Block creation options:</source>
- <translation>Options de création de bloc :</translation>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Montant invalide pour -%s=&lt;amount&gt; : « %s »</translation>
</message>
<message>
- <source>Connect only to the specified node(s)</source>
- <translation>Ne se connecter qu'au(x) nœud(s) spécifié(s)</translation>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Montant invalide pour -fallbackfee=&lt;amount&gt; : « %s »</translation>
</message>
<message>
- <source>Connection options:</source>
- <translation>Options de connexion :</translation>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Garder la réserve de mémoire transactionnelle sous &lt;n&gt; mégaoctets (par défaut : %u)</translation>
</message>
<message>
- <source>Corrupted block database detected</source>
- <translation>Base corrompue de données des blocs détectée</translation>
+ <source>Loading banlist...</source>
+ <translation>Chargement de la liste d'interdiction...</translation>
</message>
<message>
- <source>Debugging/Testing options:</source>
- <translation>Options de test/de débogage :</translation>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Emplacement du fichier témoin auth (par défaut : data dir)</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>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Octets minimaux par sigop dans les transactions que nous relayons et minons (par défaut : %u)</translation>
</message>
<message>
- <source>Do you want to rebuild the block database now?</source>
- <translation>Voulez-vous reconstruire la base de données des blocs maintenant ?</translation>
+ <source>Not enough file descriptors available.</source>
+ <translation>Pas assez de descripteurs de fichiers proposés.</translation>
</message>
<message>
- <source>Error initializing block database</source>
- <translation>Erreur lors de l'initialisation de la base de données des blocs</translation>
+ <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>Error initializing wallet database environment %s!</source>
- <translation>Erreur lors de l'initialisation de l'environnement de la base de données du portefeuille %s !</translation>
+ <source>Print this help message and exit</source>
+ <translation>Imprimer ce message d'aide et quitter</translation>
</message>
<message>
- <source>Error loading block database</source>
- <translation>Erreur du chargement de la base de données des blocs</translation>
+ <source>Print version and exit</source>
+ <translation>Imprimer la version et quitter</translation>
</message>
<message>
- <source>Error opening block database</source>
- <translation>Erreur lors de l'ouverture de la base de données des blocs</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>Error: Disk space is low!</source>
- <translation>Erreur : l'espace disque est faible !</translation>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Le mode élagage n'est pas compatible avec -txindex.</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>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>Reconstruire l'état de la chaîne et l'index des blocs à partir des fichiers blk*.dat sur le disque</translation>
</message>
<message>
- <source>Importing...</source>
- <translation>Importation...</translation>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>Reconstruire l'état de la chaîne à partir des blocs indexés actuellement</translation>
</message>
<message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation>Bloc de genèse incorrect ou introuvable. Mauvais répertoire de données pour le réseau ?</translation>
+ <source>Rewinding blocks...</source>
+ <translation>Rebobinage des blocs...</translation>
</message>
<message>
- <source>Invalid -onion address: '%s'</source>
- <translation>Adresse -onion invalide : « %s »</translation>
+ <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
+ <translation>Définir la taille du cache de la base de données en mégaoctets (%d to %d, default: %d)</translation>
</message>
<message>
- <source>Not enough file descriptors available.</source>
- <translation>Pas assez de descripteurs de fichiers proposés.</translation>
+ <source>Set maximum block cost (default: %d)</source>
+ <translation>Définir le coût maximal de bloc (par défaut : %d)</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>
+ <source>Set maximum block size in bytes (default: %d)</source>
+ <translation>Définir la taille minimale de bloc en octets (par défaut : %d)</translation>
</message>
<message>
- <source>Prune cannot be configured with a negative value.</source>
- <translation>L'élagage ne peut pas être configuré avec une valeur négative.</translation>
+ <source>Specify wallet file (within data directory)</source>
+ <translation>Spécifiez le fichier de porte-monnaie (dans le répertoire de données)</translation>
</message>
<message>
- <source>Prune mode is incompatible with -txindex.</source>
- <translation>Le mode élagage n'est pas compatible avec -txindex.</translation>
+ <source>The source code is available from %s.</source>
+ <translation>Le code source est disponible sur %s.</translation>
</message>
<message>
- <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
- <translation>Définir la taille du cache de la base de données en mégaoctets (%d to %d, default: %d)</translation>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Argument non pris en charge -benchmark ignoré, utiliser -debug=bench.</translation>
</message>
<message>
- <source>Set maximum block size in bytes (default: %d)</source>
- <translation>Définir la taille minimale de bloc en octets (par défaut : %d)</translation>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Argument non pris en charge -debugnet ignoré, utiliser -debug=net.</translation>
</message>
<message>
- <source>Specify wallet file (within data directory)</source>
- <translation>Spécifiez le fichier de portefeuille (dans le répertoire de données)</translation>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Argument non pris en charge -tor trouvé, utiliser -onion</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: %u)</source>
<translation>Utiliser l'UPnP pour mapper le port d'écoute (par défaut : %u)</translation>
</message>
<message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>Le commentaire d'agent utilisateur (%s) contient des caractères dangereux.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Vérification des blocs en cours...</translation>
</message>
<message>
<source>Verifying wallet...</source>
- <translation>Vérification du portefeuille en cours...</translation>
+ <translation>Vérification du porte-monnaie en cours...</translation>
</message>
<message>
<source>Wallet %s resides outside data directory %s</source>
- <translation>Le portefeuille %s réside en dehors du répertoire de données %s</translation>
- </message>
- <message>
- <source>Wallet options:</source>
- <translation>Options du portefeuille :</translation>
+ <translation>Le porte-monnaie %s réside en dehors du répertoire de données %s</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>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Options de débogage/de test du porte-monnaie :</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>
+ <source>Wallet options:</source>
+ <translation>Options du porte-monnaie :</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>
@@ -2972,12 +2139,8 @@
<translation>Se lier à l'adresse donnée pour écouter des connexions JSON-RPC. Utiliser la notation [host]:port pour l'IPv6. Cette option peut être spécifiée plusieurs fois (par défaut : se lier à toutes les interfaces)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Impossible d’obtenir un verrou sur le répertoire de données %s. Bitcoin Core fonctionne probablement déjà.</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>
+ <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 porte-monnaie désactivée)</translation>
</message>
<message>
<source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
@@ -2992,6 +2155,10 @@
<translation>Exécuter une commande lorsqu'une alerte pertinente est reçue ou si nous voyons une bifurcation vraiment étendue (%s dans la commande est remplacé par le message)</translation>
</message>
<message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Les frais (en %s/Ko) inférieurs à ce seuil sont considérés comme étant nuls pour le relais, le minage et 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>
@@ -3016,10 +2183,6 @@
<translation>Définir la taille maximale en octets des transactions prioritaires/à frais modiques (par défaut : %d)</translation>
</message>
<message>
- <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
- <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>
@@ -3028,6 +2191,10 @@
<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>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation>Utiliser une génération de clef hiérarchique déterministe (HD) après BIP32. N'a d'effet que lors de la création/premier lancement du porte-monnaie</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>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>
@@ -3044,48 +2211,24 @@
<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>Cannot resolve -whitebind address: '%s'</source>
- <translation>Impossible de résoudre l'adresse -whitebind : « %s »</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Créer automatiquement un service caché Tor (par défaut : %d)</translation>
</message>
<message>
<source>Connect through SOCKS5 proxy</source>
<translation>Se connecter par un mandataire SOCKS5</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright © 2009-%i Les développeurs de Bitcoin Core</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>Information</source>
- <translation>Informations</translation>
- </message>
- <message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Importe des blocs depuis un fichier blk000??.dat externe lors du démarrage</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Montant invalide pour -minrelayfee=&lt;montant&gt; : « %s »</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Montant invalide pour -mintxfee=&lt;montant&gt; : « %s »</translation>
+ <source>Information</source>
+ <translation>Informations</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3112,12 +2255,12 @@
<translation>Options du serveur RPC :</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>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Réduction de -maxconnections de %d à %d, due aux restrictions du système</translation>
</message>
<message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Recevoir et afficher les alertes du réseau poste à poste (%u par défaut)</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Réanalyser la chaîne de blocs au démarrage, à la recherche de transactions de porte-monnaie manquantes</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
@@ -3148,6 +2291,14 @@
<translation>Ceci est un logiciel expérimental.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Mot de passe du port de contrôle Tor (par défaut : vide)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Port de contrôle Tor à utiliser si l'écoute onion est activée (par défaut :%s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Montant de la transaction trop bas</translation>
</message>
@@ -3168,24 +2319,32 @@
<translation>Impossible de se lier à %s sur cet ordinateur (bind a retourné l'erreur %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Nom d'utilisateur pour les connexions JSON-RPC</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Mettre à niveau le porte-monnaie au démarrage vers le format le plus récent</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Le portefeuille avait besoin d'être réécrit : veuillez redémarrer Bitcoin Core pour terminer</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Nom d'utilisateur pour les connexions JSON-RPC</translation>
</message>
<message>
<source>Warning</source>
<translation>Avertissement</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Avertissement : nouvelles règles inconnues activées (bit de version %i)</translation>
+ </message>
+ <message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Faut-il fonctionner en mode blocs seulement (par défaut : %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
- <translation>Supprimer toutes les transactions du portefeuille...</translation>
+ <translation>Supprimer toutes les transactions du porte-monnaie...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrompu, la récupération a échoué</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>Options de notification ZeroMQ</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3196,10 +2355,6 @@
<translation>Exécuter la commande lorsque le meilleur bloc change (%s dans cmd est remplacé par le hachage du bloc)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Ce message d'aide</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Autoriser les recherches DNS pour -addnode, -seednode et -connect</translation>
</message>
@@ -3208,14 +2363,26 @@
<translation>Chargement des adresses…</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Erreur lors du chargement de wallet.dat : portefeuille corrompu</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 = conserver les métadonnées de transmission, par ex. les informations du propriétaire du compte et de la demande de paiement, 2 = abandonner les métadonnées de transmission)</translation>
</message>
<message>
+ <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee est défini très haut ! Des frais aussi élevés pourraient être payés en une seule transaction.</translation>
+ </message>
+ <message>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee est réglé sur un montant très élevé ! Il s'agit des frais de transaction que vous payerez si vous envoyez une transaction.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Ne pas conserver de transactions dans la réserve de mémoire plus de &lt;n&gt; heures (par défaut : %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Les frais (en %s/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>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
<translation>Degré de profondeur de la vérification des blocs -checkblocks (0-4, par défaut : %u)</translation>
</message>
@@ -3232,24 +2399,48 @@
<translation>Extraire les informations de débogage (par défaut : %u, fournir &lt;category&gt; est optionnel)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Prendre en charge le filtrage des blocs et des transactions avec les filtres bloom (par défaut : %u)</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>La taille totale de la chaîne de version de réseau (%i) dépasse la longueur maximale (%i). Réduire le nombre ou la taille des commentaires uacomments.</translation>
+ </message>
+ <message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Tente de garder le trafic sortant sous la cible donnée (en Mio par 24 h), 0 = sans limite (par défaut : %d)</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>L'argument non pris en charge -socks a été trouvé. Il n'est plus possible de définir la version de SOCKS, seuls les mandataires SOCKS5 sont pris en charge.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Argument non pris charge -whitelistalwaysrelay ignoré, utiliser -whitelistrelay et/ou -whitelistforcerelay.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Utiliser un serveur mandataire SOCKS5 séparé pour atteindre les pairs par les services cachés de Tor (par défaut : %s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(par défaut : %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Nom d'utilisateur et mot de passe haché pour les connexions JSON-RPC. Le champ &lt;userpw&gt; vient au format : &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Un script python canonique est inclus dans share/rpcuser. Cette option peut être spécifiée plusieurs fois.</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Toujours demander les adresses des pairs par recherche DNS (par défaut : %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Avertissement : des versions de blocs inconnues sont minées ! Il est possible que des règles inconnues soient en vigeur</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Erreur lors du chargement de wallet.dat</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Avertissement : le fichier du porte-monnaie est corrompu, les données ont été récupérées ! Le fichier %s original a été enregistré en tant que %s dans %s ; si votre solde ou vos transactions sont incorrects, vous devriez restaurer une sauvegarde.</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Générer des pièces (défaut : %u)</translation>
+ <source>(default: %s)</source>
+ <translation>(par défaut : %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Toujours demander les adresses des pairs par recherche DNS (par défaut : %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3277,7 +2468,7 @@
</message>
<message>
<source>Make the wallet broadcast transactions</source>
- <translation>Obliger le portefeuille à diffuser les transactions</translation>
+ <translation>Obliger le porte-monnaie à diffuser les transactions</translation>
</message>
<message>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
@@ -3308,6 +2499,10 @@
<translation>Définir la taille de bloc minimale en octets (par défaut : %u)</translation>
</message>
<message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>Définir le nombre d'exétrons pour desservir les appels RPC (par défaut : %d)</translation>
+ </message>
+ <message>
<source>Specify configuration file (default: %s)</source>
<translation>Spécifier le fichier de configuration (par défaut : %s)</translation>
</message>
@@ -3332,18 +2527,6 @@
<translation>Réseau inconnu spécifié sur -onlynet : « %s »</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Impossible de résoudre l'adresse -bind : « %s »</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Impossible de résoudre l'adresse -externalip : « %s »</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Montant invalide pour -paytxfee=&lt;montant&gt; : « %s »</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fonds insuffisants</translation>
</message>
@@ -3357,11 +2540,11 @@
</message>
<message>
<source>Loading wallet...</source>
- <translation>Chargement du portefeuille…</translation>
+ <translation>Chargement du porte-monnaie…</translation>
</message>
<message>
<source>Cannot downgrade wallet</source>
- <translation>Impossible de revenir à une version inférieure du portefeuille</translation>
+ <translation>Impossible de revenir à une version inférieure du porte-monnaie</translation>
</message>
<message>
<source>Cannot write default address</source>
diff --git a/src/qt/locale/bitcoin_fr_CA.ts b/src/qt/locale/bitcoin_fr_CA.ts
index 75f970f554..fca1e62883 100644
--- a/src/qt/locale/bitcoin_fr_CA.ts
+++ b/src/qt/locale/bitcoin_fr_CA.ts
@@ -13,25 +13,6 @@
<source>&amp;Delete</source>
<translation>&amp;Supprimer</translation>
</message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fichier séparé par une virgule (*.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Record</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Addresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(pas de record)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -47,23 +28,7 @@
<source>Repeat new passphrase</source>
<translation>Répéter Mot de Passe</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Encrypter Porte-Feuille</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Cette opération nécessite le mot de passe de votre porte-feuille pour débarrer le porte-feuille.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Débarrer Porte-Feuille</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Cette opération nécessite le mot de passe de votre porte-feuille pour le décrypter.</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -71,18 +36,23 @@
<name>BitcoinGUI</name>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
- <source>(no label)</source>
- <translation>(pas de record)</translation>
+ <source>(un)select all</source>
+ <translation>Toute sélectionner </translation>
</message>
</context>
<context>
<name>EditAddressDialog</name>
- </context>
+ <message>
+ <source>&amp;Label</source>
+ <translation>Record</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation>Addresse</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -91,6 +61,10 @@
</context>
<context>
<name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>Bienvenue </translation>
+ </message>
</context>
<context>
<name>OpenURIDialog</name>
@@ -102,18 +76,12 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -121,32 +89,9 @@
</context>
<context>
<name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>Addresse</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Record</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Label</source>
- <translation>Record</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(pas de record)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
- <message>
- <source>(no label)</source>
- <translation>(pas de record)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -164,46 +109,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Label</source>
- <translation>Record</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fichier séparé par une virgule (*.csv)</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Record</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Addresse</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_fr_FR.ts b/src/qt/locale/bitcoin_fr_FR.ts
index c55b08b646..a6f6ac4fd1 100644
--- a/src/qt/locale/bitcoin_fr_FR.ts
+++ b/src/qt/locale/bitcoin_fr_FR.ts
@@ -2,44 +2,53 @@
<context>
<name>AddressBookPage</name>
<message>
+ <source>Right-click to edit address or label</source>
+ <translation>Double cliquez afin de modifier l'adresse ou l'étiquette</translation>
+ </message>
+ <message>
<source>Create a new address</source>
<translation>Créer une nouvelle adresse</translation>
</message>
<message>
+ <source>&amp;New</source>
+ <translation>&amp;Nouveau</translation>
+ </message>
+ <message>
<source>Copy the currently selected address to the system clipboard</source>
<translation>Copier l'adresse surlignée dans votre presse-papiers</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporter les données de l'onglet courant vers un fichier</translation>
+ <source>&amp;Copy</source>
+ <translation>&amp;Copie</translation>
</message>
<message>
- <source>&amp;Delete</source>
- <translation>&amp;Supprimer</translation>
+ <source>C&amp;lose</source>
+ <translation>F&amp;ermer</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Valeurs séparées par des virgules (*.csv)</translation>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Supprimer l'adresse sélectionnée de la liste</translation>
</message>
- </context>
-<context>
- <name>AddressTableModel</name>
<message>
- <source>Label</source>
- <translation>Étiquette</translation>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Exporter les données de l'onglet courant vers un fichier</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresse</translation>
+ <source>&amp;Export</source>
+ <translation>&amp;Exporter...</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(aucune étiquette)</translation>
+ <source>&amp;Delete</source>
+ <translation>&amp;Supprimer</translation>
</message>
</context>
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation>Dialogue mot de passe</translation>
+ </message>
+ <message>
<source>Enter passphrase</source>
<translation>Entrez la phrase de passe</translation>
</message>
@@ -51,107 +60,111 @@
<source>Repeat new passphrase</source>
<translation>Répétez la phrase de passe</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Chiffrer le porte-monnaie</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Masque de sous réseau</translation>
</message>
<message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Cette opération nécessite votre phrase de passe pour déverrouiller le porte-monnaie.</translation>
+ <source>Banned Until</source>
+ <translation>Banni jusque </translation>
</message>
+</context>
+<context>
+ <name>BitcoinGUI</name>
<message>
- <source>Unlock wallet</source>
- <translation>Déverrouiller le porte-monnaie</translation>
+ <source>Sign &amp;message...</source>
+ <translation>Signer &amp;message...</translation>
</message>
<message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Cette opération nécessite votre phrase de passe pour décrypter le porte-monnaie.</translation>
+ <source>Synchronizing with network...</source>
+ <translation>Synchronisation avec le réseau...</translation>
</message>
<message>
- <source>Decrypt wallet</source>
- <translation>Décrypter le porte-monnaie</translation>
+ <source>&amp;Overview</source>
+ <translation>&amp;Vue d'ensemble</translation>
</message>
<message>
- <source>Change passphrase</source>
- <translation>Changer la phrase de passe</translation>
+ <source>Node</source>
+ <translation>NÅ“ud</translation>
</message>
<message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmer le chiffrement du porte-monnaie</translation>
+ <source>Show general overview of wallet</source>
+ <translation>Affiche une vue d'ensemble du porte-monnaie</translation>
</message>
<message>
- <source>Wallet encrypted</source>
- <translation>Porte-monnaie chiffré</translation>
+ <source>&amp;Transactions</source>
+ <translation>&amp;Transactions</translation>
</message>
<message>
- <source>Wallet encryption failed</source>
- <translation>Le chiffrement du porte-monnaie a échoué</translation>
+ <source>Browse transaction history</source>
+ <translation>Permet de parcourir l'historique des transactions</translation>
</message>
<message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Le chiffrement du porte-monnaie a échoué en raison d'une erreur interne. Votre porte-monnaie n'a pas été chiffré.</translation>
+ <source>E&amp;xit</source>
+ <translation>Qui&amp;tter</translation>
</message>
<message>
- <source>The supplied passphrases do not match.</source>
- <translation>Les phrases de passe entrées ne correspondent pas.</translation>
+ <source>Quit application</source>
+ <translation>Quitter l'application</translation>
</message>
<message>
- <source>Wallet unlock failed</source>
- <translation>Le déverrouillage du porte-monnaie a échoué</translation>
+ <source>&amp;About %1</source>
+ <translation>&amp;À propos de %1</translation>
</message>
<message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La phrase de passe entrée pour décrypter le porte-monnaie était erronée.</translation>
+ <source>Show information about %1</source>
+ <translation>Afficher les informations sur %1</translation>
</message>
<message>
- <source>Wallet decryption failed</source>
- <translation>Le décryptage du porte-monnaie a échoué</translation>
+ <source>About &amp;Qt</source>
+ <translation>À propos de &amp;Qt</translation>
</message>
- </context>
-<context>
- <name>BanTableModel</name>
- </context>
-<context>
- <name>BitcoinGUI</name>
<message>
- <source>Synchronizing with network...</source>
- <translation>Synchronisation avec le réseau...</translation>
+ <source>Show information about Qt</source>
+ <translation>Afficher des informations sur Qt</translation>
</message>
<message>
- <source>&amp;Overview</source>
- <translation>&amp;Vue d'ensemble</translation>
+ <source>&amp;Options...</source>
+ <translation>&amp;Options...</translation>
</message>
<message>
- <source>Show general overview of wallet</source>
- <translation>Affiche une vue d'ensemble du porte-monnaie</translation>
+ <source>Modify configuration options for %1</source>
+ <translation>Modifier les options de configuration pour %1</translation>
</message>
<message>
- <source>&amp;Transactions</source>
- <translation>&amp;Transactions</translation>
+ <source>&amp;Encrypt Wallet...</source>
+ <translation>&amp;Chiffrer le portefeuille </translation>
</message>
<message>
- <source>Browse transaction history</source>
- <translation>Permet de parcourir l'historique des transactions</translation>
+ <source>&amp;Backup Wallet...</source>
+ <translation>&amp;Sauvegarder le portefeuille</translation>
</message>
<message>
- <source>E&amp;xit</source>
- <translation>Qui&amp;tter</translation>
+ <source>&amp;Change Passphrase...</source>
+ <translation>&amp;Modifier le mot de passe</translation>
</message>
<message>
- <source>Quit application</source>
- <translation>Quitter l'application</translation>
+ <source>&amp;Sending addresses...</source>
+ <translation>&amp;Adresses d'envoi</translation>
</message>
<message>
- <source>About &amp;Qt</source>
- <translation>À propos de &amp;Qt</translation>
+ <source>&amp;Receiving addresses...</source>
+ <translation>&amp;Adresses de réception</translation>
</message>
<message>
- <source>Show information about Qt</source>
- <translation>Afficher des informations sur Qt</translation>
+ <source>Open &amp;URI...</source>
+ <translation>Ouvrir &amp;URI</translation>
</message>
<message>
- <source>&amp;Options...</source>
- <translation>&amp;Options...</translation>
+ <source>Reindexing blocks on disk...</source>
+ <translation>Réindexer les blocs sur le disque...</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation>Envoyer des pièces à une adresse Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
@@ -162,14 +175,50 @@
<translation>Modifier la phrase de passe utilisée pour le cryptage du porte-monnaie</translation>
</message>
<message>
+ <source>&amp;Debug window</source>
+ <translation>&amp;Fenêtre de débogage</translation>
+ </message>
+ <message>
+ <source>Open debugging and diagnostic console</source>
+ <translation>Ouvrir la console de débogage et de diagnostic</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message...</source>
+ <translation>&amp;Vérification du message</translation>
+ </message>
+ <message>
<source>Bitcoin</source>
<translation>Bitcoin</translation>
</message>
<message>
+ <source>Wallet</source>
+ <translation>Portefeuille</translation>
+ </message>
+ <message>
<source>&amp;Send</source>
<translation>&amp;Envoyer</translation>
</message>
<message>
+ <source>&amp;Receive</source>
+ <translation>&amp;Réception</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <translation>&amp;Montrer / Cacher</translation>
+ </message>
+ <message>
+ <source>Show or hide the main Window</source>
+ <translation>Montrer ou cacher la fenêtre principale</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation>Crypter les clé privées qui appartiennent votre portefeuille</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation>Signer vos messages avec vos adresses Bitcoin pour prouver que vous les détenez</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation>&amp;Fichier</translation>
</message>
@@ -186,14 +235,120 @@
<translation>Barre d'outils des onglets</translation>
</message>
<message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation>Demander des paiements (générer QR codes et bitcoin: URIs)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation>Montrer la liste des adresses d'envois utilisées et les étiquettes</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI or payment request</source>
+ <translation>Ouvrir un bitcoin: URI ou demande de paiement</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation>&amp;Options de ligne de commande</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network</source>
+ <translation><numerusform>%n connexion active au réseau Bitcoin</numerusform><numerusform>%n connexions actives au réseau Bitcoin</numerusform></translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Indexation des blocs sur le disque...</translation>
+ </message>
+ <message>
+ <source>No block source available...</source>
+ <translation>Aucun bloc source disponible</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation><numerusform>%n heure</numerusform><numerusform>%n heures</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation><numerusform>%n jour</numerusform><numerusform>%n jours</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation><numerusform>%n semaine</numerusform><numerusform>%n semaines</numerusform></translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation>%1 et %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation><numerusform>%n an</numerusform><numerusform>%n années</numerusform></translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation>en retard de %1</translation>
+ </message>
+ <message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation>Le dernier bloc reçu a été généré %1.</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation>Les transactions ne seront plus visible après ceci.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>Attention</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Information</translation>
+ </message>
+ <message>
<source>Up to date</source>
<translation>À jour</translation>
</message>
<message>
+ <source>%1 client</source>
+ <translation>%1 client</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Rattrapage...</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation>Date: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation>Montant:%1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation>Type: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <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>
@@ -211,43 +366,84 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Sélection de pièce </translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation>Quantité:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation>Octets:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>Montant :</translation>
</message>
<message>
+ <source>Priority:</source>
+ <translation>Priorité:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>Frais:</translation>
+ </message>
+ <message>
+ <source>Dust:</source>
+ <translation>Poussière: </translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation>Après frais:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>Change:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation>(dé)sélectionné tout:</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation>Mode arbre</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation>Mode list</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>Montant</translation>
</message>
<message>
- <source>Date</source>
- <translation>Date</translation>
+ <source>Received with label</source>
+ <translation>Reçu avec : </translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>Confirmée</translation>
+ <source>Received with address</source>
+ <translation>Reçue avec l'adresse</translation>
</message>
<message>
- <source>Copy address</source>
- <translation>Copier l'adresse</translation>
+ <source>Date</source>
+ <translation>Date</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Copier l'étiquette</translation>
+ <source>Confirmations</source>
+ <translation>Confirmations</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Copier le montant</translation>
+ <source>Confirmed</source>
+ <translation>Confirmée</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(aucune étiquette)</translation>
+ <source>Priority</source>
+ <translation>Priorité</translation>
</message>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -262,51 +458,115 @@
<source>&amp;Address</source>
<translation>&amp;Adresse</translation>
</message>
+</context>
+<context>
+ <name>FreespaceChecker</name>
<message>
- <source>New receiving address</source>
- <translation>Nouvelle adresse de réception</translation>
+ <source>A new data directory will be created.</source>
+ <translation>Un nouveau répertoire de données sera créé. </translation>
</message>
<message>
- <source>New sending address</source>
- <translation>Nouvelle adresse d'envoi</translation>
+ <source>name</source>
+ <translation>nom</translation>
</message>
<message>
- <source>Edit receiving address</source>
- <translation>Éditer l'adresse de réception</translation>
+ <source>Path already exists, and is not a directory.</source>
+ <translation>Le chemin existe déjà et ce n'est pas un répertoire. </translation>
</message>
<message>
- <source>Edit sending address</source>
- <translation>Éditer l'adresse d'envoi</translation>
+ <source>Cannot create data directory here.</source>
+ <translation>Impossible de créer un répertoire ici.</translation>
</message>
+</context>
+<context>
+ <name>HelpMessageDialog</name>
<message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>L'adresse fournie « %1 » est déjà présente dans le carnet d'adresses.</translation>
+ <source>version</source>
+ <translation>version</translation>
</message>
<message>
- <source>Could not unlock wallet.</source>
- <translation>Impossible de déverrouiller le porte-monnaie.</translation>
+ <source>(%1-bit)</source>
+ <translation>(%1-bit)</translation>
</message>
<message>
- <source>New key generation failed.</source>
- <translation>Échec de la génération de la nouvelle clef.</translation>
+ <source>About %1</source>
+ <translation>A propos %1</translation>
+ </message>
+ <message>
+ <source>Command-line options</source>
+ <translation>Options de ligne de commande</translation>
</message>
-</context>
-<context>
- <name>FreespaceChecker</name>
- </context>
-<context>
- <name>HelpMessageDialog</name>
<message>
<source>Usage:</source>
<translation>Utilisation :</translation>
</message>
+ <message>
+ <source>command-line options</source>
+ <translation>Options de ligne de commande</translation>
+ </message>
+ <message>
+ <source>UI Options:</source>
+ <translation>Options interface graphique:</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Démarrer sous forme minimisée</translation>
+ </message>
</context>
<context>
<name>Intro</name>
- </context>
+ <message>
+ <source>Welcome</source>
+ <translation>Bienvenue </translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation>Bienvenue sur %1.</translation>
+ </message>
+ <message>
+ <source>Use the default data directory</source>
+ <translation>Utiliser le répertoire par défaut </translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation>Utiliser votre propre répertoire</translation>
+ </message>
+ <message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation>Erreur: Le répertoire de données "%1" n'a pas pu être créé. </translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n GO d'espace libre disponible</numerusform><numerusform>%n GO d'espace libre disponible</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(%n GB nécessaire)</numerusform><numerusform>(%n GB nécessaire)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
- </context>
+ <message>
+ <source>Open URI</source>
+ <translation>Ouvrir URI</translation>
+ </message>
+ <message>
+ <source>Open payment request from URI or file</source>
+ <translation>Ouvrir une demande de paiement depuis une URI ou un fichier</translation>
+ </message>
+ <message>
+ <source>URI:</source>
+ <translation>URI:</translation>
+ </message>
+ <message>
+ <source>Select payment request file</source>
+ <translation>Sélectionner un fichier de demande de paiement</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -314,6 +574,46 @@
<translation>Options</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation>&amp;Principal</translation>
+ </message>
+ <message>
+ <source>Size of &amp;database cache</source>
+ <translation>Taille du cache de la base de données.</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation>MO</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside</source>
+ <translation>Accepter les connexions venant de l'extérieur</translation>
+ </message>
+ <message>
+ <source>Allow incoming connections</source>
+ <translation>Autoriser les connexions entrantes</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation>Adresse IP du proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ </message>
+ <message>
+ <source>Reset all client options to default.</source>
+ <translation>Réinitialiser toutes les options du client par défaut.</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation>&amp;Options de réinitialisation </translation>
+ </message>
+ <message>
+ <source>&amp;Network</source>
+ <translation>&amp;Réseau</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation>Expert</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>Ouvrir le port du client Bitcoin automatiquement sur le routeur. Cela ne fonctionne que si votre routeur supporte l'UPnP et si la fonctionnalité est activée.</translation>
</message>
@@ -322,6 +622,46 @@
<translation>Ouvrir le port avec l'&amp;UPnP</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation>Proxy &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation>&amp;Port:</translation>
+ </message>
+ <message>
+ <source>Port of the proxy (e.g. 9050)</source>
+ <translation>Port du proxy (e.g. 9050)</translation>
+ </message>
+ <message>
+ <source>Used for reaching peers via:</source>
+ <translation>Utilisé pour contacter des pairs via:</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation>&amp;Fenêtre</translation>
+ </message>
+ <message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Cacher l'icône dans la zone de notification.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Cacher l'icône de la zone de notification</translation>
+ </message>
+ <message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
<translation>&amp;Minimiser dans la barre système au lieu de la barre des tâches</translation>
</message>
@@ -329,483 +669,656 @@
<source>M&amp;inimize on close</source>
<translation>Mi&amp;nimiser lors de la fermeture</translation>
</message>
- </context>
+ <message>
+ <source>&amp;Display</source>
+ <translation>&amp;Afficher</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation>Interface utilisateur &amp;langage:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler </translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation>defaut</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>aucun</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <translation>Confirmer les options de réinitialisation </translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <translation>Redémarrage du client nécessaire pour activer les changements.</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation>Ce changement nécessiterait un redémarrage du client.</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation>L'adresse du proxy est invalide.</translation>
+ </message>
+</context>
<context>
<name>OverviewPage</name>
<message>
<source>Form</source>
<translation>Formulaire</translation>
</message>
- </context>
-<context>
- <name>PaymentServer</name>
+ <message>
+ <source>Watch-only:</source>
+ <translation>Regarder seulement:</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation>Disponible: </translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation>En attente:</translation>
+ </message>
+ <message>
+ <source>Immature:</source>
+ <translation>Immature:</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation>Balances</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation>Total:</translation>
+ </message>
+ <message>
+ <source>Your current total balance</source>
+ <translation>Votre balance totale courante</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation>Dépensable: </translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation>Transactions récentes </translation>
+ </message>
</context>
<context>
<name>PeerTableModel</name>
- </context>
+ <message>
+ <source>User Agent</source>
+ <translation>Agent Utilisateur</translation>
+ </message>
+ <message>
+ <source>Node/Service</source>
+ <translation>NÅ“ud/Service </translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Temps du ping</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
<source>Amount</source>
<translation>Montant</translation>
</message>
- </context>
-<context>
- <name>QRImageWidget</name>
- </context>
-<context>
- <name>RPCConsole</name>
<message>
- <source>Name</source>
- <translation>Nom</translation>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation>Entrer une adresse Bitcoin (e.g. %1)</translation>
</message>
- </context>
-<context>
- <name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>&amp;Étiquette :</translation>
+ <source>%1 d</source>
+ <translation>%1 j</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation>%1 h</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Copier l'étiquette</translation>
+ <source>%1 m</source>
+ <translation>%1 m</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Copier le montant</translation>
+ <source>%1 s</source>
+ <translation>%1 s</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Aucun</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation>N/A</translation>
+ </message>
+ <message>
+ <source>%1 ms</source>
+ <translation>%1 ms</translation>
</message>
</context>
<context>
- <name>ReceiveRequestDialog</name>
+ <name>RPCConsole</name>
<message>
- <source>QR Code</source>
- <translation>QR Code</translation>
+ <source>N/A</source>
+ <translation>N/A </translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresse</translation>
+ <source>Client version</source>
+ <translation>Version du client</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Montant</translation>
+ <source>&amp;Information</source>
+ <translation>&amp;Information</translation>
</message>
<message>
- <source>Label</source>
- <translation>Étiquette</translation>
+ <source>Debug window</source>
+ <translation>Fenêtre de débogage </translation>
</message>
<message>
- <source>Message</source>
- <translation>Message</translation>
+ <source>General</source>
+ <translation>Général</translation>
</message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
<message>
- <source>Date</source>
- <translation>Date</translation>
+ <source>Using BerkeleyDB version</source>
+ <translation>Version BerkeleyDButilisée </translation>
</message>
<message>
- <source>Label</source>
- <translation>Étiquette</translation>
+ <source>Startup time</source>
+ <translation>Le temps de démarrage</translation>
</message>
<message>
- <source>Message</source>
- <translation>Message</translation>
+ <source>Network</source>
+ <translation>Réseau</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Montant</translation>
+ <source>Name</source>
+ <translation>Nom</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(aucune étiquette)</translation>
+ <source>Number of connections</source>
+ <translation>Nombre de connexions</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation>Envoyer des pièces</translation>
+ <source>Block chain</source>
+ <translation>Chaîne de bloc </translation>
</message>
<message>
- <source>Amount:</source>
- <translation>Montant :</translation>
+ <source>Current number of blocks</source>
+ <translation>Nombre courant de blocs</translation>
</message>
<message>
- <source>Send to multiple recipients at once</source>
- <translation>Envoyer des pièces à plusieurs destinataires à la fois</translation>
+ <source>Memory Pool</source>
+ <translation>Mémoire du pool</translation>
</message>
<message>
- <source>Balance:</source>
- <translation>Solde :</translation>
+ <source>Current number of transactions</source>
+ <translation>Nombre courant de transactions</translation>
</message>
<message>
- <source>Confirm the send action</source>
- <translation>Confirmer l'action d'envoi</translation>
+ <source>Memory usage</source>
+ <translation>Usage de la mémoire</translation>
</message>
<message>
- <source>Confirm send coins</source>
- <translation>Confirmer l'envoi des pièces</translation>
+ <source>Received</source>
+ <translation>Reçu </translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Copier le montant</translation>
+ <source>Sent</source>
+ <translation>Envoyé</translation>
</message>
<message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Le montant à payer doit être supérieur à 0.</translation>
+ <source>&amp;Peers</source>
+ <translation>&amp;Pairs</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(aucune étiquette)</translation>
+ <source>Banned peers</source>
+ <translation>Pairs bannis</translation>
</message>
- </context>
-<context>
- <name>SendCoinsEntry</name>
<message>
- <source>A&amp;mount:</source>
- <translation>&amp;Montant :</translation>
+ <source>Whitelisted</source>
+ <translation>Autorisé par la liste</translation>
</message>
<message>
- <source>Pay &amp;To:</source>
- <translation>Payer &amp;à :</translation>
+ <source>Direction</source>
+ <translation>Direction</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Entrez une étiquette pour cette adresse afin de l'ajouter à votre carnet d'adresses</translation>
+ <source>Version</source>
+ <translation>Version</translation>
</message>
<message>
- <source>&amp;Label:</source>
- <translation>&amp;Étiquette :</translation>
+ <source>Starting Block</source>
+ <translation>Bloc de départ</translation>
</message>
<message>
- <source>Alt+A</source>
- <translation>Alt+A</translation>
+ <source>Synced Blocks</source>
+ <translation>Blocs Synchronisés </translation>
</message>
<message>
- <source>Paste address from clipboard</source>
- <translation>Coller une adresse depuis le presse-papiers</translation>
+ <source>User Agent</source>
+ <translation>Agent Utilisateur</translation>
</message>
<message>
- <source>Alt+P</source>
- <translation>Alt+P</translation>
+ <source>Services</source>
+ <translation>Services</translation>
</message>
<message>
- <source>Message:</source>
- <translation>Message :</translation>
+ <source>Ban Score</source>
+ <translation>Score de ban</translation>
</message>
- </context>
-<context>
- <name>ShutdownWindow</name>
- </context>
-<context>
- <name>SignVerifyMessageDialog</name>
<message>
- <source>&amp;Sign Message</source>
- <translation>&amp;Signer le message</translation>
+ <source>Connection Time</source>
+ <translation>Temps de connexion</translation>
</message>
<message>
- <source>Alt+A</source>
- <translation>Alt+A</translation>
+ <source>Last Send</source>
+ <translation>Dernier envoyé</translation>
</message>
<message>
- <source>Paste address from clipboard</source>
- <translation>Coller une adresse depuis le presse-papiers</translation>
+ <source>Last Receive</source>
+ <translation>Dernier reçu</translation>
</message>
<message>
- <source>Alt+P</source>
- <translation>Alt+P</translation>
+ <source>Ping Time</source>
+ <translation>Temps du ping</translation>
</message>
<message>
- <source>Enter the message you want to sign here</source>
- <translation>Entrez ici le message que vous désirez signer</translation>
+ <source>Ping Wait</source>
+ <translation>Attente du ping</translation>
</message>
- </context>
-<context>
- <name>SplashScreen</name>
<message>
- <source>[testnet]</source>
- <translation>[testnet]</translation>
+ <source>&amp;Open</source>
+ <translation>&amp;Ouvert</translation>
</message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
- </context>
-<context>
- <name>TransactionDesc</name>
<message>
- <source>Open until %1</source>
- <translation>Ouvert jusqu'à %1</translation>
+ <source>&amp;Console</source>
+ <translation>&amp;Console</translation>
</message>
<message>
- <source>%1/unconfirmed</source>
- <translation>%1/non confirmée</translation>
+ <source>&amp;Network Traffic</source>
+ <translation>&amp;Trafic réseau</translation>
</message>
<message>
- <source>%1 confirmations</source>
- <translation>%1 confirmations</translation>
+ <source>&amp;Clear</source>
+ <translation>&amp;Nettoyer</translation>
</message>
<message>
- <source>Status</source>
- <translation>État</translation>
+ <source>Totals</source>
+ <translation>Totaux</translation>
</message>
<message>
- <source>Date</source>
- <translation>Date</translation>
+ <source>In:</source>
+ <translation>Entrée:</translation>
</message>
<message>
- <source>Generated</source>
- <translation>Généré</translation>
+ <source>Out:</source>
+ <translation>Sortie:</translation>
</message>
<message>
- <source>Credit</source>
- <translation>Crédit</translation>
+ <source>Debug log file</source>
+ <translation>Fichier du journal de débogage</translation>
</message>
<message>
- <source>Debit</source>
- <translation>Débit</translation>
+ <source>Clear console</source>
+ <translation>Nettoyer la console</translation>
</message>
<message>
- <source>Message</source>
- <translation>Message</translation>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;heure</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Montant</translation>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;jour</translation>
</message>
<message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, n'a pas encore été diffusée avec succès</translation>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;semaine</translation>
</message>
<message>
- <source>unknown</source>
- <translation>inconnue</translation>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;an</translation>
</message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Détails de la transaction</translation>
+ <source>%1 B</source>
+ <translation>%1 O</translation>
</message>
<message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation>Ce panneau affiche une description détaillée de la transaction</translation>
+ <source>%1 KB</source>
+ <translation>%1 KO</translation>
</message>
-</context>
-<context>
- <name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation>Date</translation>
+ <source>%1 MB</source>
+ <translation>%1 MO</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation>%1 GO</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation>via %1</translation>
</message>
<message>
- <source>Type</source>
- <translation>Type</translation>
+ <source>never</source>
+ <translation>jamais</translation>
</message>
<message>
- <source>Open until %1</source>
- <translation>Ouvert jusqu'à %1</translation>
+ <source>Yes</source>
+ <translation>Oui</translation>
</message>
<message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmée (%1 confirmations)</translation>
+ <source>No</source>
+ <translation>Non</translation>
</message>
<message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ce bloc n'a été reçu par aucun autre nœud et ne sera probablement pas accepté !</translation>
+ <source>Unknown</source>
+ <translation>Inconnu</translation>
</message>
+</context>
+<context>
+ <name>ReceiveCoinsDialog</name>
<message>
- <source>Generated but not accepted</source>
- <translation>Généré mais pas accepté</translation>
+ <source>&amp;Amount:</source>
+ <translation>Montant :</translation>
</message>
<message>
- <source>Label</source>
- <translation>Étiquette</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;Étiquette :</translation>
</message>
<message>
- <source>Received with</source>
- <translation>Reçues avec</translation>
+ <source>&amp;Message:</source>
+ <translation>Message :</translation>
</message>
<message>
- <source>Received from</source>
- <translation>Reçue de</translation>
+ <source>Clear all fields of the form.</source>
+ <translation>Nettoyer tous les champs du formulaire.</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Envoyées à</translation>
+ <source>Clear</source>
+ <translation>Nettoyer</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation>Paiement à vous-même</translation>
+ <source>Requested payments history</source>
+ <translation>Historique des demandes de paiements.</translation>
</message>
<message>
- <source>Mined</source>
- <translation>Extraction</translation>
+ <source>&amp;Request payment</source>
+ <translation>&amp;Demande de paiement</translation>
</message>
<message>
- <source>(n/a)</source>
- <translation>(indisponible)</translation>
+ <source>Show</source>
+ <translation>Montrer</translation>
</message>
<message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>État de la transaction. Laissez le pointeur de la souris sur ce champ pour voir le nombre de confirmations.</translation>
+ <source>Remove</source>
+ <translation>Retirer</translation>
</message>
+</context>
+<context>
+ <name>ReceiveRequestDialog</name>
<message>
- <source>Date and time that the transaction was received.</source>
- <translation>Date et heure de réception de la transaction.</translation>
+ <source>QR Code</source>
+ <translation>QR Code</translation>
</message>
<message>
- <source>Type of transaction.</source>
- <translation>Type de transaction.</translation>
+ <source>Copy &amp;URI</source>
+ <translation>Copier &amp;URI</translation>
</message>
<message>
- <source>Amount removed from or added to balance.</source>
- <translation>Montant ajouté au ou enlevé du solde.</translation>
+ <source>Copy &amp;Address</source>
+ <translation>Copier &amp;Adresse</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image...</source>
+ <translation>&amp;Sauvegarder image</translation>
</message>
</context>
<context>
- <name>TransactionView</name>
+ <name>SendCoinsDialog</name>
<message>
- <source>All</source>
- <translation>Toutes</translation>
+ <source>Send Coins</source>
+ <translation>Envoyer des pièces</translation>
</message>
<message>
- <source>Today</source>
- <translation>Aujourd'hui</translation>
+ <source>Inputs...</source>
+ <translation>Sorties...</translation>
</message>
<message>
- <source>This week</source>
- <translation>Cette semaine</translation>
+ <source>automatically selected</source>
+ <translation>Automatiquement sélectionné </translation>
</message>
<message>
- <source>This month</source>
- <translation>Ce mois</translation>
+ <source>Insufficient funds!</source>
+ <translation>Fonds insuffisants</translation>
</message>
<message>
- <source>Last month</source>
- <translation>Mois dernier</translation>
+ <source>Quantity:</source>
+ <translation>Quantité:</translation>
</message>
<message>
- <source>This year</source>
- <translation>Cette année</translation>
+ <source>Bytes:</source>
+ <translation>Octets:</translation>
</message>
<message>
- <source>Range...</source>
- <translation>Intervalle...</translation>
+ <source>Amount:</source>
+ <translation>Montant :</translation>
</message>
<message>
- <source>Received with</source>
- <translation>Reçues avec</translation>
+ <source>Priority:</source>
+ <translation>Priorité:</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Envoyées à</translation>
+ <source>Fee:</source>
+ <translation>Frais:</translation>
</message>
<message>
- <source>To yourself</source>
- <translation>À vous-même</translation>
+ <source>After Fee:</source>
+ <translation>Après frais:</translation>
</message>
<message>
- <source>Mined</source>
- <translation>Extraction</translation>
+ <source>Change:</source>
+ <translation>Change:</translation>
</message>
<message>
- <source>Other</source>
- <translation>Autres</translation>
+ <source>Transaction Fee:</source>
+ <translation>Frais de transaction</translation>
</message>
<message>
- <source>Enter address or label to search</source>
- <translation>Entrez une adresse ou une étiquette à rechercher</translation>
+ <source>Choose...</source>
+ <translation>Choisir...</translation>
</message>
<message>
- <source>Min amount</source>
- <translation>Montant min</translation>
+ <source>per kilobyte</source>
+ <translation>par kilo octet</translation>
</message>
<message>
- <source>Copy address</source>
- <translation>Copier l'adresse</translation>
+ <source>Hide</source>
+ <translation>Cacher</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Copier l'étiquette</translation>
+ <source>total at least</source>
+ <translation>Au total au moins</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Copier le montant</translation>
+ <source>Recommended:</source>
+ <translation>Recommandé: </translation>
</message>
<message>
- <source>Edit label</source>
- <translation>Éditer l'étiquette</translation>
+ <source>Confirmation time:</source>
+ <translation>Temps de confirmation:</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Valeurs séparées par des virgules (*.csv)</translation>
+ <source>normal</source>
+ <translation>normal</translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>Confirmée</translation>
+ <source>fast</source>
+ <translation>rapide</translation>
</message>
<message>
- <source>Date</source>
- <translation>Date</translation>
+ <source>Send to multiple recipients at once</source>
+ <translation>Envoyer des pièces à plusieurs destinataires à la fois</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation>Nettoyer tous les champs du formulaire.</translation>
+ </message>
+ <message>
+ <source>Dust:</source>
+ <translation>Poussière: </translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation>Nettoyer &amp;Tout</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation>Solde :</translation>
+ </message>
+ <message>
+ <source>Confirm the send action</source>
+ <translation>Confirmer l'action d'envoi</translation>
</message>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
<message>
- <source>Type</source>
- <translation>Type</translation>
+ <source>A&amp;mount:</source>
+ <translation>&amp;Montant :</translation>
</message>
<message>
- <source>Label</source>
- <translation>Étiquette</translation>
+ <source>Pay &amp;To:</source>
+ <translation>Payer &amp;à :</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresse</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;Étiquette :</translation>
</message>
<message>
- <source>ID</source>
- <translation>ID</translation>
+ <source>Choose previously used address</source>
+ <translation>Choisir une adresse précédemment utilisée </translation>
</message>
<message>
- <source>Range:</source>
- <translation>Intervalle :</translation>
+ <source>This is a normal payment.</source>
+ <translation>C'est un paiement normal.</translation>
</message>
<message>
- <source>to</source>
- <translation>à</translation>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation>Coller une adresse depuis le presse-papiers</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation>Retirer cette entrée</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation>Message :</translation>
+ </message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Payer à :</translation>
+ </message>
+ <message>
+ <source>Memo:</source>
+ <translation>Memo:</translation>
</message>
</context>
<context>
- <name>UnitDisplayStatusBarControl</name>
- </context>
-<context>
- <name>WalletFrame</name>
+ <name>ShutdownWindow</name>
</context>
<context>
- <name>WalletModel</name>
+ <name>SignVerifyMessageDialog</name>
<message>
- <source>Send Coins</source>
- <translation>Envoyer des pièces</translation>
+ <source>&amp;Sign Message</source>
+ <translation>&amp;Signer le message</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporter les données de l'onglet courant vers un fichier</translation>
+ <source>Choose previously used address</source>
+ <translation>Choisir une adresse précédemment utilisée </translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation>Coller une adresse depuis le presse-papiers</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation>Entrez ici le message que vous désirez signer</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation>Signature</translation>
+ </message>
+ <message>
+ <source>Copy the current signature to the system clipboard</source>
+ <translation>Copier l'adresse courante dans le presse papier</translation>
+ </message>
+ <message>
+ <source>Sign &amp;Message</source>
+ <translation>&amp;Signer le message</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation>Nettoyer &amp;Tout</translation>
+ </message>
+ <message>
+ <source>&amp;Verify Message</source>
+ <translation>&amp;Vérifier message</translation>
+ </message>
+ <message>
+ <source>Verify &amp;Message</source>
+ <translation>Vérifier &amp;Message</translation>
</message>
+ </context>
+<context>
+ <name>SplashScreen</name>
<message>
- <source>Backup Wallet</source>
- <translation>Sauvegarder le porte-monnaie</translation>
+ <source>[testnet]</source>
+ <translation>[testnet]</translation>
</message>
+</context>
+<context>
+ <name>TrafficGraphWidget</name>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Données de porte-monnaie (*.dat)</translation>
+ <source>KB/s</source>
+ <translation>KO/s</translation>
</message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
<message>
- <source>Backup Failed</source>
- <translation>La sauvegarde a échoué</translation>
+ <source>This pane shows a detailed description of the transaction</source>
+ <translation>Ce panneau affiche une description détaillée de la transaction</translation>
</message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
</context>
<context>
<name>bitcoin-core</name>
@@ -818,6 +1331,10 @@
<translation>Spécifier le répertoire de données</translation>
</message>
<message>
+ <source>Specify your own public address</source>
+ <translation>Spécifier votre adresse publique </translation>
+ </message>
+ <message>
<source>Accept command line and JSON-RPC commands</source>
<translation>Accepter les commandes de JSON-RPC et de la ligne de commande</translation>
</message>
@@ -826,32 +1343,121 @@
<translation>Fonctionner en arrière-plan en tant que démon et accepter les commandes</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Impossible de démarrer le serveur HTTP. Voir le journal de débogage pour plus de détails.</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;category&gt; peut être:</translation>
+ </message>
+ <message>
+ <source>Block creation options:</source>
+ <translation>Options de création de bloc:</translation>
+ </message>
+ <message>
+ <source>Connection options:</source>
+ <translation>Options de connexion:</translation>
+ </message>
+ <message>
+ <source>Debugging/Testing options:</source>
+ <translation>Options de débogage/test </translation>
+ </message>
+ <message>
+ <source>Importing...</source>
+ <translation>
+Importation ...</translation>
+ </message>
+ <message>
+ <source>Verifying blocks...</source>
+ <translation>Vérifications des blocs...</translation>
+ </message>
+ <message>
+ <source>Verifying wallet...</source>
+ <translation>Vérification du portefeuille...</translation>
+ </message>
+ <message>
+ <source>Wallet options:</source>
+ <translation>Options du portefeuille:</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(défaut: %u)</translation>
+ </message>
+ <message>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>Connecté au travers du proxy SOCKS5</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Information</translation>
+ </message>
+ <message>
+ <source>Node relay options:</source>
+ <translation>Options du relais de nœud: </translation>
+ </message>
+ <message>
+ <source>RPC server options:</source>
+ <translation>Options de serveur RPC:</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>
<message>
+ <source>Signing transaction failed</source>
+ <translation>Transaction signée échouée</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation>C'est un logiciel expérimental.</translation>
+ </message>
+ <message>
+ <source>Transaction amount too small</source>
+ <translation>Montant de la transaction trop bas</translation>
+ </message>
+ <message>
+ <source>Transaction amounts must be positive</source>
+ <translation>Les montants de la transaction doivent être positif</translation>
+ </message>
+ <message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Montant de la transaction trop élevé pour la politique de frais</translation>
+ </message>
+ <message>
+ <source>Transaction too large</source>
+ <translation>Transaction trop grande</translation>
+ </message>
+ <message>
<source>Username for JSON-RPC connections</source>
<translation>Nom d'utilisateur pour les connexions JSON-RPC</translation>
</message>
<message>
- <source>Password for JSON-RPC connections</source>
- <translation>Mot de passe pour les connexions JSON-RPC</translation>
+ <source>Warning</source>
+ <translation>Attention</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Ce message d'aide</translation>
+ <source>Password for JSON-RPC connections</source>
+ <translation>Mot de passe pour les connexions JSON-RPC</translation>
</message>
<message>
<source>Loading addresses...</source>
<translation>Chargement des adresses...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Erreur lors du chargement de wallet.dat : porte-monnaie corrompu</translation>
+ <source>(default: %s)</source>
+ <translation>(défaut: %s)</translation>
+ </message>
+ <message>
+ <source>Invalid -proxy address: '%s'</source>
+ <translation>Adresse -proxy invalide: '%s'</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Erreur lors du chargement de wallet.dat</translation>
+ <source>Specify pid file (default: %s)</source>
+ <translation>Spécifier le pid du fichier (défaut: %s)</translation>
</message>
<message>
<source>Insufficient funds</source>
@@ -866,6 +1472,14 @@
<translation>Chargement du porte-monnaie...</translation>
</message>
<message>
+ <source>Cannot downgrade wallet</source>
+ <translation>Vous ne pouvez pas rétrograder votre portefeuille</translation>
+ </message>
+ <message>
+ <source>Cannot write default address</source>
+ <translation>Impossible d'écrire l'adresse par défaut</translation>
+ </message>
+ <message>
<source>Rescanning...</source>
<translation>Nouvelle analyse...</translation>
</message>
@@ -873,5 +1487,9 @@
<source>Done loading</source>
<translation>Chargement terminé</translation>
</message>
- </context>
+ <message>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_gl.ts b/src/qt/locale/bitcoin_gl.ts
index 0b0800e742..9aa7b55096 100644
--- a/src/qt/locale/bitcoin_gl.ts
+++ b/src/qt/locale/bitcoin_gl.ts
@@ -22,10 +22,6 @@
<translation>&amp;Pechar</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiar Dirección</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Borrar a dirección actualmente seleccionada da listaxe</translation>
</message>
@@ -41,69 +37,6 @@
<source>&amp;Delete</source>
<translation>&amp;Borrar</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Escolle a dirección á que enviar moedas</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Escolle a dirección da que recibir moedas</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Escoller</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Direccións para enviar</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Direccións para recibir</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>Estas son as túas direccións Bitcoin para enviar pagos. Revisa sempre a cantidade e a dirección receptora antes de enviar moedas.</translation>
- </message>
- <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 as túas direccións Bitcoin para recibir pagos. Recoméndase empregar unha nova dirección de recepción por cada transacción.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copiar &amp;Etiqueta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Modificar</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportar Lista de Direccións</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Arquivo separado por comas (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportación falida</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sen etiqueta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -123,82 +56,6 @@
<source>Repeat new passphrase</source>
<translation>Repite novo contrasinal</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Encriptar moedeiro</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operación precisa o contrasinal do teu moedeiro para desbloquear o moedeiro.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquear moedeiro</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operación precisa o contrasinal do teu moedeiro para desencriptar o moedeiro.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desencriptar moedeiro</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambiar contrasinal</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmar encriptación de moedeiro</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>Precaución: Se encriptas o teu moedeiro e perdes o teu contrasinal, ti &lt;b&gt;PERDERÃS TÓDOLOS TEUS BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Estás seguro de que desexas encriptar o teu moedeiro?</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: Calquera copia de seguridade previa que fixeses do teu arquivo de moedeiro debería ser substituída polo recén xerado arquivo encriptado de moedeiro. Por razóns de seguridade, as copias de seguridade previas de un arquivo de moedeiro desencriptado tornaránse inútiles no momento no que comeces a emprega-lo novo, encriptado, moedeiro.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Precaución: A tecla de Bloqueo de Maiúsculas está activada!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Moedeiro encriptado</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Encriptación de moedeiro fallida</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>A encriptación do moedeiro fallou por mor dun erro interno. O teu moedeiro non foi encriptado.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Os contrasinais suministrados non coinciden.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Desbloqueo de moedeiro fallido</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>O contrasinal introducido para a desencriptación do moedeiro foi incorrecto.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Desencriptación de moedeiro fallida</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Cambiouse con éxito o contrasinal do moedeiro.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -262,8 +119,8 @@
<translation>&amp;Cambiar contrasinal...</translation>
</message>
<message>
- <source>Importing blocks from disk...</source>
- <translation>Importando bloques de disco...</translation>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Direccións para recibir</translation>
</message>
<message>
<source>Reindexing blocks on disk...</source>
@@ -346,18 +203,10 @@
<translation>Barra de ferramentas</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Core de Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Solicitar pagos (xenera códigos QR e bitcoin: URIs)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Sobre Bitcoin Core</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Amosar a listaxe de direccións e etiquetas para enviar empregadas</translation>
</message>
@@ -370,6 +219,10 @@
<translation>Abrir un bitcoin: URI ou solicitude de pago</translation>
</message>
<message>
+ <source>&amp;Command-line options</source>
+ <translation>Opcións da liña de comandos</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Non hai orixe de bloques dispoñible...</translation>
</message>
@@ -423,13 +276,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta de Rede</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -487,110 +333,6 @@
<source>Priority</source>
<translation>Prioridade</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cantidade</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de transacción</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloquear o aforrado</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Desbloquear o aforrado</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar cantidade</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar pago</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiar despóis do pago</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridade</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar cambio</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>O máis alto</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>Máis alto que</translation>
- </message>
- <message>
- <source>high</source>
- <translation>alto</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medio-alto</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>medio-baixo</translation>
- </message>
- <message>
- <source>low</source>
- <translation>baixo</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>máis baixo que</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>o máis baixo</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloqueado)</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>Si</translation>
- </message>
- <message>
- <source>no</source>
- <translation>non</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>As transacción con maior prioridade teñen máis posibilidades de ser incluidas nun bloque</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sen etiqueta)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(cambio)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -614,38 +356,6 @@
<source>&amp;Address</source>
<translation>&amp;Dirección</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nova dirección para recibir</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nova dirección para enviar</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Modificar dirección para recibir</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Modificar dirección para enviar</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>A dirección introducida "%1" xa está no libro de direccións.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>A dirección introducida '%1' non é unha dirección Bitcoin válida.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Non se puido desbloquear o moedeiro.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>A xeración de nova clave fallou.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -673,18 +383,10 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Core de Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>versión</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Sobre Bitcoin core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Opcións da liña de comandos</translation>
</message>
@@ -696,7 +398,7 @@
<source>command-line options</source>
<translation>opcións da liña de comandos</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -712,10 +414,6 @@
<translation>Empregar un directorio de datos personalizado</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Core de Bitcoin</translation>
- </message>
- <message>
<source>Error</source>
<translation>Erro</translation>
</message>
@@ -738,10 +436,6 @@
<source>Select payment request file</source>
<translation>Seleccionar ficheiro de solicitude de pago</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Seleccione ficheiro de solicitude de pago para abrir</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -766,6 +460,10 @@
<translation>&amp;Rede</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>Moedeiro</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>Abrir automáticamente o porto do cliente Bitcoin no router. Esto so funciona se o teu router soporta UPnP e está habilitado.</translation>
</message>
@@ -874,45 +572,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Manexo de URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Dirección de pago %1 inválida</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>A cantidade de %1 na solicitude de pado é moi pequena (considerada po).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Erro na petición de pago</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>Devolución dende %1</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>Erro comunicando con %1: %2</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Responsa errónea do servidor %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pago admitido</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Erro de solicitude de rede</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -935,27 +594,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Gardar Imaxe...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copiar Imaxe</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Gardar Código QR</translation>
- </message>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nome do cliente</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -968,8 +608,8 @@
<translation>&amp;Información</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Usar versión OpenSSL</translation>
+ <source>Debug window</source>
+ <translation>Ventana de Depuración</translation>
</message>
<message>
<source>Startup time</source>
@@ -1024,10 +664,6 @@
<translation>Fóra:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Data de construción</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Arquivo de log de depuración</translation>
</message>
@@ -1094,15 +730,7 @@
<source>&amp;Request payment</source>
<translation>&amp;Solicitar pago</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cantidade</translation>
- </message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
@@ -1121,73 +749,18 @@
<source>&amp;Save Image...</source>
<translation>&amp;Gardar Imaxe...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Solicitar pago a %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Información de Pago</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidade</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaxe</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>A URI resultante é demasiado larga, tenta reducir o texto para a etiqueta / mensaxe.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Erro codificando URI nun Código QR.</translation>
- </message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaxe</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidade</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sen etiqueta)</translation>
- </message>
- </context>
-<context>
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
<translation>Moedas Enviadas</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>Fondos insuficientes</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Cantidade:</translation>
</message>
@@ -1212,6 +785,10 @@
<translation>Cambiar:</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Tarifa de transacción:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Enviar a múltiples receptores á vez</translation>
</message>
@@ -1239,74 +816,6 @@
<source>S&amp;end</source>
<translation>&amp;Enviar</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirmar envío de moedas</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 a %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar cantidade</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cantidade</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar pago</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiar despóis do pago</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridade</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar cambio</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>A cantidade sobrepasa o teu balance.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>O total sobrepasa o teu balance cando se inclúe a tarifa de transacción %1.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Atención: Enderezo Bitcoin non válido</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sen etiqueta)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Atención: Enderezo de cambio desconocido</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Seguro que queres enviar?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>engadido como tarifa de transacción</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1319,10 +828,6 @@
<translation>Pagar &amp;A:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Introduce unha etiqueta para esta dirección para engadila ao teu libro de direccións</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiqueta:</translation>
</message>
@@ -1351,6 +856,10 @@
<translation>Eliminar esta entrada</translation>
</message>
<message>
+ <source>Message:</source>
+ <translation>Mensaxe:</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>
@@ -1436,70 +945,10 @@
<source>Reset all verify message fields</source>
<translation>Restaurar todos os campos de verificación de mensaxe</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Click en "Asinar Mensaxe" para xerar sinatura</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>A dirección introducida é inválida.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Por favor comproba a dirección e proba de novo.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>A dirección introducida non se refire a ninguna clave.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Cancelouse o desbloqueo do moedeiro.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>A clave privada da dirección introducida non está dispoñible.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Fallou a sinatura da mensaxe.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mensaxe asinada.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>A sinatura non puido ser decodificada.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Por favor revise a sinatura e probe de novo.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>A sinatura non coincide co resumo da mensaxe.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>A verificación da mensaxe fallou.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mensaxe verificada.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Core de Bitcoin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Os desarrolladores de Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1512,402 +961,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Aberto ata %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/fóra de liña</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/sen confirmar</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmacións</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Estado</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Orixe</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Xerado</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Dende</translation>
- </message>
- <message>
- <source>To</source>
- <translation>A</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>dirección propia</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiqueta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Crédito</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>non aceptado</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Débito</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Tarifa de transacción</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Cantidade neta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensaxe</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentario</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID de Transacción</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Comerciante</translation>
- </message>
- <message>
- <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation>As moedas xeradas deben madurar %1 bloques antes de que poidan ser gastadas. Cando xeraste este bloque, foi propagado á rede para ser engadido á cadeas de bloques. Se falla ao tentar meterse na cadea, o seu estado cambiará a "non aceptado" e non poderá ser gastado. Esto pode ocorrir ocasionalmente se outro nodo xera un bloque en poucos segundos de diferencia co teu.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Información de depuración</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transacción</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Entradas</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Cantidade</translation>
- </message>
- <message>
- <source>true</source>
- <translation>verdadeiro</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falso</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, non foi propagado con éxito todavía</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>descoñecido</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalles de transacción</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Este panel amosa unha descripción detallada da transacción</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Aberto ata %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmado (%1 confirmacións)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Este bloque non foi recibido por ningún outro nodo e probablemente non será aceptado!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Recibido de</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pago a ti mesmo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Estado da transacción. Pasa por riba deste campo para amosar o número de confirmacións.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Data e hora na que foi recibida a transacción.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipo de transacción.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Cantidade borrada ou engadida no balance.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Todo</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Hoxe</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Esta semana</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Este mes</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>O último mes</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Este ano</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Periodo...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Recibido con</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado a</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>A ti mesmo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minado</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Outro</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Introduce dirección ou etiqueta para buscar</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Cantidade mínima</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copiar dirección</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar etiqueta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar cantidade</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID de transacción</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Modificar etiqueta</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Amosar detalles da transacción</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Exportar Historial de Transaccións</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportación falida</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Houbo un erro intentando salvar o historial de transaccións a %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exportado correctamente</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>O historial de transaccións foi salvado correctamente en %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Arquivo separado por comas (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmado</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiqueta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Periodo:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>a</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Ningún moedeiro cargado</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Moedas Enviadas</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportar</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportar os datos da pestaña actual a un arquivo.</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Copia de Seguridade de Moedeiro</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Datos de Moedeiro (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Copia de Seguridade Fallida</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Houbo un erro intentando gardar os datos de moedeiro en %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Os datos do moedeiro foron gardados correctamente en %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Copia de Seguridade Correcta</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1938,6 +1001,10 @@
<translation>Aceptar conexións de fóra (por defecto: 1 se non -proxy ou -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Core de Bitcoin</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>
@@ -1958,10 +1025,6 @@
<translation>Precaución: Non parece que esteamos totalmente de acordo cos nosos pares! Pode que precises actualizar, ou outros nodos poden precisar actualizarse.</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>Precaución: wallet.dat corrupto, datos salvagardados! O wallet.dat orixinal foi gardado como wallet.{timestamp}.bak en %s; se o teu balance ou transaccións son incorrectas deberías restauralas dende unha copia de seguridade.</translation>
- </message>
- <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;categoría&gt; pode ser:</translation>
</message>
@@ -2034,10 +1097,6 @@
<translation>O moedeiro %s reside fóra do directorio de datos %s</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Precisas reconstruír a base de datos empregando -reindex para cambiar -txindex</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>Executar comando cando se recibe unha alerta relevante ou vemos un fork realmente longo (%s no cmd é substituído pola mensaxe)</translation>
</message>
@@ -2046,14 +1105,6 @@
<translation>Información</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Cantidade inválida para -minrelaytxfee=&lt;cantidade&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Cantidade inválida para -mintxfee=&lt;cantidade&gt;: '%s'</translation>
- </message>
- <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Enviar traza/información de depuración á consola en lugar de ao arquivo debug.log</translation>
</message>
@@ -2086,10 +1137,6 @@
<translation>Precaución</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrupto, fallou o gardado</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Contrasinal para conexións JSON-RPC</translation>
</message>
@@ -2098,10 +1145,6 @@
<translation>Executar comando cando o mellor bloque cambie (%s no comando é sustituído polo hash do bloque)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Esta mensaxe de axuda</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permitir lookup de DNS para -addnote, -seednote e -connect</translation>
</message>
@@ -2110,14 +1153,6 @@
<translation>Cargando direccións...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Erro cargando wallet.dat: Moedeiro corrupto</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Erro cargando wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Dirección -proxy inválida: '%s'</translation>
</message>
@@ -2126,18 +1161,6 @@
<translation>Rede descoñecida especificada en -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Non se pode resolver a dirección -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Non se pode resolver dirección -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Cantidade inválida para -paytxfee=&lt;cantidade&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondos insuficientes</translation>
</message>
diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts
index 7db2a9dd34..4a293c1c3f 100644
--- a/src/qt/locale/bitcoin_he.ts
+++ b/src/qt/locale/bitcoin_he.ts
@@ -2,12 +2,16 @@
<context>
<name>AddressBookPage</name>
<message>
+ <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>&amp;חדשה</translation>
+ <translation>&amp;חדש</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -22,10 +26,6 @@
<translation>סגירה</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>העתקת כתובת</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>מחיקת הכתובת שנבחרה מהרשימה</translation>
</message>
@@ -41,73 +41,6 @@
<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>
- <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>
- <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>
- <message>
- <source>&amp;Edit</source>
- <translation>ע&amp;ריכה</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>×™×¦×•× ×¨×©×™×ž×ª כתובות</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>קובץ מופרד ×‘×¤×¡×™×§×™× (‎*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>×”×™×¦×•× × ×›×©×œ</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>כתובת</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(×ין תווית)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -127,90 +60,14 @@
<source>Repeat new passphrase</source>
<translation>× × ×œ×—×–×•×¨ על מילת הצופן החדשה</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>הצפנת ×”×רנק</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>פעולה זו דורשת ×ת מילת הצופן של ×”×רנק שלך כדי לפתוח ×ת ×”×רנק.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>פתיחת ×רנק</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>פעולה זו דורשת ×ת מילת הצופן של ×”×רנק שלך כדי לפענח ×ת ×”×רנק.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>פענוח ×רנק</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>שינוי מילת צופן</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>זהירות: מקש Caps Lock פעיל!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>×”×רנק הוצפן</translation>
- </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>× × ×œ×”×–×™×Ÿ ×ת מילת הצופן החדשה ל×רנק.&lt;br/&gt;כד××™ להשתמש במילת צופן המורכבת מ&lt;b&gt;עשרה ×ª×•×•×™× ×קר××™×™× ×•×ž×¢×œ×”&lt;/b&gt;, ×ו &lt;b&gt;שמונה ×ž×™×œ×™× ×•×ž×¢×œ×”&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>הצפנת ×”×רנק נכשלה</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>הצפנת ×”×רנק נכשלה עקב שגי××” פנימית. ×”×רנק שלך ×œ× ×”×•×¦×¤×Ÿ.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>מילות הצופן שסופקו ×ינן תו×מות.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>פתיחת ×”×רנק נכשלה</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>מילת הצופן שהוכנסה לפענוח ×”×רנק שגויה.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>פענוח ×”×רנק נכשל</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>מילת הצופן של ×”×רנק שונתה בהצלחה.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
- </context>
+ <message>
+ <source>Banned Until</source>
+ <translation>×—×¡×•× ×¢×“</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -250,6 +107,14 @@
<translation>יצי××” מהתכנית</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;×ודות %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>הצג מידע על %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>על ×ודות Qt</translation>
</message>
@@ -286,14 +151,6 @@
<translation>פתיחת &amp;כתובת מש×ב…</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>לקוח ליבה של ביטקוין</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>×ž×§×˜×¢×™× ×ž×™×•×‘××™× ×ž×”×›×•× ×Ÿâ€¦</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>×”×ž×§×˜×¢×™× × ×•×¡×¤×™× ×œ×ž×¤×ª×— בכונן…</translation>
</message>
@@ -338,10 +195,6 @@
<translation>&amp;קבלה</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>הצגת מידע על ליבת ביטקוין</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>ה&amp;צגה / הסתרה</translation>
</message>
@@ -378,18 +231,10 @@
<translation>סרגל ×›×œ×™× ×œ×©×•× ×™×•×ª</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>ליבת ביטקוין</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>בקשת ×ª×©×œ×•×ž×™× (יצירה של ×§×•×“×™× ×ž×¡×•×’ QR וסכימות כתובות מש×ב של :bitcoin)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>על &amp;×ודות ליבת ביטקוין</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>הצג ×ת רשימת הכתובות לשליחה שהיו בשימוש לרבות התוויות</translation>
</message>
@@ -406,8 +251,8 @@
<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>
+ <source>Processing blocks on disk...</source>
+ <translation>מעבד ×‘×œ×•×§×™× ×¢×œ הדיסק...</translation>
</message>
<message>
<source>No block source available...</source>
@@ -418,6 +263,10 @@
<translation>%1 ו%2</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>
@@ -463,14 +312,11 @@
</message>
</context>
<context>
- <name>ClientModel</name>
+ <name>CoinControlDialog</name>
<message>
- <source>Network Alert</source>
- <translation>×זעקת רשת</translation>
+ <source>Coin Selection</source>
+ <translation>בחירת מטבע</translation>
</message>
-</context>
-<context>
- <name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
<translation>כמות:</translation>
@@ -520,6 +366,14 @@
<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>
@@ -535,134 +389,6 @@
<source>Priority</source>
<translation>עדיפות</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>העתקת כתובת</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>העתקת תווית</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>העתקת כמות</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>העתקת מזהה העברה</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>none</source>
- <translation>לל×</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>יכולה להשתנות ב+/- %1 סטושי לקלט.</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>Can vary +/- 1 byte per input.</source>
- <translation>הערך יכול להיות +/- בית ×חד לכל קלט.</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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>עודף מ־%1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(עודף)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -686,38 +412,6 @@
<source>&amp;Address</source>
<translation>&amp;כתובת</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>כתובת חדשה לקבלה</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>כתובת חדשה לשליחה</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>עריכת כתובת לקבלה</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>עריכת כתובת לשליחה</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>הכתובת שהוכנסה „%1“ כבר נמצ×ת בפנקס הכתובות.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>הכתובת שהוכנסה „%1“ ××™× ×” כתובת ביטקוין תקנית.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>פתיחת ×”×רנק נכשלה.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>יצירת מפתח חדש נכשלה.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -745,10 +439,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>ליבת ביטקוין</translation>
- </message>
- <message>
<source>version</source>
<translation>גרסה</translation>
</message>
@@ -757,10 +447,6 @@
<translation>(%1-סיביות)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>על ×ודות ליבת ביטקוין</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>×פשרויות שורת פקודה</translation>
</message>
@@ -772,6 +458,18 @@
<source>command-line options</source>
<translation>×פשרויות שורת פקודה</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>×פשרויות ממשק</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>התחל ממוזער</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>×יפוס כל שינויי הגדרות התצוגה</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -780,16 +478,8 @@
<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>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>לקוח ביטקוין יוריד וישמור העתק של שרשרת ×”×ž×§×˜×¢×™× ×©×œ ביטקוין. לפחות %1 ג״ב ×ž×”× ×ª×•× ×™× ×™×וחסנו בתיקייה זו, ×•×”×™× ×ª×’×“×œ ×¢× ×”×–×ž×Ÿ. ×”×רנק ×’× ×™×וחסן בתיקייה הזו.</translation>
+ <source>Welcome to %1.</source>
+ <translation>ברוך ×”×‘× ×œ %1.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -800,10 +490,6 @@
<translation>שימוש בתיקיית × ×ª×•× ×™× ×ž×•×ª×מת ×ישית:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>ליבת ביטקוין</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>שגי××”: ×œ× × ×™×ª×Ÿ ליצור ×ת תיקיית ×”× ×ª×•× ×™× ×©×¦×•×™× ×” „%1“.</translation>
</message>
@@ -830,10 +516,6 @@
<source>Select payment request file</source>
<translation>בחירת קובץ בקשת תשלו×</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>בחירת קובץ בקשת ×ª×©×œ×•× ×œ×¤×ª×™×—×”</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -938,6 +620,18 @@
<translation>הפתחה של המתווך (למשל 9050)</translation>
</message>
<message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;חלון</translation>
</message>
@@ -1061,6 +755,10 @@
<translation>המ×זן הנוכחי שלך בכתובות לקרי××” בלבד</translation>
</message>
<message>
+ <source>Spendable:</source>
+ <translation>× ×™×ª× ×™× ×œ×‘×–×‘×•×–</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation>העברות ×חרונות</translation>
</message>
@@ -1078,85 +776,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>תפעול כתובות מש×ב</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>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>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>×œ× × ×™×ª×Ÿ להתחיל ×ת ביטקוין: טיפול ×‘×œ×—×™×¦×”â€“×œ×ª×©×œ×•× </translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>כתובת ×חזור בקשת ×”×ª×©×œ×•× ×©×’×•×™×”: %1</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>×œ× × ×™×ª×Ÿ לנתח ×ת כתובת המש×ב! מצב ×–×” יכול לקרות עקב כתובת ביטקוין שגויה ×ו ×¤×¨×ž×˜×¨×™× ×©×’×•×™×™× ×‘×›×ª×•×‘×ª המש×ב.</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>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>בקשות ×ª×©×œ×•× ×‘×œ×ª×™ מ×ומתות ×œ×¡×§×¨×™×¤×˜×™× ×œ×ª×©×œ×•× ×ž×•×ª××ž×™× ×ישית ×ינן נתמכות.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <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>
- <message>
- <source>Network request error</source>
- <translation>שגי×ת בקשת שרת</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1207,31 +826,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <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>
- <source>Client name</source>
- <translation>×©× ×œ×§×•×—</translation>
- </message>
- <message>
<source>N/A</source>
<translation>×œ× ×–×ž×™×Ÿ</translation>
</message>
@@ -1252,14 +848,14 @@
<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>Datadir</source>
+ <translation>Datadir</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>זמן עלייה</translation>
</message>
@@ -1284,6 +880,18 @@
<translation>מספר ×”×ž×§×˜×¢×™× ×”× ×•×›×—×™</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation>מ×גר זכרון</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>מספר הפעולה הנוכחי</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>שימוש בזכרון</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>התקבלו</translation>
</message>
@@ -1296,10 +904,18 @@
<translation>&amp;עמיתי×</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>×ž×©×ª×ž×©×™× ×—×¡×•×ž×™×</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>× × ×œ×‘×—×•×¨ בעמית כדי להציג מידע מפורט.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>ברשימה הלבנה</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>כיוון</translation>
</message>
@@ -1308,10 +924,26 @@
<translation>גרסה</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>בלוק התחלה</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>×‘×œ×•×§×™× ×ž×¡×•× ×›×¨× ×™×</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>סוכן משתמש</translation>
</message>
<message>
+ <source>Decrease font size</source>
+ <translation>הקטן גודל גופן</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>הגדל גודל גופן</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>שירותי×</translation>
</message>
@@ -1336,6 +968,10 @@
<translation>זמן המענה</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>הפרש זמן</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>זמן המקטע ×”×חרון</translation>
</message>
@@ -1368,10 +1004,6 @@
<translation>יוצ×:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>ת×ריך בנייה</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>קובץ יומן ניפוי</translation>
</message>
@@ -1380,6 +1012,22 @@
<translation>ניקוי מסוף הבקרה</translation>
</message>
<message>
+ <source>Ban Node for</source>
+ <translation>×—×¡×•× ×ž×©×ª×ž×© ל</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1&amp; יו×</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp; שבוע</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp; שנה</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>
@@ -1502,18 +1150,6 @@
<source>Remove</source>
<translation>הסרה</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>העתקת תווית</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>העתקת הודעה</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>העתקת כמות</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1533,73 +1169,6 @@
<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>
- <message>
- <source>URI</source>
- <translation>כתובת מש×ב</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>כתובת</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>כמות</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>תווית</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>הודעה</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>כתובת המש×ב המתקבלת ×רוכה מדי, כד××™ לנסות ×œ×¦×ž×¦× ×ת הטקסט בתווית / הודעה.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>שגי××” בקידוד כתובת מש×ב לקוד QR</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>ת×ריך</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>תווית</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>הודעה</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>כמות</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(×ין תווית)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(×ין הודעה)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(×ין סכו×)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1660,120 +1229,76 @@
<translation>כתובת לעודף מות×מת ×ישית</translation>
</message>
<message>
- <source>Send to multiple recipients at once</source>
- <translation>שליחה למספר ×ž×•×˜×‘×™× ×‘×•Ö¾×–×ž× ×™×ª</translation>
+ <source>Transaction Fee:</source>
+ <translation>עמלת העברה:</translation>
</message>
<message>
- <source>Add &amp;Recipient</source>
- <translation>הוספת &amp;מוטב</translation>
+ <source>Choose...</source>
+ <translation>בחר...</translation>
</message>
<message>
- <source>Clear all fields of the form.</source>
- <translation>ניקוי של כל השדות בטופס.</translation>
+ <source>per kilobyte</source>
+ <translation>עבור קילו-בית</translation>
</message>
<message>
- <source>Dust:</source>
- <translation>×בק:</translation>
+ <source>Hide</source>
+ <translation>הסתר</translation>
</message>
<message>
- <source>Clear &amp;All</source>
- <translation>&amp;ניקוי הכול</translation>
+ <source>total at least</source>
+ <translation>סה''כ לפחות</translation>
</message>
<message>
- <source>Balance:</source>
- <translation>מ×זן:</translation>
+ <source>Recommended:</source>
+ <translation>מומלץ:</translation>
</message>
<message>
- <source>Confirm the send action</source>
- <translation>×ישור פעולת השליחה</translation>
+ <source>Custom:</source>
+ <translation>מות×× ×ישית:</translation>
</message>
<message>
- <source>S&amp;end</source>
- <translation>&amp;שליחה</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation>×ישור שליחת מטבעות</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 ×ל %2</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>Copy change</source>
- <translation>העתקת עודף</translation>
- </message>
- <message>
- <source>or</source>
- <translation>×ו</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>הכמות ×œ×ª×©×œ×•× ×—×™×™×‘×ª להיות גדולה מ־0.</translation>
+ <source>Confirmation time:</source>
+ <translation>זמן ×”×ישור:</translation>
</message>
<message>
- <source>The amount exceeds your balance.</source>
- <translation>הכמות עולה על המ×זן שלך.</translation>
+ <source>normal</source>
+ <translation>רגיל</translation>
</message>
<message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>הכמות הכוללת, ובכללה עמלת העברה בסך %1, עולה על המ×זן שלך.</translation>
+ <source>fast</source>
+ <translation>מהיר</translation>
</message>
<message>
- <source>Transaction creation failed!</source>
- <translation>יצירת ההעברה נכשלה!</translation>
+ <source>Send to multiple recipients at once</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>
+ <source>Add &amp;Recipient</source>
+ <translation>הוספת &amp;מוטב</translation>
</message>
<message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>×זהרה: כתובת ביטקוין שגויה</translation>
+ <source>Clear all fields of the form.</source>
+ <translation>ניקוי של כל השדות בטופס.</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(×ין תווית)</translation>
+ <source>Dust:</source>
+ <translation>×בק:</translation>
</message>
<message>
- <source>Warning: Unknown change address</source>
- <translation>×זהרה: כתובת עודף בלתי ידועה</translation>
+ <source>Clear &amp;All</source>
+ <translation>&amp;ניקוי הכול</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation>העתקת ×בק</translation>
+ <source>Balance:</source>
+ <translation>מ×זן:</translation>
</message>
<message>
- <source>Are you sure you want to send?</source>
- <translation>×”×× ×כן לשלוח?</translation>
+ <source>Confirm the send action</source>
+ <translation>×ישור פעולת השליחה</translation>
</message>
<message>
- <source>added as transaction fee</source>
- <translation>נוסף כעמלת העברה</translation>
+ <source>S&amp;end</source>
+ <translation>&amp;שליחה</translation>
</message>
</context>
<context>
@@ -1787,10 +1312,6 @@
<translation>×œ×©×œ× ×œ&amp;טובת:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>× × ×œ×”×›× ×™×¡ תווית לכתובת ×”×–×ת כדי להוסיף לפנקס הכתובות</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>ת&amp;ווית:</translation>
</message>
@@ -1827,6 +1348,10 @@
<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>
@@ -1846,10 +1371,6 @@
<context>
<name>ShutdownWindow</name>
<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>
@@ -1932,70 +1453,10 @@
<source>Reset all verify message fields</source>
<translation>×יפוס כל שדות ×ימות ההודעה</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>יש ללחוץ על „חתימה על ההודעה“ כדי לחולל חתימה</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>הכתובת שהוכנסה ××™× ×” תקינה.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>החתימה על ההודעה נכשלה.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>ההודעה נחתמה.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>×œ× × ×™×ª×Ÿ לפענח ×ת החתימה.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>× × ×œ×‘×“×•×§ ×ת החתימה ולנסות שנית.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>החתימה ×œ× ×ª×•×מת ×ת תקציר ההודעה.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>×ימות ההודעה נכשל.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>ההודעה ×ומתה.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>ליבת ביטקוין</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>מתכנתי ליבת ביטקוין</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[רשת-בדיקה]</translation>
</message>
@@ -2008,398 +1469,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>פתוחה עד %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>מתנגש</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/מנותק</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/המתנה ל×ישור</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 ×ישורי×</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>מצב</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>ת×ריך</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>מקור</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>נוצר</translation>
- </message>
- <message>
- <source>From</source>
- <translation>מ×ת</translation>
- </message>
- <message>
- <source>To</source>
- <translation>×ל</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>כתובת עצמית</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>צפייה בלבד</translation>
- </message>
- <message>
- <source>label</source>
- <translation>תווית</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>זיכוי</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>×œ× ×”×ª×§×‘×œ</translation>
- </message>
- <message>
- <source>Debit</source>
- <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>
- <message>
- <source>Net amount</source>
- <translation>כמות נקייה</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>הודעה</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>הערה</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>מזהה העברה</translation>
- </message>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>העברה</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>קלטי×</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>כמות</translation>
- </message>
- <message>
- <source>true</source>
- <translation>×מת</translation>
- </message>
- <message>
- <source>false</source>
- <translation>שקר</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ×˜×¨× ×©×•×“×¨ בהצלחה</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>×œ× ×™×“×•×¢</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>פרטי ההעברה</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>חלונית זו מציגה תי×ור מפורט של ההעברה</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>ת×ריך</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>סוג</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>×œ× ×‘×©×œ (%1 ×ישורי×, יהיו ×–×ž×™× ×™× ×œ×חר %2)</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>פתוחה עד %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>מ×ושר (%1 ×ישורי×)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>המקטע ×”×–×” ×œ× × ×§×œ×˜ על ידי ××£ מפרק ×חר, וכנר××” ×œ× ×™×ª×§×‘×œ!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>נוצר ×ך ×œ× ×”×ª×§×‘×œ</translation>
- </message>
- <message>
- <source>Offline</source>
- <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>מתקבל ×ישור (%1 מתוך %2 ××™×©×•×¨×™× ×ž×•×ž×œ×¦×™×)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>מתנגש</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>התקבל ×¢×</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>התקבל מ×ת</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>נשלח ×ל</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>×ª×©×œ×•× ×œ×¢×¦×ž×š</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>נכרה</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>צפייה בלבד</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(×œ× ×–×ž×™×Ÿ)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>מצב ההעברה. יש להמתין ×¢× ×”×¡×ž×Ÿ מעל שדה ×–×” כדי לר×ות ×ת מספר ×”×ישורי×.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>הת×ריך והשעה בה ההעברה ×”×–×ת התקבלה.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>סוג ההעברה.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>×”×× ×›×ª×•×‘×•×ª לצפייה בלבד מעורבות בהעברה ×–×ת ×ו של×.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>הכמות שהתווספה ×ו הוסרה מהיתרה.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>הכול</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>היו×</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>השבוע</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>החודש</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>החודש שעבר</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>השנה</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>טווח…</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>התקבל ×¢×</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>נשלח ×ל</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>לעצמך</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>נכרה</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>×חר</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>× × ×œ×”×›× ×™×¡ כתובת ×ו תווית לחיפוש</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>כמות מזערית</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>העתקת כתובת</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>העתקת תווית</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>העתקת כמות</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>העתקת מזהה העברה</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>עריכת תווית</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>הצגת פרטי העברה</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>×™×¦×•× ×”×™×¡×˜×•×¨×™×™×ª העברות</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>צפייה בלבד</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>×”×™×¦×•× × ×›×©×œ</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>×ירעה שגי××” בעת ניסיון לשמור ×ת היסטוריית ההעברות ×ל %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>מ×ושר</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>ת×ריך</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>סוג</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>תווית</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>כתובת</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>מזהה</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>טווח:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>×ל</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2407,55 +1483,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>×œ× × ×˜×¢×Ÿ ×רנק</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>שליחת מטבעות</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>×™&amp;צו×</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>×™×¦×•× ×”× ×ª×•× ×™× ×ž×”×œ×©×•× ×™×ª הנוכחית לקובץ</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>גיבוי ×רנק</translation>
- </message>
- <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>
<source>Options:</source>
@@ -2478,6 +1505,10 @@
<translation>קבלת פקודות משורת הפקודה ומ־JSON-RPC</translation>
</message>
<message>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>שגי××”: סניה קלמה קריטית פנימית קרטה, פנה ל debug.log לפרטי×</translation>
+ </message>
+ <message>
<source>Run in the background as a daemon and accept commands</source>
<translation>ריצה כסוכן ברקע וקבלת פקודות</translation>
</message>
@@ -2486,6 +1517,14 @@
<translation>קבלת ×—×™×‘×•×¨×™× ×ž×‘×—×•×¥ (בררת מחדל: 1 ×œ×œ× â€Ž-proxy ×ו ‎-connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>ליבת ביטקוין</translation>
+ </message>
+ <message>
+ <source>The %s developers</source>
+ <translation>×” %s מפתחי×</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>
@@ -2502,10 +1541,6 @@
<translation>זוהי בניית ניסיון טרו×-שחרור - השימוש בה על ×חריותך - ×ין להשתמש לצורך כריה ×ו יישומי מסחר</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>×œ× × ×™×ª×Ÿ להת×גד ×ל %s במחשב ×–×”. כנר××” שליבת ביטקוין כבר פועלת.</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>×זהרה: נר××” ×©×œ× ×›×œ הרשת מסכימה! נר××” ×©×™×©× × ×›×•×¨×™× ×©× ×ª×§×œ×™× ×‘×‘×¢×™×•×ª.</translation>
</message>
@@ -2514,10 +1549,6 @@
<translation>×זהרה: נר××” שישנה ×י־הסכמה בינינו לבין ש×ר ×”×¢×ž×™×ª×™× ×©×œ× ×•! יתכן שעדיף לשדרג ×ו שכל ש×ר ×”×¢×ž×™×ª×™× ×¦×¨×™×›×™× ×œ×©×“×¨×’.</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>×זהרה: הקובץ wallet.dat הושחת, המידע חולץ! קובץ ×”Ö¾wallet.dat המקורי נשמר ×‘×©× wallet.{timestamp}.bak ×‘×ž×™×§×•× %s; ×× ×”×ž×זן ×ו ההעברות ×©×’×•×™×™× ×¢×œ×™×š לשחזר גיבוי.</translation>
- </message>
- <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;קטגוריה&gt; יכולה להיות:</translation>
</message>
@@ -2526,6 +1557,10 @@
<translation>×פשרויות יצירת מקטע:</translation>
</message>
<message>
+ <source>Change index out of range</source>
+ <translation>×ינדקס העודף מחוץ לתחו×</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>התחבר רק ×œ×¦×ž×ª×™× ×”×ž×¦×•×™× ×™×</translation>
</message>
@@ -2558,6 +1593,10 @@
<translation>שגי××” ב×תחול סביבת מסד נתוני ×”××¨× ×§×™× %s!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>שגי××” בטעינת %s</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>שגי××” בטעינת מסד נתוני המקטעי×</translation>
</message>
@@ -2586,6 +1625,10 @@
<translation>כתובת onion- שגויה: '%s'</translation>
</message>
<message>
+ <source>Loading banlist...</source>
+ <translation>טוען רשימת חסומי×...</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>×ין מספיק מידע על הקובץ</translation>
</message>
@@ -2594,6 +1637,10 @@
<translation>תמיד להתחבר ×œ×ž×¤×¨×§×™× ×‘×¨×©×ª &lt;net&gt;†(ipv4,†ipv6 ×ו onion)</translation>
</message>
<message>
+ <source>Print version and exit</source>
+ <translation>הדפס ×’×™×¨×¡× ×•×¦×</translation>
+ </message>
+ <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>הגדרת גודל מטמון מסדי ×”× ×ª×•× ×™× ×‘×ž×’×” ×‘×ª×™× (%d עד %d, בררת מחדל: %d)</translation>
</message>
@@ -2618,50 +1665,30 @@
<translation>×”×רנק %s יושב מחוץ לתיקיית ×”× ×ª×•× ×™× %s</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>×פשרויות ×”×רנק:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>×פשרות דיבוג/בדיקת ×רנק:</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>עליך לבנות מחדש ×ת מסד ×”× ×ª×•× ×™× ×ª×•×š שימוש ב־‎-reindex על מנת לשנות ×ת ‎-txindex</translation>
+ <source>Wallet options:</source>
+ <translation>×פשרויות ×”×רנק:</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>Cannot resolve -whitebind address: '%s'</source>
- <translation>×œ× × ×™×ª×Ÿ לפתור ×ת הכתובת ‎-whitebind:†'%s'</translation>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>×¡×›×•× ×”×¢×‘×¨×” נמוך מדי לשליחה ×חרי גביית העמלה</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>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <translation>×ירעה שגי××” בטעינת wallet.dat: ×”×רנק דורש גרסה חדשה יותר של ליבת ביטקוין</translation>
- </message>
- <message>
<source>Information</source>
<translation>מידע</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <translation>בדיקת התקינות ההתחלתית נכשלה. ליבת ביטקוין תיסגר כעת.</translation>
- </message>
- <message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>כמות ×œ× ×ª×§×™× ×” עבור -paytxfee=&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>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>כמות ×œ× ×ª×§×™× ×” עבור ‎-paytxfee=&lt;amount&gt;‎:†'%s' (חייבת להיות לפחות %s)</translation>
</message>
@@ -2698,6 +1725,10 @@
<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>
@@ -2710,6 +1741,10 @@
<translation>סכומי ההעברות ×—×™×™×‘×™× ×œ×”×™×•×ª חיוביי×</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>ההעברה גבוהה מדי עבור מדיניות העמלות</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>×¡×›×•× ×”×”×¢×‘×¨×” גדול מדי</translation>
</message>
@@ -2718,22 +1753,18 @@
<translation>×œ× × ×™×ª×Ÿ להת×גד ×¢× ×”×¤×ª×—×” %s במחשב ×–×” (פעולת ×”×יגוד החזירה ×ת השגי××” %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>×©× ×ž×©×ª×ž×© לחיבורי JSON-RPC</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>עדכן ×רק לפורמט העדכני בהפעלה</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>יש לכתוב ×ת ×”×רנק מחדש: × × ×œ×”×¤×¢×™×œ ×ת ליבת ביטקוין מחדש כדי ×œ×”×©×œ×™× ×ת הפעולה</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>×©× ×ž×©×ª×ž×© לחיבורי JSON-RPC</translation>
</message>
<message>
<source>Warning</source>
<translation>×זהרה</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>קובץ wallet.dat מושחת, החילוץ נכשל</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>ססמה לחיבורי JSON-RPC</translation>
</message>
@@ -2742,10 +1773,6 @@
<translation>יש לבצע פקודה זו כשהמקטע הטוב ביותר משתנה (%s בפקודה יוחלף בגיבוב המקטע)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>הודעת העזרה הזו</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>הפעלת בדיקת DNS עבור ‎-addnode,†‎-seednode ו־‎-connect</translation>
</message>
@@ -2754,12 +1781,8 @@
<translation>הכתובות בטעינה…</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>שגי××” בטעינת הקובץ wallet.dat: ×”×רנק מושחת</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>שגי××” בטעינת הקובץ wallet.dat</translation>
+ <source>(default: %s)</source>
+ <translation>(ברירת מחדל: %s)</translation>
</message>
<message>
<source>Invalid -proxy address: '%s'</source>
@@ -2770,18 +1793,6 @@
<translation>רשת ×œ× ×™×“×•×¢×” צוינה דרך ‎-onlynet:†'%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>×œ× × ×™×ª×Ÿ לפתור ×ת הכתובת ‎-bind:†'%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>×œ× × ×™×ª×Ÿ לפתור ×ת הכתובת ‎-externalip:†'%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_hi_IN.ts b/src/qt/locale/bitcoin_hi_IN.ts
index fbdaf1ba7c..86c53b4ce3 100644
--- a/src/qt/locale/bitcoin_hi_IN.ts
+++ b/src/qt/locale/bitcoin_hi_IN.ts
@@ -10,40 +10,9 @@
<translation>चà¥à¤¨à¤¿à¤¨à¥à¤¦à¤¾ पते को सिसà¥à¤Ÿà¤® कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ पर कापी करे !</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;पता कॉपी करे</translation>
- </message>
- <message>
<source>&amp;Delete</source>
<translation>&amp;मिटाठ!!</translation>
</message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>&amp;लेबल कॉपी करे </translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;à¤à¤¡à¤¿à¤Ÿ</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>लेबल</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>पता</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(कोई लेबल नही !)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -59,63 +28,7 @@
<source>Repeat new passphrase</source>
<translation>दोबारा नया पहचान शबà¥à¤¦/अकà¥à¤·à¤° डालिठ!</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>à¤à¤¨à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ वॉलेट !</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>वॉलेट खोलने के आपका वॉलेट पहचान शबà¥à¤¦à¥â€Œ/अकà¥à¤·à¤° चाईठ!</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>वॉलेट खोलिà¤</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>वॉलेट डीकà¥à¤°à¤¿à¤ªà¥à¤Ÿ( विकोड) करने के लिठआपका वॉलेट पहचान शबà¥à¤¦à¥â€Œ/अकà¥à¤·à¤° चाईठ!</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation> डीकà¥à¤°à¤¿à¤ªà¥à¤Ÿ वॉलेट</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>पहचान शबà¥à¤¦/अकà¥à¤·à¤° बदलिये !</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>वॉलेट à¤à¤¨à¤•à¥à¤°à¤¿à¤ªà¤¶à¤¨ को पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤ कीजिठ!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>वॉलेट à¤à¤¨à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ हो गया !</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>वॉलेट à¤à¤¨à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ नही हà¥à¤†!</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>वॉलेट à¤à¤¨à¤•à¥à¤°à¤¿à¤ªà¤¶à¤¨ नाकाम हो गया इंटरà¥à¤¨à¤² à¤à¤°à¤° की वजह से! आपका वॉलेट à¤à¤¨à¤•à¥à¤°à¥€à¤ªà¤¤ नही हà¥à¤† है!</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>आपके दà¥à¤µà¤¾à¤°à¤¾ डाले गये पहचान शबà¥à¤¦/अकà¥à¤·à¤° मिलते नही है !</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>वॉलेट का लॉक नही खà¥à¤²à¤¾ !</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>वॉलेट डीकà¥à¤°à¤¿à¤ªà¥à¤Ÿ करने के लिठजो पहचान शबà¥à¤¦/अकà¥à¤·à¤° डाले गये है वो सही नही है!</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>वॉलेट का डीकà¥à¤°à¤¿à¤ªà¥à¤Ÿ-षà¥à¤£ असफल !</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -224,9 +137,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
@@ -244,22 +154,6 @@
<source>Confirmed</source>
<translation>पकà¥à¤•à¤¾</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>पता कॉपी करे</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>लेबल कॉपी करे </translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>कॉपी राशि</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(कोई लेबल नही !)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -275,34 +169,6 @@
<source>&amp;Address</source>
<translation>&amp;पता</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>नया सà¥à¤µà¥€à¤•à¤¾à¤°à¥à¤¯ पता</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>नया भेजने वाला पता</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>à¤à¤¡à¤¿à¤Ÿ सà¥à¤µà¥€à¤•à¤¾à¤°à¥à¤¯ पता </translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>à¤à¤¡à¤¿à¤Ÿ भेजने वाला पता</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>डाला गया पता "%1" à¤à¤¡à¥à¤°à¥‡à¤¸ बà¥à¤• में पहले से ही मोजूद है|</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>वॉलेट को unlock नहीं किया जा सकता|</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>नयी कà¥à¤‚जी का निरà¥à¤®à¤¾à¤£ असफल रहा|</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -335,6 +201,10 @@
<translation>विकलà¥à¤ª</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>वॉलेट</translation>
+ </message>
+ <message>
<source>&amp;OK</source>
<translation>&amp;ओके</translation>
</message>
@@ -351,9 +221,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -369,9 +236,6 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
<source>N/A</source>
@@ -386,50 +250,19 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>लेबल:</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>लेबल कॉपी करे </translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>कॉपी राशि</translation>
- </message>
-</context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>पता</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>राशि</translation>
+ <source>&amp;Amount:</source>
+ <translation>राशि :</translation>
</message>
<message>
- <source>Label</source>
- <translation>लेबल</translation>
+ <source>&amp;Label:</source>
+ <translation>लेबल:</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>taareek</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>लेबल</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>राशि</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
<message>
- <source>(no label)</source>
- <translation>(कोई लेबल नही !)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;पता कॉपी करे</translation>
</message>
</context>
<context>
@@ -454,22 +287,6 @@
<source>Confirm the send action</source>
<translation>भेजने की पà¥à¤·à¥à¤Ÿà¤¿ करें</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>सिकà¥à¤•à¥‡ भेजने की पà¥à¤·à¥à¤Ÿà¤¿ करें</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>कॉपी राशि</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>भेजा गया अमाउंट शà¥à¤¨à¥à¤¯ से अधिक होना चाहिà¤|</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(कोई लेबल नही !)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -482,10 +299,6 @@
<translation>पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¥à¤¤à¤¾:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>आपकी à¤à¤¡à¥à¤°à¥‡à¤¸ बà¥à¤• में इस à¤à¤¡à¥à¤°à¥‡à¤¸ के लिठà¤à¤• लेबल लिखें</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>लेबल:</translation>
</message>
@@ -501,6 +314,10 @@
<source>Alt+P</source>
<translation>Alt-P</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¥à¤¤à¤¾:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -535,274 +352,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>खà¥à¤²à¤¾ है जबतक %1</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/अपà¥à¤·à¥à¤Ÿ</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 पà¥à¤·à¥à¤Ÿà¤¿à¤¯à¤¾à¤</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>taareek</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>राशि</translation>
- </message>
- <message>
- <source>true</source>
- <translation>सही</translation>
- </message>
- <message>
- <source>false</source>
- <translation>ग़लत</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, अभी तक सफलतापूरà¥à¤µà¤• पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ नहीं किया गया है</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>अजà¥à¤žà¤¾à¤¤</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>लेन-देन का विवरण</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation> ये खिड़की आपको लेन-देन का विसà¥à¤¤à¥ƒà¤¤ विवरण देगी !</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>taareek</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>टाइप</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>खà¥à¤²à¤¾ है जबतक %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>पकà¥à¤•à¥‡ ( %1 पकà¥à¤•à¤¾ करना)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>यह बà¥à¤²à¥‰à¤• किसी भी और नोड को मिला नही है ! शायद यह बà¥à¤²à¥‰à¤• कोई भी नोड सà¥à¤µà¥€à¤•à¤¾à¤°à¥‡ गा नही !</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>जेनरेट किया गया किंतॠसà¥à¤µà¥€à¤•à¤¾à¤°à¤¾ नही गया !</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>लेबल</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>सà¥à¤µà¥€à¤•à¤¾à¤° करना</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>सà¥à¤µà¥€à¤•à¤¾à¤°à¥à¤¯ ओर से</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>भेजा गया</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>भेजा खà¥à¤¦ को भà¥à¤—तान</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>माइंड</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(लागू नहीं)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>टà¥à¤°à¤¾à¤‚सेकà¥à¤¶à¤¨ सà¥à¤¤à¤¿à¤¥à¤¿| पà¥à¤·à¥à¤Ÿà¤¿à¤¯à¥‹à¤‚ की संखà¥à¤¯à¤¾ जानने के लिठइस जगह पर माउस लायें|</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>तारीख तथा समय जब ये टà¥à¤°à¤¾à¤‚सेकà¥à¤¶à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤ˆ थी|</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>टà¥à¤°à¤¾à¤‚सेकà¥à¤¶à¤¨ का पà¥à¤°à¤•à¤¾à¤°|</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>अमाउंट बैलेंस से निकला या जमा किया गया |</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>सभी</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>आज</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>इस हफà¥à¤¤à¥‡</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>इस महीने</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>पिछले महीने</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>इस साल</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>विसà¥à¤¤à¤¾à¤°...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>सà¥à¤µà¥€à¤•à¤¾à¤° करना</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>भेजा गया</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>अपनेआप को</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>माइंड</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>अनà¥à¤¯</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>ढूà¤à¤¦à¤¨à¥‡ के लिठकृपा करके पता या लेबल टाइप करे !</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>लघà¥à¤¤à¥à¤¤à¤® राशि</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>पता कॉपी करे</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>लेबल कॉपी करे </translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>कॉपी राशि</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>à¤à¤¡à¤¿à¤Ÿ लेबल</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>पकà¥à¤•à¤¾</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>taareek</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>टाइप</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>लेबल</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>पता</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>विसà¥à¤¤à¤¾à¤°:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>तक</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>सिकà¥à¤•à¥‡ भेजें|</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>Backup Wallet</source>
- <translation>बैकप वॉलेट</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>वॉलेट डेटा (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>बैकप असफल</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>बैकप सफल</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts
index 624cbbbc23..f5accfb0b8 100644
--- a/src/qt/locale/bitcoin_hr.ts
+++ b/src/qt/locale/bitcoin_hr.ts
@@ -26,10 +26,6 @@
<translation>&amp;Zatvori</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopiraj adresu</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Brisanje trenutno odabrane adrese s popisa.</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>Iz&amp;briši</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Odaberi adresu na koju šalješ novac</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Odaberi adresu na koju primaš novac</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Odaberi</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Adresa za slanje</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Adresa za primanje</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>Ovo su vaše Bitcoin adrese za slanje novca. Uvijek provjerite iznos i adresu primatelja prije slanja novca.</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>Ovo su vaÅ¡e Bitcoin adrese za primanje novca. PreporuÄamo da koristite novu adresu za primanje za svaku transakciju.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopiraj &amp;oznaku</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Uredi</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Izvezi listu adresa</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Datoteka podataka odvojenih zarezima (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Izvoz neuspješan</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Došlo je do pogreške kod spremanja liste adresa na %1. Molimo pokušajte ponovno.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez oznake)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,90 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Ponovite novu lozinku</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Å ifriranje novÄanika</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ova operacija treba lozinku vaÅ¡eg novÄanika kako bi se novÄanik otkljuÄao.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>OtkljuÄaj novÄanik</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ova operacija treba lozinku vaÅ¡eg novÄanika kako bi se novÄanik deÅ¡ifrirao.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>DeÅ¡ifriranje novÄanika.</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Promjena lozinke</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Potvrdi Å¡ifriranje novÄanika</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>Upozorenje: Ako Å¡ifrirate vaÅ¡ novÄanik i izgubite lozinku, &lt;b&gt;IZGUBIT ĆETE SVE SVOJE BITCOINE!&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Jeste li sigurni da želite Å¡ifrirati svoj novÄanik?</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>VAŽNO: Sve prethodne priÄuve vaÅ¡eg novÄanika trebale bi biti zamijenjene novo stvorenom, Å¡ifriranom datotekom novÄanika. Zbog sigurnosnih razloga, prethodne priÄuve neÅ¡ifriranog novÄanika će postati beskorisne Äim poÄnete koristiti novi, Å¡ifrirani novÄanik.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Upozorenje: Tipka Caps Lock je ukljuÄena!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>NovÄanik Å¡ifriran</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Unesite staru i novu lozinku za novÄanik.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Å ifriranje novÄanika nije uspjelo</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Å ifriranje novÄanika nije uspjelo zbog interne pogreÅ¡ke. VaÅ¡ novÄanik nije Å¡ifriran.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Priložene lozinke se ne podudaraju.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>OtkljuÄavanje novÄanika nije uspjelo</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Lozinka za deÅ¡ifriranje novÄanika nije toÄna.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>DeÅ¡ifriranje novÄanika nije uspjelo</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Lozinka novÄanika je uspjeÅ¡no promijenjena.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -258,6 +103,10 @@
<translation>Izlazak iz programa</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Više o %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Više o &amp;Qt</translation>
</message>
@@ -294,14 +143,6 @@
<translation>Otvori &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core klijent</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importiranje blokova sa diska...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Re-indeksiranje blokova na disku...</translation>
</message>
@@ -346,10 +187,6 @@
<translation>Pri&amp;mi</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Prikaži informacije o programu Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>Po&amp;kaži / Sakrij</translation>
</message>
@@ -386,22 +223,10 @@
<translation>Traka kartica</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Zatraži uplatu (stvara QR kod i bitcoin: URI adresu)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;O programu Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Promijeni postavke programa</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Prikaži popis korištenih adresa i oznaka za slanje novca</translation>
</message>
@@ -417,10 +242,6 @@
<source>&amp;Command-line options</source>
<translation>Opcije &amp;naredbene linije</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Ispis svih opcija naredbene linije programa sa kratkim opisom</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 aktivnih veza na Bitcoin mrežu</numerusform><numerusform>%n aktivnih veza na Bitcoin mrežu</numerusform></translation>
@@ -525,9 +346,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -593,87 +411,7 @@
<source>Priority</source>
<translation>Prioriteta</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopiraj adresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiraj oznaku</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiraj iznos</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopiraj ID transakcije</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>najviša</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>viša</translation>
- </message>
- <message>
- <source>high</source>
- <translation>visoka</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>srednje visoka</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>srednja</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>srednje niska</translation>
- </message>
- <message>
- <source>low</source>
- <translation>niska</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>niža</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>najniža</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Oznaka postane crvene boje ako je transakcija veća od 1000 bajtova.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>Oznaka postane crvene boje ako je prioriteta transakcije niža od "srednja"</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than %1.</source>
- <translation>Oznaka postane crvene boje ako je iznos manji od %1</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>da</translation>
- </message>
- <message>
- <source>no</source>
- <translation>ne</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transakcije više prioritete imaju veću vjerojatnost da budu prije dodane u novi blok.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez oznake)</translation>
- </message>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -696,38 +434,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresa</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nova adresa za primanje</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nova adresa za slanje</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Uredi adresu za primanje</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Uredi adresu za slanje</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Upisana adresa "%1" je već u adresaru.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Upisana adresa "%1" nije valjana bitcoin adresa.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ne mogu otkljuÄati novÄanik.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Stvaranje novog kljuÄa nije uspjelo.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -747,10 +453,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>verzija</translation>
</message>
@@ -759,10 +461,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>O programu Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Opcije programa u naredbenoj liniji</translation>
</message>
@@ -774,7 +472,7 @@
<source>command-line options</source>
<translation>opcije programa u naredbenoj liniji</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -782,14 +480,6 @@
<translation>Dobrodošli</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Dobrodošli u programu Bitcoin Core.</translation>
- </message>
- <message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error</source>
<translation>Greška</translation>
</message>
@@ -812,10 +502,6 @@
<source>Select payment request file</source>
<translation>Izaberi datoteku zahtjeva za plaćanje</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Izaberi datoteku zahtjeva za plaćanje</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -864,14 +550,6 @@
<translation>&amp;Mreža</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Program se automatski pokrene po prijavi u sustav.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Pokreni program kod prijave u sustav</translation>
- </message>
- <message>
<source>W&amp;allet</source>
<translation>&amp;NovÄanik</translation>
</message>
@@ -964,13 +642,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI upravljanje</translation>
- </message>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -985,23 +656,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Spremi sliku...</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Spremi QR kod</translation>
- </message>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Ime klijenta</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1014,8 +670,8 @@
<translation>&amp;Informacije</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>OpenSSL verzija u upotrebi</translation>
+ <source>Debug window</source>
+ <translation>Konzola za dijagnostiku</translation>
</message>
<message>
<source>Network</source>
@@ -1082,10 +738,6 @@
<translation>OÄisti konzolu</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core 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>Koristite tipke gore i dolje za izbor već koriÅ¡tenih naredbi. &lt;b&gt;Ctrl-L&lt;/b&gt; kako bi oÄistili ekran i povijest naredbi.</translation>
</message>
@@ -1120,15 +772,7 @@
<source>Show</source>
<translation>Pokaži</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopiraj oznaku</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiraj iznos</translation>
- </message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
@@ -1147,65 +791,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Spremi sliku...</translation>
</message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Iznos</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Poruka</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI je predug, probajte skratiti tekst za naslov / poruku.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Greška kod kodiranja URI adrese u QR kod.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Poruka</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Iznos</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez oznake)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(bez poruke)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(bez iznosa)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1214,6 +799,10 @@
<translation>Slanje novca</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>Nedovoljna sredstva</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>KoliÄina:</translation>
</message>
@@ -1238,6 +827,10 @@
<translation>Vraćeno:</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Naknada za transakciju:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Pošalji novce većem broju primatelja u jednoj transakciji</translation>
</message>
@@ -1269,35 +862,7 @@
<source>S&amp;end</source>
<translation>&amp;Pošalji</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Potvrdi slanje novca</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiraj iznos</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ili</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Iznos mora biti veći od 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Iznos je veći od raspoložljivog stanja novÄanika.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Iznos je veći od stanja novÄanika kad se doda naknada za transakcije od %1.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez oznake)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -1309,10 +874,6 @@
<translation>&amp;Primatelj plaćanja:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Unesite oznaku za ovu adresu kako bi ju dodali u vaš adresar</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Oznaka:</translation>
</message>
@@ -1367,6 +928,10 @@
<translation>Potpis</translation>
</message>
<message>
+ <source>Sign &amp;Message</source>
+ <translation>&amp;Potpišite poruku</translation>
+ </message>
+ <message>
<source>Clear &amp;All</source>
<translation>Obriši &amp;sve</translation>
</message>
@@ -1375,21 +940,13 @@
<translation>&amp;Potvrdite poruku</translation>
</message>
<message>
- <source>Wallet unlock was cancelled.</source>
- <translation>OtkljuÄavanje novÄanika je otkazano.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Poruka je potpisana.</translation>
+ <source>Verify &amp;Message</source>
+ <translation>&amp;Potvrdite poruku</translation>
</message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1398,350 +955,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Otvoren do %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1 nije dostupan</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/nepotvrđeno</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 potvrda</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Izvor</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generiran</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Od</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Za</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>vlastita adresa</translation>
- </message>
- <message>
- <source>label</source>
- <translation>oznaka</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Uplaćeno</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>Nije prihvaćeno</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Zaduženje</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Naknada za transakciju</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Neto iznos</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Poruka</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Komentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID transakcije</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transakcija</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Unosi</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Iznos</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, još nije bio uspješno emitiran</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>nepoznato</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalji transakcije</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Ovaj prozor prikazuje detaljni opis transakcije</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tip</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Otvoren do %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Potvrđen (%1 potvrda)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ovaj blok nije bio primljen od strane bilo kojeg drugog Ävora i vjerojatno neće biti prihvaćen!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Primljeno od</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Poslano za</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Plaćanje samom sebi</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Rudareno</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/d)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Status transakcije</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Datum i vrijeme kad je transakcija primljena</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Vrsta transakcije.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Iznos odbijen od ili dodan k saldu.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Sve</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Danas</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Ovaj tjedan</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Ovaj mjesec</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Prošli mjesec</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Ove godine</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Raspon...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Primljeno s</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Poslano za</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Samom sebi</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Rudareno</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Ostalo</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Unesite adresu ili oznaku za pretraživanje</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Min iznos</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopiraj adresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiraj oznaku</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiraj iznos</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopiraj ID transakcije</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Izmjeni oznaku</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Prikaži detalje transakcije</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Izvoz neuspješan</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Datoteka podataka odvojenih zarezima (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Potvrđeno</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tip</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Raspon:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>za</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Slanje novca</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Izvoz</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Izvoz podataka iz trenutnog taba u datoteku</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Arhiviranje novÄanika</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Podaci novÄanika (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Arhiviranje nije uspjelo</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1764,6 +987,10 @@
<translation>Izvršavaj u pozadini kao uslužnik i prihvaćaj komande</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Opcije za kreiranje bloka:</translation>
</message>
@@ -1800,10 +1027,6 @@
<translation>Izvršite naredbu kada se najbolji blok promjeni (%s u cmd je zamjenjen sa block hash)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Ova poruka za pomoć</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Dozvoli DNS upite za -addnode, -seednode i -connect</translation>
</message>
@@ -1812,22 +1035,10 @@
<translation>UÄitavanje adresa...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>GreÅ¡ka kod uÄitavanja datoteke wallet.dat: NovÄanik pokvaren</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>GreÅ¡ka kod uÄitavanja datoteke wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Nevaljala -proxy adresa: '%s'</translation>
</message>
<message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nevaljali iznos za opciju -paytxfee=&lt;iznos&gt;: '%s'</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 9825a28543..9eb0cf76c4 100644
--- a/src/qt/locale/bitcoin_hu.ts
+++ b/src/qt/locale/bitcoin_hu.ts
@@ -26,10 +26,6 @@
<translation>&amp;Bezárás</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Cím másolása</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Kiválasztott cím törlése a listából</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Törlés</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Válaszd ki a címet, ahová küldesz</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Válaszd ki a címet, amivel fogadsz</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Kiválaszt</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Küldési címek</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Fogadó címek</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Ezekről a címekről küldhetsz bitcoint. Mindig ellenőrizd a fogadó címet és a fizetendő összeget, mielőtt elküldöd.</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>Ezekkel a címekkel fogadhatsz bitcoint. Ajánlott minden tranzakcióhoz egy új fogadó címet használni.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>&amp;Címke másolása</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>Sz&amp;erkesztés</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Címjegyzék exportálása</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Vesszővel elválasztott fájl (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Az exportálás sikertelen volt</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Hiba történt a címjegyzék %1 helyre való mentésekor. Kérlek próbáld újra.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Címke</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Cím</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nincs címke)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,90 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Új jelszó újra</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Tárca titkosítása</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>A tárca megnyitásához a műveletnek szüksége van a tárcád jelszavára.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Tárca megnyitása</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>A tárca dekódolásához a műveletnek szüksége van a tárcád jelszavára.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Tárca dekódolása</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Jelszó megváltoztatása</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Biztosan titkosítani akarod a tárcát?</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>Figyelem: ha titkosítod a tárcát és elveszted a jelszavad, akkor &lt;b&gt;AZ ÖSSZES BITCOINOD ELVESZIK!&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Biztosan titkosítani akarod a tárcád?</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>FONTOS: A tárca-fájl minden korábbi mentését cseréld le ezzel az új, titkosított tárca-fájllal. Biztonsági okokból a tárca-fájl korábbi, titkosítás nélküli mentései használhatatlanná válnak, amint elkezded használni az új, titkosított tárcát.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Vigyázat: a Caps Lock be van kapcsolva!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Tárca titkosítva</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Add meg a tárcához a régi jelszavad és az új jelszavad.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>A tárca titkosítása sikertelen.</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Tárca titkosítása belső hiba miatt sikertelen. A tárcád nem lett titkosítva.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>A megadott jelszavak nem egyeznek.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Tárca megnyitása sikertelen</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Hibás jelszó.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Dekódolás sikertelen.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Jelszó megváltoztatva.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -258,6 +103,10 @@
<translation>Kilépés az alkalmazásból</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;A %1-ról</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>A &amp;Qt-ról</translation>
</message>
@@ -294,14 +143,6 @@
<translation>&amp;URI azonosító megnyitása...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core kliens</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>A blokkok importálása lemezről...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Lemezen lévő blokkok újraindexelése...</translation>
</message>
@@ -346,10 +187,6 @@
<translation>&amp;Fogadás</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Bitcoin Core információ megjelenítése</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Mutat / Elrejt</translation>
</message>
@@ -386,22 +223,10 @@
<translation>Fül eszköztár</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Fizetési kérelem (QR-kódot és "bitcoin:" URI azonosítót hoz létre)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;A Bitcoin Core-ról</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Konfigurációs opciók módosítása a Bitcoin Core-hoz</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>A használt küldési címek és címkék megtekintése</translation>
</message>
@@ -417,10 +242,6 @@
<source>&amp;Command-line options</source>
<translation>Paran&amp;cssor kapcsolók</translation>
</message>
- <message>
- <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ózathoz</numerusform><numerusform>%n aktív kapcsolat a Bitcoin hálózathoz</numerusform></translation>
@@ -533,13 +354,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Hálózati figyelmeztetés</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -617,150 +431,6 @@
<source>Priority</source>
<translation>Prioritás</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Cím másolása</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Címke másolása</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Összeg másolása</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Tranzakcióazonosító másolása</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Megmaradt zárolása</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Zárolás feloldása</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Mennyiség másolása</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Díj másolása</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Utólagos díj másolása</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Byte-ok másolása </translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Prioritás másolása</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Visszajáró másolása</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Visszajáró másolása</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>legmagasabb</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>magasabb</translation>
- </message>
- <message>
- <source>high</source>
- <translation>magas</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>közepesen-magas</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>közepes</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>alacsony-közepes</translation>
- </message>
- <message>
- <source>low</source>
- <translation>alacsony</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>alacsonyabb</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>legalacsonyabb</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 zárolva)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>semmi</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Ez a címke pirosra változik, ha a tranzakció mérete nagyobb mint 1000 bájt.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>Ez a címke pirosra változik, ha a prioritás kisebb mint "közepes".</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than %1.</source>
- <translation>Ez a címke pirosra változik, ha bármely fogadónak %1-nál kevesebb összeg érkezik.</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Bemenetenként +/- %1 satoshi-val változhat</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>igen</translation>
- </message>
- <message>
- <source>no</source>
- <translation>nem</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Bemenetenként +/- 1 byte-al változhat.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Nagyobb prioritású tranzakciók nagyobb valószínűséggel kerülnek be egy blokkba.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nincs címke)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>visszajáró %1-ből (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(visszajáró)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -784,38 +454,6 @@
<source>&amp;Address</source>
<translation>&amp;Cím</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Új fogadó cím</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Új küldő cím</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Fogadó cím szerkesztése</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Küldő cím szerkesztése</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>A megadott "%1" cím már szerepel a címjegyzékben.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>A megadott "%1" cím nem egy érvényes Bitcoin-cím.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Tárca feloldása sikertelen</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Új kulcs generálása sikertelen</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -839,10 +477,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>verzió</translation>
</message>
@@ -851,10 +485,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>A Bitcoin Core-ról</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Parancssoros opciók</translation>
</message>
@@ -866,7 +496,7 @@
<source>command-line options</source>
<translation>parancssoros opciók</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -874,14 +504,6 @@
<translation>Üdvözlünk</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Üdvözlünk a Bitcoin Core-ban.</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>A Bitcoin Core le fogja tölteni és tárolni fogja a Bitcoin blokklánc egy másolatát. Legalább %1GB adat lesz tárolva ebben a mappában, és ez folyamatosan nőni fog. A tárca szintén itt lesz tárolva.</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>Az alapértelmezett adat könyvtár használata</translation>
</message>
@@ -890,10 +512,6 @@
<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>
@@ -924,10 +542,6 @@
<source>Select payment request file</source>
<translation>Fizetési kérelmi fájl kiválasztása</translation>
</message>
- <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>
@@ -960,8 +574,8 @@
<translation>A proxy IP címe (pl.: 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>Itt beállíthatod a kezelőfelület nyelvét. A beállítás a Bitcoin újraindítása után lép érvénybe.</translation>
+ <source>Third party transaction URLs</source>
+ <translation>Harmadik fél tranzakció URL-ek</translation>
</message>
<message>
<source>Reset all client options to default.</source>
@@ -976,10 +590,6 @@
<translation>&amp;Hálózat</translation>
</message>
<message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>A Bitcoin elindítása bejelentkezéskor</translation>
- </message>
- <message>
<source>W&amp;allet</source>
<translation>T&amp;árca</translation>
</message>
@@ -1012,6 +622,18 @@
<translation>Proxy portja (pl.: 9050)</translation>
</message>
<message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Ablak</translation>
</message>
@@ -1132,25 +754,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI kezelés</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>A bitcoint nem lehet elindítani: click-to-pay handler</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>A fizetési kérelem lejárt</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Érvénytelen fizetési kérelem</translation>
- </message>
- </context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1201,31 +804,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Kép mentése</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kép másolása</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>QR kód mentése</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG kép (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Kliens néve</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Nem elérhető</translation>
</message>
@@ -1246,10 +826,6 @@
<translation>Ãltalános</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Használt OpenSSL verzió</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Használt BerkeleyDB verzió</translation>
</message>
@@ -1278,6 +854,10 @@
<translation>Aktuális blokkok száma</translation>
</message>
<message>
+ <source>Memory usage</source>
+ <translation>Memóriahasználat</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Fogadott</translation>
</message>
@@ -1354,10 +934,6 @@
<translation>Ki:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Fordítás dátuma</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Debug naplófájl</translation>
</message>
@@ -1366,6 +942,22 @@
<translation>Konzol törlése</translation>
</message>
<message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;óra</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;nap</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;hét</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;év</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>
@@ -1460,18 +1052,6 @@
<source>Remove</source>
<translation>Eltávolítás</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Címke másolása</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Üzenet másolása</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Összeg másolása</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1491,73 +1071,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Kép mentése</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Fizetés kérése a %1-hez</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Kifizetés információ</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI:</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Cím</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Összeg</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Címke</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Ãœzenet</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>A keletkezett URI túl hosszú, próbálja meg csökkenteni a cimkeszöveg / üzenet méretét.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Hiba lépett fel az URI QR kóddá alakításakor</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dátum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Címke</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Ãœzenet</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Összeg</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nincs címke)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(nincs üzenet)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(nincs összeg)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1622,6 +1135,14 @@
<translation>Elrejtés</translation>
</message>
<message>
+ <source>Recommended:</source>
+ <translation>Ajánlott:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Egyéni:</translation>
+ </message>
+ <message>
<source>normal</source>
<translation>normál</translation>
</message>
@@ -1661,75 +1182,7 @@
<source>S&amp;end</source>
<translation>&amp;Küldés</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Küldés megerősítése</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Mennyiség másolása</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Összeg másolása</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Díj másolása</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Utólagos díj másolása</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Byte-ok másolása </translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Prioritás másolása</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Visszajáró másolása</translation>
- </message>
- <message>
- <source>or</source>
- <translation>vagy</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Nincs ennyi bitcoin az egyenlegeden.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <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>Payment request expired.</source>
- <translation>A fizetési kérelem lejárt</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Figyelmeztetés: Érvénytelen Bitcoin cím</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nincs címke)</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Visszajáró másolása</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Biztos, hogy el akarod küldeni?</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -1741,11 +1194,6 @@
<translation>Címzett:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Milyen címkével kerüljön be ez a cím a címtáradba?
-</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>Címke:</translation>
</message>
@@ -1774,6 +1222,10 @@
<translation>Ãœzenet:</translation>
</message>
<message>
+ <source>Pay To:</source>
+ <translation>Címzett:</translation>
+ </message>
+ <message>
<source>Memo:</source>
<translation>Jegyzet:</translation>
</message>
@@ -1781,10 +1233,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>A Bitcoin Core leáll...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Ne állítsd le a számítógépet amíg ez az ablak el nem tűnik.</translation>
</message>
@@ -1844,53 +1292,13 @@
<translation>Üzenet ellenőrzése</translation>
</message>
<message>
- <source>The entered address is invalid.</source>
- <translation>A megadott cím nem érvényes.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Ellenőrizze a címet és próbálja meg újra.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>A megadott cím privát kulcsa nem található.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Üzenet aláírása nem sikerült.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Üzenet aláírva.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Az aláírást nem sikerült dekódolni.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Ellenőrizd az aláírást és próbáld újra.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Az üzenet ellenőrzése nem sikerült.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Üzenet ellenőrizve.</translation>
+ <source>Verify &amp;Message</source>
+ <translation>Üzenet ellenőrzése</translation>
</message>
-</context>
+ </context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>A Bitcoin Core fejlesztői</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[teszthálózat]</translation>
</message>
@@ -1903,374 +1311,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>%1-ig megnyitva</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/megerősítetlen</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 megerősítés</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Ãllapot</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dátum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Forrás</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Legenerálva</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Å°rlap</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Címzett</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>saját cím</translation>
- </message>
- <message>
- <source>label</source>
- <translation>címke</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Jóváírás</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>elutasítva</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Terhelés</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Tranzakciós díj</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Nettó összeg</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Ãœzenet</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Megjegyzés</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Tranzakcióazonosító</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Debug információ</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Tranzakció</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Bemenetek</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Összeg</translation>
- </message>
- <message>
- <source>true</source>
- <translation>igaz</translation>
- </message>
- <message>
- <source>false</source>
- <translation>hamis</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, még nem sikerült elküldeni.</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>ismeretlen</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Tranzakció részletei</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Ez a mező a tranzakció részleteit mutatja</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dátum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Típus</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>%1-ig megnyitva</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Megerősítve (%1 megerősítés)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ezt a blokkot egyetlen másik csomópont sem kapta meg, így valószínűleg nem lesz elfogadva!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Legenerálva, de még el nem fogadva.</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Címke</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Megerősítetlen:</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Erre a címre</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Erről az</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Erre a címre</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Magadnak kifizetve</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Kibányászva</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(nincs)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Tranzakció állapota. Húzd ide a kurzort, hogy lásd a megerősítések számát.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Tranzakció fogadásának dátuma és időpontja.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tranzakció típusa.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Az egyenleghez jóváírt vagy ráterhelt összeg.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Mind</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Mai</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Ezen a héten</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Ebben a hónapban</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Múlt hónapban</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Ebben az évben</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Tartomány ...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Erre a címre</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Erre a címre</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Magadnak</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Kibányászva</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Más</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Ãrd be a keresendÅ‘ címet vagy címkét</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimális összeg</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Cím másolása</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Címke másolása</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Összeg másolása</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Tranzakcióazonosító másolása</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Címke szerkesztése</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Tranzakciós részletek megjelenítése</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Az exportálás sikertelen volt</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Sikeres exportálás</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Vesszővel elválasztott fájl (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Megerősítve</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dátum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Típus</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Címke</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Cím</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>Azonosító</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Tartomány:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>meddig</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Érmék küldése</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportálás</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Jelenlegi nézet exportálása fájlba</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Biztonsági másolat készítése a Tárcáról</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Tárca fájl (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Biztonsági másolat készítése sikertelen</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Sikeres biztonsági mentés</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2305,6 +1355,10 @@
<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>Bitcoin Core</source>
+ <translation>Bitcoin Core</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>
@@ -2369,14 +1423,6 @@
<translation>Tárca beállítások:</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Az adatbázist újra kell építeni -reindex használatával (módosítás -tindex).</translation>
- </message>
- <message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i A Bitcoin Core Fejlesztői</translation>
- </message>
- <message>
<source>Error reading from database, shutting down.</source>
<translation>Hiba az adatbázis olvasásakor, leállítás</translation>
</message>
@@ -2385,14 +1431,6 @@
<translation>Információ</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Érvénytelen -minrelaytxfee=&lt;amount&gt;: '%s' összeg</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Érvénytelen -mintxfee=&lt;amount&gt;: '%s' összeg</translation>
- </message>
- <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>trace/debug információ küldése a konzolra a debog.log fájl helyett</translation>
</message>
@@ -2435,11 +1473,6 @@
<translation>Parancs, amit akkor hajt végre, amikor a legjobb blokk megváltozik (%s a cmd-ban lecserélődik a blokk hash-re)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Ez a súgó-üzenet
-</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>DNS-kikeresés engedélyezése az addnode-nál és a connect-nél</translation>
</message>
@@ -2448,14 +1481,6 @@
<translation>Címek betöltése...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Hiba a wallet.dat betöltése közben: meghibásodott tárca</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Hiba az wallet.dat betöltése közben</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Érvénytelen -proxy cím: '%s'</translation>
</message>
@@ -2464,18 +1489,6 @@
<translation>Ismeretlen hálózat lett megadva -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Csatlakozási cím (-bind address) feloldása nem sikerült: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Külső cím (-externalip address) feloldása nem sikerült: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Étvénytelen -paytxfee=&lt;összeg&gt; összeg: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nincs elég bitcoinod.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_id_ID.ts b/src/qt/locale/bitcoin_id_ID.ts
index 4124ef0951..feb6f690c4 100644
--- a/src/qt/locale/bitcoin_id_ID.ts
+++ b/src/qt/locale/bitcoin_id_ID.ts
@@ -26,10 +26,6 @@
<translation>T&amp;utup</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Salin Alamat</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Hapus alamat yang sementara dipilih dari daftar</translation>
</message>
@@ -45,69 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Hapus</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Pilihlah alamat kemana koin Anda akan dikirim </translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Pilihlah alamat dimana Anda akan menerima koin</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>P&amp;ilihlah</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Alamat-alamat mengirim</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Alamat-alamat menerima</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>Alamat-alamat Anda supaya mengirim pembayaran. Periksalah jumlah dan alamat penerima setiap kali Anda mengirim 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>Alamat-alamat Anda supaya menerima pembayaran. Dianjurkan agar Anda menggunakan alamat menerima yang baru untuk setiap transaksi.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Salin &amp;Label</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Ubah</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Ekspor Daftar Alamat</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Berkas CSV (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Proses Ekspor Gagal</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Alamat</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(tidak ada label)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -127,83 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Ulangi kata kunci baru</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Enkripsi dompet</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Operasi ini memerlukan kata kunci dompet Anda untuk membuka dompet ini.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Buka dompet</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Operasi ini memerlukan kata kunci dompet Anda untuk mendekripsi dompet ini.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dekripsi dompet</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Ubah kata kunci</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Konfirmasi enkripsi dompet</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>Perhatian: Jika anda mengenkripsi dompet anda dan lupa kata kuncinya, anda pasti &lt;b&gt;KEHILANGAN SELURUH BITCOIN ANDA&lt;/B&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Apakah kamu yakin ingin mengenkripsi dompet anda?</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Perhatian: tombol Caps Lock sementara aktif!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Dompet terenkripsi</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Enkripsi dompet gagal</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Enkripsi dompet gagal karena kesalahan internal. Dompet Anda tidak dienkripsi.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Kata kunci yang dimasukkan tidak cocok.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Gagal buka dompet</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Kata kunci yang dimasukkan untuk dekripsi dompet tidak cocok.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Dekripsi dompet gagal</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Netmask</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Kata kunci untuk dompet berubah berhasil.</translation>
+ <source>Banned Until</source>
+ <translation>Di banned sampai</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -223,7 +92,7 @@
</message>
<message>
<source>Show general overview of wallet</source>
- <translation>Tampilkan kilasan umum dari dompet</translation>
+ <translation>Tampilkan gambaran umum dompet Anda</translation>
</message>
<message>
<source>&amp;Transactions</source>
@@ -231,7 +100,7 @@
</message>
<message>
<source>Browse transaction history</source>
- <translation>Jelajah sejarah transaksi</translation>
+ <translation>Lihat riwayat transaksi</translation>
</message>
<message>
<source>E&amp;xit</source>
@@ -254,6 +123,10 @@
<translation>&amp;Pilihan...</translation>
</message>
<message>
+ <source>&amp;Encrypt Wallet...</source>
+ <translation>&amp;Enkripsi Dompet...</translation>
+ </message>
+ <message>
<source>&amp;Backup Wallet...</source>
<translation>&amp;Cadangkan Dompet...</translation>
</message>
@@ -263,27 +136,19 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>Alamat-alamat &amp;Mengirim</translation>
+ <translation>&amp;Alamat-alamat untuk mengirim...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>Alamat-alamat &amp;Menerima</translation>
+ <translation>&amp;Alamat-alamat untuk menerima...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
<translation>Buka &amp;URI</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Client Bitcoin Inti</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Blok-blok sedang di-impor dari disk</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
- <translation>Mengindex ulang block di harddisk...</translation>
+ <translation>Mengindex ulang blok di dalam disk...</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -326,12 +191,8 @@
<translation>&amp;Menerima</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Tampilkan informasi tentang Bitcoin Inti</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
- <translation>&amp;Sunjukkan / Menyembungi</translation>
+ <translation>&amp;Tampilkan / Sembunyikan</translation>
</message>
<message>
<source>Show or hide the main Window</source>
@@ -339,15 +200,15 @@
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation>Mengenkripsi kunci-kunci pribadi yang dipunyai dompetmu</translation>
+ <translation>Enkripsi private key yang dimiliki dompet Anda</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation>Tandalah pesanan dengan alamat-alamat Bitcoin Anda supaya membuktikan pesanan itu dikirim oleh Anda</translation>
+ <translation>Tanda tangani sebuah pesan menggunakan alamat Bitcoin Anda untuk membuktikan bahwa Anda adalah pemilik alamat tersebut</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation>Periksakan pesan-pesan supaya menjaminkan ditandatangani oleh alamat Bitcoin yang terperinci</translation>
+ <translation>Verifikasi pesan untuk memastikan bahwa pesan tersebut ditanda tangani oleh suatu alamat Bitcoin tertentu</translation>
</message>
<message>
<source>&amp;File</source>
@@ -366,16 +227,8 @@
<translation>Baris tab</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation>Permintaan pembayaran (membangkitkan kode QR dan bitcoin: URIs)</translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Mengenai Bitcoin Core</translation>
+ <translation>Permintaan pembayaran (membuat kode QR dan bitcoin: URIs)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -391,21 +244,21 @@
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>&amp;pilihan Perintah-baris</translation>
- </message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Tampilkan pesan bantuan Bitcoin Core untuk memberikan daftar pilihan perintah-baris yang memungkinkan dalam aplikasi Bitcoin</translation>
+ <translation>&amp;pilihan Command-line</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n hubungan aktif ke jaringan Bitcoin</numerusform></translation>
+ <translation><numerusform>%n koneksi aktif ke jaringan Bitcoin</numerusform></translation>
</message>
<message>
<source>No block source available...</source>
<translation>Sumber blok tidak tersedia...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>%n blok dari riwayat transaksi diproses.</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n jam</numerusform></translation>
</message>
@@ -431,15 +284,15 @@
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation>Blok terakhir dibuat %1 lalu.</translation>
+ <translation>Blok terakhir yang diterima %1 lalu.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation>Transaksi setelah ini tidak akan ditampilkan</translation>
+ <translation>Transaksi setelah ini belum akan terlihat.</translation>
</message>
<message>
<source>Error</source>
- <translation>Gagal</translation>
+ <translation>Terjadi sebuah kesalahan</translation>
</message>
<message>
<source>Warning</source>
@@ -505,13 +358,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Notifikasi Jaringan</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -527,7 +373,7 @@
</message>
<message>
<source>Amount:</source>
- <translation>Nilai:</translation>
+ <translation>Jumlah:</translation>
</message>
<message>
<source>Priority:</source>
@@ -538,12 +384,16 @@
<translation>Biaya:</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Dust:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation>Dengan Biaya:</translation>
</message>
<message>
<source>Change:</source>
- <translation>Uang Kembali:</translation>
+ <translation>Kembalian:</translation>
</message>
<message>
<source>(un)select all</source>
@@ -551,7 +401,7 @@
</message>
<message>
<source>Tree mode</source>
- <translation>mode pohon</translation>
+ <translation>Tree mode</translation>
</message>
<message>
<source>List mode</source>
@@ -559,7 +409,15 @@
</message>
<message>
<source>Amount</source>
- <translation>Nilai</translation>
+ <translation>Jumlah</translation>
+ </message>
+ <message>
+ <source>Received with label</source>
+ <translation>Diterima dengan label</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Diterima dengan alamat</translation>
</message>
<message>
<source>Date</source>
@@ -567,7 +425,7 @@
</message>
<message>
<source>Confirmations</source>
- <translation>Konfirmasi-konfirmasi</translation>
+ <translation>Konfirmasi</translation>
</message>
<message>
<source>Confirmed</source>
@@ -577,130 +435,6 @@
<source>Priority</source>
<translation>Prioritas</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Salin alamat</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Salin label</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Salin nilai</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Menyalinkan ID transaksi</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Kunci terpakai.</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Membuka kunci terpakai</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Salin kuantitas</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Salin biaya</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Salin dengan biaya</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Salin bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Salin prioritas</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Salin uang kembali</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>terbesar</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>lebih besar</translation>
- </message>
- <message>
- <source>high</source>
- <translation>besar</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>sedang-sampai-besar</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>sedang</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>sedikit-sampai-sedang</translation>
- </message>
- <message>
- <source>low</source>
- <translation>sedikit</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>lebih sedikit</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>tersedikit</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 terkunci)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>tidak satupun</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>ya</translation>
- </message>
- <message>
- <source>no</source>
- <translation>tidak</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Boleh berbeda +/- 1 byte setiap masukan.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Makin penting transaksinya, makin kemungkinan akan termasuk dalam blok.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(tidak ada label)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>uang kembali dari %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(uang kembali)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -714,48 +448,16 @@
</message>
<message>
<source>The label associated with this address list entry</source>
- <translation>Label yang terkait dengan daftar alamat yang dimasukkan ini</translation>
+ <translation>Label yang terkait dengan daftar alamat</translation>
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation>Alamat yang terkait dengan entri buku alamat ini. Hanya dapat diubah untuk alamat pengirim.</translation>
+ <translation>Alamat yang terkait dengan daftar alamat. Hanya dapat diubah untuk alamat pengirim.</translation>
</message>
<message>
<source>&amp;Address</source>
<translation>&amp;Alamat</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Alamat menerima baru</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Alamat mengirim baru</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Ubah alamat menerima</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Ubah alamat mengirim</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Alamat yang dimasukkan "%1" sudah ada di dalam buku alamat.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Alamat yang dimasukkan "%1" bukan alamat Bitcoin yang benar.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Tidak dapat membuka dompet.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Pembuatan kunci baru gagal.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -769,30 +471,30 @@
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation>Direktori masih ada. Tambahlah %1 kalau ingin membuat direktori baru disini.</translation>
+ <translation>Direktori masih ada. Tambahlah %1 apabila Anda ingin membuat direktori baru disini.</translation>
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation>Masih ada Path, dan path itu bukan direktori.</translation>
+ <translation>Sudah ada path, dan itu bukan direktori.</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
- <translation>Tidak busa membuat direktori untuk data disini.</translation>
+ <translation>Tidak bisa membuat direktori data disini.</translation>
</message>
</context>
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>versi</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Mengenai Bitcoin Core</translation>
+ <source>(%1-bit)</source>
+ <translation>(%1-bit)</translation>
+ </message>
+ <message>
+ <source>Command-line options</source>
+ <translation>Pilihan Command-line</translation>
</message>
<message>
<source>Usage:</source>
@@ -800,9 +502,33 @@
</message>
<message>
<source>command-line options</source>
- <translation>pilihan perintah-baris</translation>
+ <translation>pilihan command-line</translation>
</message>
-</context>
+ <message>
+ <source>UI Options:</source>
+ <translation>Pilihan UI:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Pilih direktori data saat memulai (default: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Pilih bahasa, contoh "id_ID" (default: system locale)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Start minimized</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Pilih sertifikat root SSL untuk permintaan pembayaran {default: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Tampilkan layar kilat saat memulai (default: %u)</translation>
+ </message>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -810,30 +536,30 @@
<translation>Selamat Datang</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Selamat Datang ke Bitcoin Core</translation>
- </message>
- <message>
<source>Use the default data directory</source>
- <translation>Menggunakan direktori untuk data yang biasa.</translation>
+ <translation>Gunakan direktori data default.</translation>
</message>
<message>
<source>Use a custom data directory:</source>
- <translation>Menggunakan direktori data yang dipilih Anda:</translation>
+ <translation>Gunakan direktori pilihan Anda:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation>Kesalahan: Direktori data "%1" tidak dapat dibuat.</translation>
</message>
<message>
<source>Error</source>
- <translation>Gagal</translation>
+ <translation>Kesalahan</translation>
</message>
<message numerus="yes">
<source>%n GB of free space available</source>
- <translation><numerusform>%n GB dari ruang yang tersedia</numerusform></translation>
+ <translation><numerusform>%n GB ruang kosong tersedia.</numerusform></translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(dari %n GB yang dibutuhkan)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -842,7 +568,7 @@
</message>
<message>
<source>Open payment request from URI or file</source>
- <translation>Buka permintaan pembayaran dari URI atau arsip</translation>
+ <translation>Buka permintaan pembayaran dari URI atau data</translation>
</message>
<message>
<source>URI:</source>
@@ -850,11 +576,7 @@
</message>
<message>
<source>Select payment request file</source>
- <translation>Pilihlah arsip permintaan pembayaran</translation>
- </message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Pilihlah arsip permintaan pembayaran yang Anda ingin membuka</translation>
+ <translation>Pilih data permintaan pembayaran</translation>
</message>
</context>
<context>
@@ -868,24 +590,48 @@
<translation>&amp;Utama</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation>Ukuran cache &amp;database</translation>
+ </message>
+ <message>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
+ <source>Number of script &amp;verification threads</source>
+ <translation>Jumlah script &amp;verification threads</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside</source>
+ <translation>Terima koneksi dari luar</translation>
+ </message>
+ <message>
+ <source>Allow incoming connections</source>
+ <translation>Perbolehkan koneksi masuk</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation>Alamat IP proxy (cth. 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>Minimalisasi aplikasi ketika jendela ditutup. Ketika pilihan ini dipilih, aplikasi akan menutup seluruhnya jika anda memilih Keluar di menu yang tersedia.</translation>
+ </message>
+ <message>
+ <source>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 pihak ketika (misalnya sebuah block explorer) yang mumcul dalam tab transaksi sebagai konteks menu. %s dalam URL diganti dengan kode transaksi. URL dipisahkan dengan tanda vertikal |.</translation>
+ </message>
+ <message>
<source>Third party transaction URLs</source>
- <translation>Transaksi URLs pihak ketiga</translation>
+ <translation>URL transaksi pihak ketiga</translation>
</message>
<message>
<source>Active command-line options that override above options:</source>
- <translation>pilihan perintah-baris aktif menimpa atas pilihan-pilihan: </translation>
+ <translation>Pilihan command-line yang aktif menimpa diatas opsi: </translation>
</message>
<message>
<source>Reset all client options to default.</source>
- <translation>Reset setiap pilihan untuk pilihan biasa</translation>
+ <translation>Kembalikan semua pengaturan ke awal.</translation>
</message>
<message>
<source>&amp;Reset Options</source>
@@ -896,6 +642,10 @@
<translation>&amp;Jaringan</translation>
</message>
<message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation>(0 = auto, &lt;0 = leave that many cores free)</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation>D&amp;ompet</translation>
</message>
@@ -905,7 +655,7 @@
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation>Nyalain cara &amp;pengaturan koin</translation>
+ <translation>Perbolehkan fitur &amp;pengaturan koin</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>
@@ -924,6 +674,10 @@
<translation>Petakan port dengan &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Hubungkan ke jaringan Bitcoin melalui SOCKS5 proxy.</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>IP Proxy:</translation>
</message>
@@ -1068,53 +822,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Penanganan URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Alamat pembayaran salah %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Permintaan pembayaran ditolak</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Nilai pembayaran %1 yang diminta oleh Anda terlalu sedikit (dianggap debu).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Gagalan permintaan pembayaran</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Permintaan pembayaran telah kadaluarsa</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>Pembayaran kembali dari %1</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>Masalah berkomunikasi dengan %1: %2</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Jawaban salah dari server %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pembayaran diakui</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Gagalan permintaan dari jaringan</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1145,31 +852,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Simpan Gambaran...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Salin Gambaran</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Simpan Kode QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Gambar PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nama Klien</translation>
- </message>
- <message>
<source>N/A</source>
<translation>T/S</translation>
</message>
@@ -1190,10 +874,6 @@
<translation>Umum</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Menggunakan versi OpenSSL</translation>
- </message>
- <message>
<source>Startup time</source>
<translation>Waktu nyala</translation>
</message>
@@ -1268,10 +948,6 @@
<translation>Keluar:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Tanggal pembuatan</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Berkas catatan debug</translation>
</message>
@@ -1296,10 +972,6 @@
<translation>1 &amp;tahun</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Selamat datang di 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>
@@ -1398,18 +1070,6 @@
<source>Remove</source>
<translation>Menghapus</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Salin label</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Salin Pesan</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Salin nilai</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1429,73 +1089,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Simpan Gambaran...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Minta pembayaran ke %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informasi pembayaran</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Alamat</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Nilai</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Pesan</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Hasil URI terlalu panjang, coba kurangi label / pesan.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Gagal mengubah URI ke kode QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Tanggal</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Pesan:</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Nilai</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(tidak ada label)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(tidak ada pesan)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(tidak ada nilai)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1556,6 +1149,10 @@
<translation>Alamat uang kembali yang kustom</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Biaya Transaksi:</translation>
+ </message>
+ <message>
<source>Recommended:</source>
<translation>Disarankan</translation>
</message>
@@ -1584,6 +1181,14 @@
<translation>Hapus informasi dari form.</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Dust:</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation>Hapus &amp;Semua</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation>Saldo:</translation>
</message>
@@ -1595,94 +1200,6 @@
<source>S&amp;end</source>
<translation>K&amp;irim</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Konfirmasi pengiriman koin</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 ke %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Salin kuantitas</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Salin nilai</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Salin biaya</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Salin dengan biaya</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Salin bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Salin prioritas</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Salin uang kembali</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>Jumlah Total %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>atau</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Nilai melebihi saldo Anda.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Jumlah melebihi saldo Anda ketika biaya transaksi %1 ditambahkan.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Gagal membuat transaksi!</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>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>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Biaya yang lebih tinggi dari %1 dianggap biaya tak masuk akal.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Permintaan pembayaran telah kadaluarsa</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Awas: Alamat Bitcoin tidak sah</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(tidak ada label)</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Apakah Anda yakin ingin kirim?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>ditambahkan sebagai biaya transaksi</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1695,10 +1212,6 @@
<translation>Kirim &amp;Ke:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Masukkan label bagi alamat ini untuk menambahkannya ke buku alamat Anda</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Label:</translation>
</message>
@@ -1746,10 +1259,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core sementara dimatikan...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Kamu tidak dapat mematikan komputer sebelum jendela ini tertutup sendiri.</translation>
</message>
@@ -1805,6 +1314,10 @@
<translation>Hapus semua bidang penanda pesan</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation>Hapus &amp;Semua</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation>&amp;Verifikasi Pesan</translation>
</message>
@@ -1816,70 +1329,10 @@
<source>Reset all verify message fields</source>
<translation>Hapus semua bidang verifikasi pesan</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Tekan "Tandatangan Pesan" untuk menghasilan tanda tangan</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Alamat yang dimasukkan tidak sesuai.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Silahkan periksa alamat dan coba lagi.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Alamat itu tidak menghubungkan kunci.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Membuka kunci dompet dibatalkan.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Kunci pribadi untuk alamat itu tidak tersedia.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Menandai pesan gagal.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Pesan ditandai.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Tanda tangan tidak bisa diterjemahkan.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Mohon periksa tanda tangan dan coba kembali</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Tanda tangan tidak cocok dengan intisari pesan.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Verifikasi pesan gagal.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Pesan terverifikasi.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Pembangun Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1892,430 +1345,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Buka hingga %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>Terkonflik</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/tidak terhubung</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/belum dikonfirmasi</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 konfirmasi</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>kirim lewat %n node</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Tanggal</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Sumber</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Dibuat</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Dari</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Untuk</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>Alamat saya sendiri</translation>
- </message>
- <message>
- <source>label</source>
- <translation>label</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Kredit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>cukup tua sesudah %n blok lagi</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>tidak diterima</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debet</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Biaya Transaksi</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Nilai bersih</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Pesan:</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Komentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID Transaksi</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Pedagang</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Informasi debug</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transaksi</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Masukan</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Nilai</translation>
- </message>
- <message>
- <source>true</source>
- <translation>benar</translation>
- </message>
- <message>
- <source>false</source>
- <translation>salah</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, belum berhasil disiarkan</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Buka untuk %n blok lagi</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>tidak diketahui</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Rincian transaksi</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Jendela ini menampilkan deskripsi rinci dari transaksi tersebut</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Tanggal</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Jenis</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Buka untuk %n blok lagi</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Buka hingga %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Terkonfirmasi (%1 konfirmasi)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Blok ini tidak diterima oleh node lainnya dan kemungkinan tidak akan diterima!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Terbuat tetapi tidak diterima</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Tidak terhubung</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Belum dikonfirmasi</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Sedang dikonfirmasi (%1 dari %2 konfirmasi disarankan)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Terkonflik</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Diterima dengan</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Diterima dari</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Terkirim ke</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pembayaran ke Anda sendiri</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Tertambang</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(t/s)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Status transaksi. Arahkan ke bagian ini untuk menampilkan jumlah konfrimasi.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Tanggal dan waktu transaksi tersebut diterima.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Jenis transaksi.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Nilai dihapus dari atau ditambahkan ke saldo.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Semua</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Hari ini</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Minggu ini</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Bulan ini</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Bulan kemarin</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Tahun ini</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Jarak...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>DIterima dengan</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Terkirim ke</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Ke Anda sendiri</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Ditambang</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Lainnya</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Masukkan alamat atau label untuk mencari</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Nilai min</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Salin alamat</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Salin label</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Salin Nilai</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Menyalinkan ID transaksi</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Ubah label</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Tampilkan rincian transaksi</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Expor Histori Transaksi</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Proses Ekspor Gagal</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Proses Ekspor Berhasil</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Riwayat transaksi berhasil disimpan di %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Berkas CSV (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Terkonfirmasi</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Tanggal</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Jenis</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Alamat</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Jarak:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>ke</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Tidak ada dompet yang dibuka</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Kirim Koin</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Ekspor</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Ekspor data dalam tab sekarang ke sebuah berkas</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Cadangkan Dompet</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Data Dompet (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Cadangkgan Gagal</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Informasi dalam dompet berhasil disimpan di %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Cadangkan Berhasil </translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2346,12 +1385,12 @@
<translation>Terima hubungan dari luar (standar: 1 kalau -proxy atau -connect tidak dipilih)</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>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Tidak bisa mengikat dengan %s di computer ini. Kemungkinan Bitcoin Core sudah mulai.</translation>
+ <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>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
@@ -2446,14 +1485,6 @@
<translation>Opsi dompet:</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Harus membangun ulang database menggunakan -reindex supaya mengubah -txindex</translation>
- </message>
- <message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Tidak bisa mengunci data directory %s. Kemungkinan Bitcoin Core sudah mulai.</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Hubungkan melalui proxy SOCKS5</translation>
</message>
@@ -2462,14 +1493,6 @@
<translation>Informasi</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nilai yang salah untuk -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nilai yang salah untuk -mintxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>RPC server options:</source>
<translation>Opsi server RPC:</translation>
</message>
@@ -2510,10 +1533,6 @@
<translation>Setiap transaksi dalam dompet sedang di-'Zap'...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat rusak, tidak bisa diperbaiki</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Kata sandi untuk hubungan JSON-RPC</translation>
</message>
@@ -2522,10 +1541,6 @@
<translation>Menjalankan perintah ketika perubahan blok terbaik (%s dalam cmd digantikan oleh hash blok)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Pesan bantuan ini</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Izinkan peninjauan DNS untuk -addnote, -seednode dan -connect</translation>
</message>
@@ -2534,14 +1549,6 @@
<translation>Memuat alamat...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Gagal memuat wallet.dat: Dompet rusak</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Gagal memuat wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Alamat -proxy salah: '%s'</translation>
</message>
@@ -2550,18 +1557,6 @@
<translation>Jaringan tidak diketahui yang ditentukan dalam -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Tidak dapat menyelesaikan alamat -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Tidak dapat menyelesaikan alamat -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nilai salah untuk -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Saldo tidak mencukupi</translation>
</message>
diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts
index 5ec6e480ba..55bc9c3c82 100644
--- a/src/qt/locale/bitcoin_it.ts
+++ b/src/qt/locale/bitcoin_it.ts
@@ -26,10 +26,6 @@
<translation>C&amp;hiudi</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copia l'indirizzo</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Rimuove dalla lista l'indirizzo attualmente selezionato</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Elimina</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Scegli l'indirizzo a cui inviare bitcoin</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Scegli l'indirizzo con cui ricevere bitcoin</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>Sc&amp;egli</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Indirizzi d'invio</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Indirizzi di ricezione</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>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>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copia &amp;l'etichetta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Modifica</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Esporta Lista Indirizzi</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Testo CSV (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Esportazione Fallita.</translation>
- </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 su %1. Si prega di riprovare.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etichetta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Indirizzo</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nessuna etichetta)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Ripeti la nuova passphrase</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Cifra il portamonete</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Questa operazione necessita della passphrase per sbloccare il portamonete.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Sblocca il portamonete</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Quest'operazione necessita della passphrase per decifrare il portamonete,</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Decifra il portamonete</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Cambia la passphrase</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: 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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Attenzione: il tasto Blocco maiuscole è attivo!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Portamonete cifrato</translation>
- </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 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>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>
- <translation>Cifratura del portamonete fallita</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Cifratura del portamonete fallita a causa di un errore interno. Il portamonete non è stato cifrato.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Le passphrase inserite non corrispondono.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Sblocco del portamonete fallito</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La passphrase inserita per la decifrazione del portamonete è errata.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Decifrazione del portamonete fallita</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Netmask</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Passphrase del portamonete modificata con successo.</translation>
+ <source>Banned Until</source>
+ <translation>Bannato fino a</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -262,6 +111,10 @@
<translation>Chiudi applicazione</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Informazioni su %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Informazioni su &amp;Qt</translation>
</message>
@@ -298,14 +151,6 @@
<translation>Apri &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core client</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importazione blocchi dal disco...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Re-indicizzazione blocchi su disco...</translation>
</message>
@@ -350,10 +195,6 @@
<translation>&amp;Ricevi</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Mostra le informazioni su Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Mostra / Nascondi</translation>
</message>
@@ -390,22 +231,10 @@
<translation>Barra degli strumenti</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Richiedi pagamenti (genera codici QR e bitcoin: URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
<translation>Mostra la lista degli indirizzi di invio utilizzati</translation>
</message>
@@ -421,10 +250,6 @@
<source>&amp;Command-line options</source>
<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 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 alla rete Bitcoin attive</numerusform></translation>
@@ -537,13 +362,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Avviso di rete</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -621,150 +439,6 @@
<source>Priority</source>
<translation>Priorità</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copia l'indirizzo</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copia l'etichetta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia importo</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copia l'ID transazione</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloccare non spesi</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Sbloccare non spesi</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copia quantità</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copia commissione</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia dopo commissione</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copia byte</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia priorità</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copia trascurabile</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia resto</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>massima</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>molto alta</translation>
- </message>
- <message>
- <source>high</source>
- <translation>alta</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medio-alta</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>media</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>medio-bassa</translation>
- </message>
- <message>
- <source>low</source>
- <translation>bassa</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>molto bassa</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>minima</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloccato)</translation>
- </message>
- <message>
- <source>none</source>
- <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 di +/- %1 satoshi per input.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>sì</translation>
- </message>
- <message>
- <source>no</source>
- <translation>no</translation>
- </message>
- <message>
- <source>This means a fee of at least %1 per kB is required.</source>
- <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>
- <translation>Può variare di +/- 1 byte per input.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Le transazioni con priorità più alta hanno più probabilità di essere incluse in un blocco.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nessuna etichetta)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>resto da %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(resto)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -788,38 +462,6 @@
<source>&amp;Address</source>
<translation>&amp;Indirizzo</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nuovo indirizzo di ricezione</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nuovo indirizzo d'invio</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Modifica indirizzo di ricezione</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Modifica indirizzo d'invio</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <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 "%1" non è un indirizzo bitcoin valido.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Impossibile sbloccare il portamonete.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Generazione della nuova chiave non riuscita.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -847,10 +489,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>versione</translation>
</message>
@@ -859,10 +497,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Informazioni su Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Opzioni della riga di comando</translation>
</message>
@@ -874,24 +508,36 @@
<source>command-line options</source>
<translation>opzioni della riga di comando</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Benvenuto</translation>
+ <source>UI Options:</source>
+ <translation>Opzioni interfaccia:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Seleziona la directory dei dati all'avvio (default: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Imposta la lingua, ad esempio "it_IT" (default: locale di sistema)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Avvia ridotto a icona</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Benvenuti su Bitcoin Core.</translation>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Imposta un certificato SSL root per le richieste di pagamento (default: -system-)</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>Visto che questa è la prima volta che il programma viene lanciato, puoi scegliere dove Bitcoin Core salverà i propri dati.</translation>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Mostra schermata iniziale all'avvio (default: %u)</translation>
</message>
+ </context>
+<context>
+ <name>Intro</name>
<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 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>
+ <source>Welcome</source>
+ <translation>Benvenuto</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -902,10 +548,6 @@
<translation>Usa una cartella dati personalizzata:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Errore: La cartella dati "%1" specificata non può essere creata.</translation>
</message>
@@ -913,7 +555,15 @@
<source>Error</source>
<translation>Errore</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>GB di spazio libero disponibile</numerusform><numerusform>%n GB di spazio disponibile</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(di %nGB richiesti)</numerusform><numerusform>(%n GB richiesti)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -932,10 +582,6 @@
<source>Select payment request file</source>
<translation>Seleziona il file di richiesta di pagamento</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Seleziona il file di richiesta di pagamento da aprire</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -976,10 +622,6 @@
<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 (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>
@@ -1005,14 +647,6 @@ Per specificare più URL separarli con 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>
@@ -1065,6 +699,34 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Porta del proxy (ad es. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Utilizzata per connettersi attraverso:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Mostra se la proxy SOCKS5 fornita viene utilizzata per raggiungere i peers attraverso questo tipo di rete.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Connette alla rete Bitcoin attraverso un proxy SOCKS5 separato per Tor.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Usa un proxy SOCKS5 separato per connettersi ai peers attraverso Tor:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Finestra</translation>
</message>
@@ -1213,97 +875,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Gestione URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Indirizzo di pagamento non valido %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Richiesta di pagamento respinta</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>La rete della richiesta di pagamento non corrisponde alla rete del client.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>La richiesta di pagamento non è stata inizializzata.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>L'importo di pagamento di %1 richiesto è troppo basso (considerato come trascurabile).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Errore di richiesta di pagamento</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Impossibile avviare bitcoin: gestore click-to-pay</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>URL di recupero della Richiesta di pagamento non valido: %1</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! I parametri URI o l'indirizzo Bitcoin potrebbero non essere corretti.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Gestione del file di richiesta del pagamento</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <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>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>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Risposta errata da parte del server %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pagamento riconosciuto</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Errore di richiesta di rete</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1358,31 +929,8 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Salva Immagine...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copia Immagine</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Salva codice QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Immagine PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nome del client</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/D</translation>
</message>
@@ -1403,10 +951,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Generale</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Versione OpenSSL in uso</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Versione BerkeleyDB in uso</translation>
</message>
@@ -1435,8 +979,16 @@ Per specificare più URL separarli con 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>
+ <source>Memory Pool</source>
+ <translation>Memory Pool</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Numero attuale di transazioni</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Utilizzo memoria</translation>
</message>
<message>
<source>Received</source>
@@ -1451,10 +1003,18 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>&amp;Peer</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>Peers bannati</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>Seleziona un peer per visualizzare informazioni più dettagliate.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Whitelisted/sicuri</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Direzione</translation>
</message>
@@ -1463,6 +1023,18 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Versione</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Blocco di partenza</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Headers sincronizzati</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Blocchi sincronizzati</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>User Agent</translation>
</message>
@@ -1491,6 +1063,14 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Tempo di Ping</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>La durata di un ping attualmente in corso.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Attesa ping</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Scarto Temporale</translation>
</message>
@@ -1527,10 +1107,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Uscita:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Data di creazione</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>File log del Debug</translation>
</message>
@@ -1539,8 +1115,32 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Cancella console</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Benvenuto nella console RPC di Bitcoin Core.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Nodo Disconnesso</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Nodo Bannato perché</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;ora</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;giorno</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;settimana</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;anno</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Elimina Ban Nodo</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>
@@ -1567,6 +1167,10 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(id nodo: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>via %1</translation>
</message>
@@ -1665,18 +1269,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<source>Remove</source>
<translation>Rimuovi</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copia l'etichetta</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copia il messaggio</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'importo</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1696,73 +1288,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<source>&amp;Save Image...</source>
<translation>&amp;Salva Immagine...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Richiesta di pagamento a %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informazioni pagamento</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Indirizzo</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Importo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etichetta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Messaggio</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>L'URI risultante è troppo lungo, prova a ridurre il testo nell'etichetta / messaggio.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Errore nella codifica dell'URI nel codice QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etichetta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Messaggio</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Importo</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nessuna etichetta)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(nessun messaggio)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(nessun importo)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1883,14 +1408,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>veloce</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <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 simultaneamente a più beneficiari</translation>
</message>
@@ -1922,106 +1439,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<source>S&amp;end</source>
<translation>&amp;Invia</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Conferma l'invio di bitcoin</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 a %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copia quantità</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia importo</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copia commissione</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia dopo commissione</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copia byte</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia priorità</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia resto</translation>
- </message>
- <message>
- <source>or</source>
- <translation>o</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <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>
- </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>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 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>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>
- <translation>Attenzione: Indirizzo Bitcoin non valido</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nessuna etichetta)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Attenzione: Indirizzo per il resto sconosciuto</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copia trascurabile</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Sei sicuro di voler inviare?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>aggiunto come tassa di transazione</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2034,10 +1451,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Paga &amp;a:</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 alla rubrica</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etichetta:</translation>
</message>
@@ -2109,10 +1522,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Arresto di Bitcoin Core in corso...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Non spegnere il computer fino a quando questa finestra non si sarà chiusa.</translation>
</message>
@@ -2203,70 +1612,10 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<source>Reset all verify message fields</source>
<translation>Reimposta tutti i campi della verifica messaggio</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Clicca "Firma il messaggio" per ottenere la firma</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>L'indirizzo inserito non è valido.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Per favore controlla l'indirizzo e prova di nuovo.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>L'indirizzo bitcoin inserito non è associato a nessuna chiave.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Sblocco del portamonete annullato.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>La chiave privata per l'indirizzo inserito non è disponibile.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Firma messaggio fallita.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Messaggio firmato.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Non è stato possibile decodificare la firma.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Per favore controlla la firma e prova di nuovo.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>La firma non corrisponde al digest del messaggio.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Verifica messaggio fallita.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Messaggio verificato.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Gli sviluppatori di Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2279,508 +1628,90 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Aperto fino a %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>in conflitto</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/non confermata</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 conferme</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Stato</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, trasmesso attraverso %n nodo</numerusform><numerusform>, trasmessa attraverso %n nodi</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Sorgente</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generato</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Da</translation>
- </message>
- <message>
- <source>To</source>
- <translation>A</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>proprio indirizzo</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>sola lettura</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etichetta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Credito</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>matura tra %n blocco</numerusform><numerusform>matura tra %n blocchi</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>non accettate</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debito</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Debito totale</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Credito totale</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Commissione transazione</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Importo netto</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Messaggio</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Commento</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID della transazione</translation>
- </message>
- <message>
- <source>Merchant</source>
- <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. 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>
- <translation>Informazione di debug</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transazione</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Input</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Importo</translation>
- </message>
- <message>
- <source>true</source>
- <translation>vero</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falso</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, non è ancora stata trasmessa con successo</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Aperto per %n altro blocco</numerusform><numerusform>Aperto per altri %n blocchi</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>sconosciuto</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Dettagli sulla transazione</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Questo pannello mostra una descrizione dettagliata della transazione</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>Immaturo (%1 conferme, sarà disponibile fra %2)</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Aperto per %n altro blocco</numerusform><numerusform>Aperto per altri %n blocchi</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Aperto fino a %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <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 da alcun altro nodo e probabilmente non sarà accettato!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generati, ma non accettati</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etichetta</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Non confermata</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>In conferma (%1 di %2 conferme raccomandate)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>In conflitto</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ricevuto tramite</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Ricevuto da</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Inviato a</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pagamento a te stesso</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Ottenuto dal mining</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>sola lettura</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/d)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Stato della transazione. Passare con il mouse su questo campo per visualizzare il numero di conferme.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Data e ora in cui la transazione è stata ricevuta.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipo di transazione.</translation>
- </message>
- <message>
- <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>
- <translation>Importo rimosso o aggiunto al saldo.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Tutti</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Oggi</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Questa settimana</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Questo mese</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Il mese scorso</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Quest'anno</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Intervallo...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ricevuto tramite</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Inviato a</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>A te stesso</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Ottenuto dal mining</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Altro</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Inserisci un indirizzo o un'etichetta da cercare</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Importo minimo</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copia l'indirizzo</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copia l'etichetta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia l'importo</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copia l'ID transazione</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Modifica l'etichetta</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Mostra i dettagli della transazione</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Esporta lo storico delle transazioni</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Sola lettura</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Esportazione Fallita.</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Si è verificato un errore durante il salvataggio dello storico delle transazioni in %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Esportazione Riuscita</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Lo storico delle transazioni e' stato salvato con successo in %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Testo CSV (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confermato</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etichetta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Indirizzo</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Intervallo:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>a</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
- <translation>Unità con cui visualizzare gli importi. Clicca per selezionare un altra unità.</translation>
- </message>
-</context>
-<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Non è stato caricato alcun portamonete.</translation>
+ <translation>Unità con cui visualizzare gli importi. Clicca per selezionare un'altra unità.</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Invia Bitcoin</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Esporta</translation>
- </message>
+ <name>bitcoin-core</name>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Esporta su file i dati contenuti nella tabella corrente</translation>
+ <source>Options:</source>
+ <translation>Opzioni:</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Backup Portamonete</translation>
+ <source>Specify data directory</source>
+ <translation>Specifica la cartella dati</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Dati Portamonete (*.dat)</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Connessione ad un nodo e successiva disconnessione per recuperare gli indirizzi dei peer</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Backup Fallito</translation>
+ <source>Specify your own public address</source>
+ <translation>Specifica il tuo indirizzo pubblico</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Si è verificato un errore durante il salvataggio dei dati del portamonete in %1.</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Accetta comandi da riga di comando e JSON-RPC</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Il portamonete è stato correttamente salvato in %1.</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Se &lt;category&gt; non è specificato oppure se &lt;category&gt; = 1, mostra tutte le informazioni di debug.</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>Backup eseguito con successo</translation>
+ <source>Prune configured below the minimum of %d MiB. 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>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Opzioni:</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Prune: l'ultima sincronizzazione del wallet risulta essere oltre la riduzione dei dati. È necessario eseguire un -reindex (scaricare nuovamente la blockchain in caso di nodo pruned)</translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>Specifica la cartella dati</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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à è incompatibile con l'opzione -txindex e -rescan. Attenzione: ripristinando questa opzione l'intera blockchain dovrà essere riscaricata. (default: 0 = disabilita il pruning, &gt;%u = dimensione desiderata in MiB per i file dei blocchi)</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Connessione ad un nodo e successiva disconnessione per recuperare gli indirizzi dei peer</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Non è possibile un Rescan in modalità pruned. Sarà necessario utilizzare -reindex che farà scaricare nuovamente tutta la blockchain.</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Specifica il tuo indirizzo pubblico</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Errore: si è presentato un errore interno fatale, consulta il file debug.log per maggiori dettagli</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Accetta comandi da riga di comando e JSON-RPC</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Commissione (in %s/kB) da aggiungere alle transazioni inviate (default: %s)</translation>
</message>
<message>
- <source>Error: A fatal internal error occurred, see debug.log for details</source>
- <translation>Errore: si è presentato un errore interno fatale, consulta il file debug.log per maggiori dettagli</translation>
+ <source>Pruning blockstore...</source>
+ <translation>Pruning del blockstore...</translation>
</message>
<message>
<source>Run in the background as a daemon and accept commands</source>
<translation>Esegui in background come demone ed accetta i comandi</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Impossibile avviare il server HTTP. Dettagli nel log di debug.</translation>
+ </message>
+ <message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Accetta connessioni dall'esterno (predefinito: 1 se -proxy o -connect non sono utilizzati)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</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 di esso. Usa la notazione [host]:porta per l'IPv6</translation>
</message>
@@ -2801,20 +1732,16 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<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>
<message>
- <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <translation>Questa versione è una compilazione pre-rilascio - usala a tuo rischio - non utilizzarla per la generazione o per applicazioni di commercio</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>Il database dei blocchi contiene un blocco che sembra provenire dal futuro. Questo può essere dovuto alla data e ora del tuo computer impostate in modo scorretto. Ricostruisci il database dei blocchi se sei certo che la data e l'ora sul tuo computer siano corrette</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Impossibile associarsi a %s su questo computer. Probabilmente Bitcoin Core è già in esecuzione.</translation>
- </message>
- <message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ATTENZIONE, il numero di blocchi generati è insolitamente elevato: %d blocchi ricevuti nelle ultime %d ore (%d previsti)</translation>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation>Questa versione è una compilazione pre-rilascio - usala a tuo rischio - non utilizzarla per la generazione o per applicazioni di commercio</translation>
</message>
<message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ATTENZIONE, si consiglia di verificare la connessione di rete: %d blocchi ricevuti nelle ultime %d ore (%d previsti)</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Utilizza UPnP per mappare la porta in ascolto (default: 1 quando in ascolto e -proxy non è specificato)</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
@@ -2825,14 +1752,14 @@ Per specificare più URL separarli con una barra verticale "|".</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: 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 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>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool deve essere almeno %d MB</translation>
+ </message>
+ <message>
<source>&lt;category&gt; can be:</source>
<translation>Valori possibili per &lt;category&gt;:</translation>
</message>
@@ -2865,6 +1792,22 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Vuoi ricostruire ora il database dei blocchi?</translation>
</message>
<message>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Abilita pubblicazione hash blocco in &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Abilità pubblicazione hash transazione in &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Abilita pubblicazione blocchi raw in &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Abilita pubblicazione transazione raw in &lt;address&gt;</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Errore durante l'inizializzazione del database dei blocchi</translation>
</message>
@@ -2901,6 +1844,10 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Indirizzo -onion non valido: '%s'</translation>
</message>
<message>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Mantieni la memory pool delle transazioni al di sotto di &lt;n&gt; megabytes (default: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>Non ci sono abbastanza descrittori di file disponibili.</translation>
</message>
@@ -2929,10 +1876,26 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Specifica il file del portamonete (all'interno della cartella dati)</translation>
</message>
<message>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Ignorata opzione -benchmark non supportata, utilizzare -debug=bench.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Argomento -debugnet ignorato in quanto non supportato, usare -debug=net.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Rilevato argomento -tor non supportato, utilizzare -onion.</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>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>Il commento del User Agent (%s) contiene caratteri non sicuri.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Verifica blocchi...</translation>
</message>
@@ -2949,14 +1912,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<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>
- <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>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>
@@ -2969,10 +1924,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<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>
@@ -2989,6 +1940,10 @@ Per specificare più URL separarli con una barra verticale "|".</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 %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Le commissioni (in %s/kB) inferiori a questo valore sono considerate pari a zero per trasmissione, mining e creazione della transazione (default: %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>
@@ -3013,10 +1968,6 @@ Per specificare più URL separarli con una barra verticale "|".</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>
@@ -3041,48 +1992,24 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Accetta richieste REST pubbliche (predefinito: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Attivazione della blockchain migliore...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Impossibile risolvere indirizzo -whitebind: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Crea automaticamente il servizio Tor (default: %d)</translation>
</message>
<message>
<source>Connect through SOCKS5 proxy</source>
<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>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>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>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Importa blocchi da un file blk000??.dat esterno all'avvio</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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Importo non valido per -mintxfee=&lt;amount&gt;: '%s'</translation>
+ <source>Information</source>
+ <translation>Informazioni</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3109,12 +2036,12 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Opzioni server RPC:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>Ricostruzione dell'indice della block chain dai file blk000??.dat correnti all'avvio</translation>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Riduzione -maxconnections da %d a %d a causa di limitazioni di sistema.</translation>
</message>
<message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Ricevi e visualizza gli alerts della rete P2P (default: %u)</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Ripete la scansione della block chain per individuare le transazioni che mancano dal wallet all'avvio</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
@@ -3145,6 +2072,14 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Questo è un software sperimentale.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Password porta controllo Tor (default: empty)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Porta di controllo Tor da usare se in ascolto su onion (default: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Importo transazione troppo piccolo</translation>
</message>
@@ -3165,24 +2100,28 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Impossibile associarsi a %s su questo computer (l'associazione ha restituito l'errore %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Nome utente per connessioni JSON-RPC</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Aggiorna il wallet all'ultimo formato all'avvio</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Il portamonete necessitava di essere riscritto: riavviare Bitcoin Core per completare l'operazione</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Nome utente per connessioni JSON-RPC</translation>
</message>
<message>
<source>Warning</source>
<translation>Attenzione</translation>
</message>
<message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Imposta se operare in modalità solo blocchi (default: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Eliminazione dal portamonete di tutte le transazioni...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrotto, recupero fallito</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>Opzioni di notifica ZeroMQ</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3193,10 +2132,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Esegue un comando quando il miglior blocco cambia (%s nel cmd è sostituito dall'hash del blocco)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Questo messaggio di aiuto</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Consente interrogazioni DNS per -addnode, -seednode e -connect</translation>
</message>
@@ -3205,14 +2140,26 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Caricamento indirizzi...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee è impostato molto alto! Commissioni così alte possono venir pagate anche su una singola transazione.</translation>
+ </message>
+ <message>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee è impostato su un valore molto elevato. Questa è la commissione che si paga quando si invia una transazione.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Non mantenere le transazioni nella mempool più a lungo di &lt;n&gt; ore (default: %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Le commissioni (in %s/kB) inferiori a questo valore sono considerate pari a zero per la creazione della transazione (default: %s)</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>
@@ -3229,10 +2176,30 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Emette informazioni di debug (predefinito: %u, fornire &lt;category&gt; è opzionale)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Supporta filtraggio di blocchi e transazioni con filtri bloom (default: %u)</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>La lunghezza totale della stringa di network version (%i) eccede la lunghezza massima (%i). Ridurre il numero o la dimensione di uacomments.</translation>
+ </message>
+ <message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Cerca di mantenere il traffico in uscita al di sotto della soglia scelta (in MiB ogni 24h), 0 = nessun limite (default: %d)</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Argomento -socks non supportato. Non è più possibile impostare la versione SOCKS, solamente i proxy SOCKS5 sono supportati.</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>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Username e hash password per connessioni JSON-RPC. Il campo &lt;userpw&gt; utilizza il formato: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Uno script python standard è incluso in share/rpcuser. Questa opzione può essere specificata più volte</translation>
+ </message>
+ <message>
<source>(default: %s)</source>
<translation>(predefinito: %s)</translation>
</message>
@@ -3241,14 +2208,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Interroga sempre i DNS per ottenere gli indirizzi dei peer (predefinito: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Errore caricamento wallet.dat</translation>
- </message>
- <message>
- <source>Generate coins (default: %u)</source>
- <translation>Genera bitcoin (predefinito: %u)</translation>
- </message>
- <message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
<translation>Numero di blocchi da controllare all'avvio (predefinito: %u, 0 = tutti)</translation>
</message>
@@ -3333,18 +2292,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation>
<translation>Rete sconosciuta specificata in -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Impossibile risolvere indirizzo -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Impossibile risolvere indirizzo -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Importo non valido per -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondi insufficienti</translation>
</message>
diff --git a/src/qt/locale/bitcoin_it_IT.ts b/src/qt/locale/bitcoin_it_IT.ts
new file mode 100644
index 0000000000..f89f4bdc48
--- /dev/null
+++ b/src/qt/locale/bitcoin_it_IT.ts
@@ -0,0 +1,140 @@
+<TS language="it_IT" version="2.1">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation>Click destro per modificare indirizzo o etichetta</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation>Crea un nuovo indirizzo</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>nuovo</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>copia l'indirizzo selezionato correntemente nella clipboard di sistema</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>copia</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>chiudi </translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Cancella l'indirizzo attualmente selezionato dalla lista.</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Esportare i dati nella scheda corrente in un file</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>Esporta</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>Cancella</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Enter passphrase</source>
+ <translation>Invia passphrase</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation>Nuova passphrase</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Ripeti nuova passphrase</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>Banned Until</source>
+ <translation>bannato fino </translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation>Transazioni</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ </context>
+<context>
+ <name>Intro</name>
+ </context>
+<context>
+ <name>OpenURIDialog</name>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ </context>
+<context>
+ <name>QObject</name>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ </context>
+<context>
+ <name>SplashScreen</name>
+ </context>
+<context>
+ <name>TrafficGraphWidget</name>
+ </context>
+<context>
+ <name>TransactionDescDialog</name>
+ </context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts
index 37306da5a7..4948cc3067 100644
--- a/src/qt/locale/bitcoin_ja.ts
+++ b/src/qt/locale/bitcoin_ja.ts
@@ -26,10 +26,6 @@
<translation>é–‰ã˜ã‚‹(&amp;C)</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>アドレスをコピー (&amp;C)</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>é¸æŠžã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’一覧ã‹ã‚‰å‰Šé™¤ã™ã‚‹</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>削除(&amp;D)</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>é¸æŠž(&amp;C)</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>ã“れらã¯æ”¯æ‰•ã„ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã®ã‚ãªãŸã® 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>ã“れらã¯æ”¯æ‰•ã„ã‚’å—ã‘å–ã‚‹ãŸã‚ã®ãƒ“ットコインアドレスã§ã™ã€‚トランザクションã”ã¨ã«æ–°ã—ã„å—ã‘å–り用アドレスを作æˆã™ã‚‹ã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¾ã™ã€‚</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>ラベルをコピー (&amp;L)</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>編集 (&amp;E)</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>アドレス帳をエクスãƒãƒ¼ãƒˆ</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>CSVファイル (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>エクスãƒãƒ¼ãƒˆå¤±æ•—</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>アドレス</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ラベル無ã—)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>æ–°ã—ã„パスフレーズをもã†ä¸€åº¦</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>ウォレットを暗å·åŒ–ã™ã‚‹</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>ã“ã®æ“作ã¯ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã‚’アンロックã™ã‚‹ãŸã‚ã«ãƒ‘スフレーズãŒå¿…è¦ã§ã™ã€‚</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>ウォレットをアンロックã™ã‚‹</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>ã“ã®æ“作ã¯ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®æš—å·åŒ–解除ã®ãŸã‚ã«ãƒ‘スフレーズãŒå¿…è¦ã§ã™ã€‚</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>ウォレットã®æš—å·åŒ–を解除ã™ã‚‹</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>パスフレーズã®å¤‰æ›´</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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;ã‚ãªãŸã® Bitcoin ã¯ã™ã¹ã¦å¤±ã‚ã‚Œã¾ã™&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Wallet encrypted</source>
- <translation>ウォレットã¯æš—å·åŒ–ã•ã‚Œã¾ã—ãŸ</translation>
- </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>ウォレットã®æ–°ã—ã„パスフレーズを入力ã—ã¦ãã ã•ã„。&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>
- <translation>ウォレットã®æš—å·åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>内部エラーã«ã‚ˆã‚Šã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®æš—å·åŒ–ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚ウォレットã¯æš—å·åŒ–ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>パスフレーズãŒåŒã˜ã§ã¯ã‚ã‚Šã¾ã›ã‚“。</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>ウォレットã®ã‚¢ãƒ³ãƒ­ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>ウォレットã®æš—å·åŒ–解除ã®ãƒ‘スフレーズãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>ウォレットã®æš—å·åŒ–解除ã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>ウォレットã®ãƒ‘スフレーズã®å¤‰æ›´ãŒæˆåŠŸã—ã¾ã—ãŸã€‚</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -270,6 +111,14 @@
<translation>アプリケーションを終了</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>%1 ã«ã¤ã„㦠(&amp;A)</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>%1 ã®æƒ…報を表示</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Qt ã«ã¤ã„ã¦(&amp;Q)</translation>
</message>
@@ -282,6 +131,10 @@
<translation>オプション... (&amp;O)</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>%1 ã®è¨­å®šã‚’変更ã™ã‚‹</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>ウォレットã®æš—å·åŒ–... (&amp;E)</translation>
</message>
@@ -306,14 +159,6 @@
<translation>URI ã‚’é–‹ã (&amp;U)...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoinコア クライアント</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>ディスクã‹ã‚‰ãƒ–ロックをインãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>ディスク上ã®ãƒ–ロックã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’å†ä½œæˆä¸­...</translation>
</message>
@@ -358,10 +203,6 @@
<translation>入金 (&amp;R)</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Bitcoinコアã«é–¢ã™ã‚‹æƒ…報を表示</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>見る/隠㙠(&amp;S)</translation>
</message>
@@ -398,22 +239,10 @@
<translation>タブツールãƒãƒ¼</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin ã®ã‚³ã‚¢</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>支払ã„ã‚’è¦æ±‚ã™ã‚‹ (QRコードã¨bitcoin:ã§ã¯ã˜ã¾ã‚‹URIを生æˆã™ã‚‹)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
@@ -429,15 +258,19 @@
<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>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>ディスク上ã®ãƒ–ロックã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作æˆã—ã¦ã„ã¾ã™...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>ディスク上ã®ãƒ–ロックを処ç†ã—ã¦ã„ã¾ã™...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>利用å¯èƒ½ãªãƒ–ロックãŒã‚ã‚Šã¾ã›ã‚“...</translation>
</message>
@@ -494,6 +327,14 @@
<translation>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯æœ€æ–°ã§ã™</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>有効㪠Bitcoin ã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ オプションを見るãŸã‚ã« %1 ã®ãƒ˜ãƒ«ãƒ—メッセージを表示ã—ã¾ã™ã€‚</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 クライアント</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>追跡中...</translation>
</message>
@@ -545,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è­¦å‘Š</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -629,150 +463,6 @@
<source>Priority</source>
<translation>優先度</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>アドレスをコピーã™ã‚‹</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>ラベルをコピーã™ã‚‹</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>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>
- <message>
- <source>no</source>
- <translation>ã„ã„ãˆ</translation>
- </message>
- <message>
- <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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>%1 (%2) ã‹ã‚‰ã®ãŠã¤ã‚Š</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(ãŠã¤ã‚Š)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -796,38 +486,6 @@
<source>&amp;Address</source>
<translation>アドレス帳 (&amp;A)</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>æ–°ã—ã„入金アドレス</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>æ–°ã—ã„é€ä¿¡ã‚¢ãƒ‰ãƒ¬ã‚¹</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>入金アドレスを編集</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>é€ä¿¡ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’編集</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>入力ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ "%1" ã¯æ—¢ã«ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã«ã‚ã‚Šã¾ã™ã€‚</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>入力ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ "%1" ã¯ç„¡åŠ¹ãª Bitcoin アドレスã§ã™ã€‚</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>ウォレットをアンロックã§ãã¾ã›ã‚“ã§ã—ãŸã€‚</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>æ–°ã—ã„キーã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -855,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin ã®ã‚³ã‚¢</translation>
- </message>
- <message>
<source>version</source>
<translation>ãƒãƒ¼ã‚¸ãƒ§ãƒ³</translation>
</message>
@@ -867,8 +521,8 @@
<translation>(%1ビット)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Bitcoinコアã«ã¤ã„ã¦</translation>
+ <source>About %1</source>
+ <translation>%1 ã«ã¤ã„ã¦</translation>
</message>
<message>
<source>Command-line options</source>
@@ -882,6 +536,34 @@
<source>command-line options</source>
<translation>コマンドライン オプション</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>UIオプション:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>起動時ã«ãƒ‡ãƒ¼ã‚¿ ディレクトリをé¸ã¶ (åˆæœŸå€¤: %u)</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: %u)</source>
+ <translation>起動時ã«ã‚¹ãƒ—ラッシュ画é¢ã‚’表示ã™ã‚‹ (åˆæœŸå€¤: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>GUI ã§è¡Œã‚ã‚ŒãŸè¨­å®šã®å¤‰æ›´ã‚’å…¨ã¦ãƒªã‚»ãƒƒãƒˆ</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -890,16 +572,16 @@
<translation>よã†ã“ã</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>よã†ã“ãï¼</translation>
+ <source>Welcome to %1.</source>
+ <translation>%1 ã¸ã‚ˆã†ã“ã。</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>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>ã“ã‚Œã¯ãƒ—ログラム最åˆã®èµ·å‹•ã§ã™ã€‚%1 ãŒãƒ‡ãƒ¼ã‚¿ã‚’ä¿å­˜ã™ã‚‹å ´æ‰€ã‚’é¸æŠžã—ã¦ä¸‹ã•ã„。</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>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 ã¯ã€ãƒ“ットコインã®ãƒ–ロックãƒã‚§ãƒ¼ãƒ³ã®ã‚³ãƒ”ーをã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ä¿å­˜ã—ã¾ã™ã€‚å°‘ãªãã¨ã‚‚ %2 ギガãƒã‚¤ãƒˆã®ãƒ‡ãƒ¼ã‚¿ãŒã€ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚ãã—ã¦ãã‚Œã¯æ™‚é–“ã¨å…±ã«å¢—加ã—ã¾ã™ã€‚ã¾ãŸã‚¦ã‚©ãƒ¬ãƒƒãƒˆã‚‚ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -910,10 +592,6 @@
<translation>ä»»æ„ã®ãƒ‡ãƒ¼ã‚¿ ディレクトリを使用:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin ã®ã‚³ã‚¢</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>エラー: 指定ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª "%1" を作æˆã§ãã¾ã›ã‚“。</translation>
</message>
@@ -948,10 +626,6 @@
<source>Select payment request file</source>
<translation>支払ã„リクエストファイルをé¸æŠžã—ã¦ãã ã•ã„</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>é–‹ããŸã„支払ã„リクエストファイルをé¸æŠžã—ã¦ãã ã•ã„</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -964,6 +638,14 @@
<translation>メイン (&amp;M)</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>システムã«ãƒ­ã‚°ã‚¤ãƒ³ã—ãŸéš›ã€è‡ªå‹•çš„ã« %1 ã‚’èµ·å‹•ã™ã‚‹ã€‚</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>システムã«ãƒ­ã‚°ã‚¤ãƒ³ã—ãŸæ™‚ã« %1 ã‚’èµ·å‹• (&amp;S)</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>データベースキャッシュã®ã‚µã‚¤ã‚º (&amp;D)</translation>
</message>
@@ -992,10 +674,6 @@
<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>
@@ -1020,14 +698,6 @@
<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>
@@ -1112,6 +782,14 @@
<translation>ウインドウ (&amp;W)</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>システムトレイã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’éš ã™ (&amp;H)</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>トレイアイコンを隠ã™</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>ウインドウを最å°åŒ–ã—ãŸã‚ã¨ãƒˆãƒ¬ã‚¤ アイコンã ã‘を表示ã™ã‚‹ã€‚</translation>
</message>
@@ -1132,6 +810,10 @@
<translation>ユーザインターフェースã®è¨€èªž (&amp;l) :</translation>
</message>
<message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation>ã“ã“ã§ãƒ¦ãƒ¼ã‚¶ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®è¨€èªžã‚’設定ã§ãã¾ã™ã€‚設定をå映ã™ã‚‹ã«ã¯ %1 ã‚’å†èµ·å‹•ã—ã¾ã™ã€‚</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>é¡ã‚’表示ã™ã‚‹å˜ä½ (&amp;U) :</translation>
</message>
@@ -1256,97 +938,6 @@
</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>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>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <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>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>
- <message>
- <source>Network request error</source>
- <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ã‚¨ãƒ©ãƒ¼ã§ã™</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1401,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>ç”»åƒã‚’ä¿å­˜(&amp;S)</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>ç”»åƒã‚’コピー(&amp;C)</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>
- <source>Client name</source>
- <translation>クライアントå</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1446,14 +1014,14 @@
<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>Datadir</source>
+ <translation>データディレクトリ</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>èµ·å‹•ã—ãŸæ—¥æ™‚</translation>
</message>
@@ -1478,8 +1046,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>メモリ・プール</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æ•°</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>メモリ使用é‡</translation>
</message>
<message>
<source>Received</source>
@@ -1530,6 +1106,18 @@
<translation>ユーザエージェント</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰ %1 ã®ãƒ‡ãƒãƒƒã‚°ç”¨ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã¾ã™ã€‚ログファイルãŒå·¨å¤§ãªå ´åˆã€æ•°ç§’ã‹ã‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>文字サイズを縮å°</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>文字サイズを拡大</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>サービス</translation>
</message>
@@ -1598,10 +1186,6 @@
<translation>出力:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>ビルドã®æ—¥ä»˜</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>デãƒãƒƒã‚°ç”¨ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«</translation>
</message>
@@ -1638,8 +1222,8 @@
<translation>ノードã®banを解除ã™ã‚‹ (&amp;U)</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Bitcoin Coreã®RPCコンソールã¸ã‚ˆã†ã“ã。</translation>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>%1 ã®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>
@@ -1768,18 +1352,6 @@
<source>Remove</source>
<translation>削除</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>ラベルをコピーã™ã‚‹</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>メッセージをコピーã™ã‚‹</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>ç·é¡ã®ã‚³ãƒ”ー</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1799,73 +1371,6 @@
<source>&amp;Save Image...</source>
<translation>ç”»åƒã‚’ä¿å­˜(&amp;S)</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>%1 ã¸ã®æ”¯æ‰•ã„リクエストを行ã†</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>支払ã„情報</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>アドレス</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>ç·é¡</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ラベル</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>メッセージ</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI ãŒé•·ããªã‚ŠéŽãŽã¾ã™ã€‚ラベルやメッセージã®ãƒ†ã‚­ã‚¹ãƒˆã‚’短ãã—ã¦ãã ã•ã„。</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>QR コード用㮠URI エンコードã§ã‚¨ãƒ©ãƒ¼ã€‚</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>日付</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ラベル</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>メッセージ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>ç·é¡</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ラベル無ã—)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(メッセージãªã—)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(金é¡ãªã—)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1986,14 +1491,6 @@
<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>
@@ -2025,118 +1522,6 @@
<source>S&amp;end</source>
<translation>é€é‡‘ (&amp;E)</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>コインをé€ã‚‹ç¢ºèª</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 ã‹ã‚‰ %2</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>Copy change</source>
- <translation>釣り銭をコピー</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>åˆè¨ˆï¼šã€€%1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ã¾ãŸã¯</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>支払é¡ã¯0より大ãããªã„ã¨ã„ã‘ã¾ã›ã‚“。</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <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>
- </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>
- <source>Pay only the required fee of %1</source>
- <translation>è¦æ±‚手数料 %1 ã®ã¿ã‚’支払ã†</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>%n ブロック以内ã«æ¤œè¨¼ãŒé–‹å§‹ã•ã‚Œã‚‹ã¨äºˆæƒ³ã•ã‚Œã¾ã™ã€‚</numerusform></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>
- <message>
- <source>added as transaction fee</source>
- <translation>å–引手数料ã¨ã—ã¦è¿½åŠ ã•ã‚ŒãŸ</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2149,10 +1534,6 @@
<translation>é€ã‚Šå…ˆ(&amp;T):</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>アドレス帳ã«è¿½åŠ ã™ã‚‹ã«ã¯ã€ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãƒ©ãƒ™ãƒ«ã‚’入力ã—ã¾ã™</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>ラベル(&amp;L):</translation>
</message>
@@ -2224,8 +1605,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Coreをシャットダウンã—ã¦ã„ã¾ã™ã€‚</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 をシャットダウンã—ã¦ã„ã¾ã™...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2318,70 +1699,10 @@
<source>Reset all verify message fields</source>
<translation>入力項目ã®å†…容をã™ã¹ã¦æ¶ˆåŽ»ã—ã¾ã™</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>ç½²åを作æˆã™ã‚‹ã«ã¯"メッセージã®ç½²å"をクリック</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>ä¸æ­£ãªã‚¢ãƒ‰ãƒ¬ã‚¹ãŒå…¥åŠ›ã•ã‚Œã¾ã—ãŸã€‚</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>メッセージã®ç½²åã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>メッセージã«ç½²åã—ã¾ã—ãŸã€‚</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>ç½²åãŒãƒ‡ã‚³ãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>ç½²åを確èªã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>ç½²åã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ダイジェストã¨ä¸€è‡´ã—ã¾ã›ã‚“ã§ã—ãŸã€‚</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>メッセージã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>メッセージã¯æ¤œè¨¼ã•ã‚Œã¾ã—ãŸã€‚</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin ã®ã‚³ã‚¢</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>ビットコインコアã®é–‹ç™ºè€…</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2394,422 +1715,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>ユニット %1 ã‚’é–‹ã</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>è¡çª</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/オフライン</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/未検証</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 確èª</translation>
- </message>
- <message>
- <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>
- </message>
- <message>
- <source>Source</source>
- <translation>ソース</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>生æˆã•ã‚ŒãŸ</translation>
- </message>
- <message>
- <source>From</source>
- <translation>é€ä¿¡</translation>
- </message>
- <message>
- <source>To</source>
- <translation>å—ä¿¡</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>自分ã®ã‚¢ãƒ‰ãƒ¬ã‚¹</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>監視é™å®š</translation>
- </message>
- <message>
- <source>label</source>
- <translation>ラベル</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>クレジット</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>%n 以上ã®ãƒ–ロックãŒæº€æœŸ</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>承èªã•ã‚Œãªã‹ã£ãŸ</translation>
- </message>
- <message>
- <source>Debit</source>
- <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>
- <message>
- <source>Net amount</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>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>å–引</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>入力</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>ç·é¡</translation>
- </message>
- <message>
- <source>true</source>
- <translation>æ­£ã—ã„</translation>
- </message>
- <message>
- <source>false</source>
- <translation>æ­£ã—ããªã„</translation>
- </message>
- <message>
- <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>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>å–引ã®è©³ç´°</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>ã“ã“ã§ã¯å–引ã®è©³ç´°ã‚’表示ã—ã¦ã„ã¾ã™</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>日付</translation>
- </message>
- <message>
- <source>Type</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>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>検証ã•ã‚Œã¾ã—㟠(%1 検証済ã¿)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>ã“ã®ãƒ–ロックã¯ä»–ã®ã©ã®ãƒŽãƒ¼ãƒ‰ã«ã‚ˆã£ã¦ã‚‚å—ã‘å–られãªã„ã§ã€å¤šåˆ†å—ã‘入れられãªã„ã§ã—ょã†ï¼</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>生æˆã•ã‚Œã¾ã—ãŸãŒæ‰¿èªã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ</translation>
- </message>
- <message>
- <source>Offline</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>é€ã‚Šä¸»</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>é€ã‚Šå…ˆ</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>自分自身ã¸ã®æ”¯æ‰•ã„</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>発掘ã—ãŸ</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>監視é™å®š</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>å–引ã®çŠ¶æ³ã€‚ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®ä¸Šã«ã‚«ãƒ¼ã‚½ãƒ«ã‚’ç½®ãã¨æ¤œè¨¼ã®æ•°ã‚’表示ã—ã¾ã™ã€‚</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>å–引をå—ä¿¡ã—ãŸæ—¥æ™‚。</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>å–引ã®ç¨®é¡žã€‚</translation>
- </message>
- <message>
- <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>
- <translation>残高ã«è¿½åŠ ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸç·é¡ã€‚</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>ã™ã¹ã¦</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>今日</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>今週</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>今月</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>先月</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>今年</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>期間...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>é€ã‚Šä¸»</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>é€ã‚Šå…ˆ</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>自分自身</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>発掘ã—ãŸ</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>ãã®ä»–</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>検索ã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ãŸã¯ãƒ©ãƒ™ãƒ«ã‚’入力</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>最å°ã®é¡</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>アドレスをコピーã™ã‚‹</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>ラベルをコピーã™ã‚‹</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>ç·é¡ã®ã‚³ãƒ”ー</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>å–引 ID をコピー</translation>
- </message>
- <message>
- <source>Copy raw transaction</source>
- <translation>生トランザクションをコピー</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>ラベルã®ç·¨é›†</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>å–引ã®è©³ç´°ã‚’表示</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>トランザクション履歴をエクスãƒãƒ¼ãƒˆã™ã‚‹</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>監視é™å®š</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>エクスãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>トランザクション履歴を %1 ã¸ä¿å­˜ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>検証済ã¿</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>日付</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>タイプ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ラベル</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Helbidea</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>期間:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>ã‹ã‚‰</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2817,55 +1729,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>ウォレットãŒãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ã„ã¾ã›ã‚“</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>コインをé€ã‚‹</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>エクスãƒãƒ¼ãƒˆ (&amp;E)</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>ファイルã«ç¾åœ¨ã®ã‚¿ãƒ–ã®ãƒ‡ãƒ¼ã‚¿ã‚’エクスãƒãƒ¼ãƒˆ</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>ウォレットã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—</translation>
- </message>
- <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>
<source>Options:</source>
@@ -2892,14 +1755,6 @@
<translation>&lt;category&gt; ãŒä¸Žãˆã‚‰ã‚Œãªã‹ã£ãŸå ´åˆã‚„ &lt;category&gt; = 1 ã®å ´åˆã«ã¯ã€ã™ã¹ã¦ã®ãƒ‡ãƒãƒƒã‚°æƒ…å ±ãŒå‡ºåŠ›ã•ã‚Œã¾ã™ã€‚</translation>
</message>
<message>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
- <translation>ã²ã¨ã¤ã®ã‚¦ã‚©ãƒ¬ãƒƒãƒˆãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§ä½¿ç”¨ã™ã‚‹åˆè¨ˆæ‰‹æ•°æ–™ (%s å˜ä½) ã®æœ€å¤§å€¤ã€‚低ã™ãŽã‚‹å€¤ã‚’指定ã™ã‚‹ã¨å·¨å¤§ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ä½œæˆãŒã§ããªããªã‚Šã¾ã™ (è¦å®šå€¤: %s)</translation>
- </message>
- <message>
- <source>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>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation>剪定ãŒæœ€å°å€¤ã® %d MiB以下ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚‚ã£ã¨å¤§ããªå€¤ã‚’使用ã—ã¦ãã ã•ã„。</translation>
</message>
@@ -2940,10 +1795,34 @@
<translation>外部ã‹ã‚‰ã®æŽ¥ç¶šã‚’è¨±å¯ (åˆæœŸå€¤: -proxy ã¾ãŸã¯ -connect を使用ã—ã¦ã„ãªã„å ´åˆã¯1)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin ã®ã‚³ã‚¢</translation>
+ </message>
+ <message>
+ <source>The %s developers</source>
+ <translation>%s ã®é–‹ç™ºè€…</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee ãŒé«˜ã™ãŽã¾ã™ï¼ã“ã‚Œã¯æ‰‹æ•°æ–™ã®æŽ¨å®šæ©Ÿèƒ½ãŒåˆ©ç”¨ã§ããªã„å ´åˆã«æ”¯æ‰•ã†ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æ‰‹æ•°æ–™ã§ã™ã€‚</translation>
+ </message>
+ <message>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>å分ãªãƒ‡ãƒ¼ã‚¿ãŒè“„ç©ã•ã‚Œã¦ã„ãªã„å ´åˆã«æ‰‹æ•°æ–™æŽ¨å®šæ©Ÿèƒ½ãŒåˆ©ç”¨ã™ã‚‹æ‰‹æ•°æ–™ãƒ¬ãƒ¼ãƒˆ (%s/kB) (デフォルト: %s)</translation>
+ </message>
+ <message>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>トランザクションã®ä¸­ç¶™ã‚’è¡Œã£ã¦ã„ãªã„å ´åˆã§ã‚‚ã€ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã®ãƒ”ã‚¢ã‹ã‚‰å—ã‘å–ã£ãŸä¸­ç¶™ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯å—ã‘å–るよã†ã«ã™ã‚‹ (デフォルト: %d)</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>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>データ ディレクトリ %s ã®ãƒ­ãƒƒã‚¯ã‚’å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ãŠãらã %s ã¯å®Ÿè¡Œä¸­ã§ã™ã€‚</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>
@@ -2952,10 +1831,38 @@
<translation>MITソフトウェアライセンスã®ã‚‚ã¨ã§é…布ã•ã‚Œã¦ã„ã¾ã™ã€‚付属ã®COPYINGファイルã¾ãŸã¯&lt;http://www.opensource.org/licenses/mit-license.php&gt;ã‚’å‚ç…§ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
+ <source>Error loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>%s ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: éžHDウォレットãŒæ—¢ã«å­˜åœ¨ã™ã‚‹ãŸã‚ã€HDウォレットを有効化ã§ãã¾ã›ã‚“</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>%s ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼! ã™ã¹ã¦ã®ã‚­ãƒ¼ã¯æ­£ã—ã読ã¿å–ã‚Œã¾ã™ãŒã€å–引データやアドレス帳ã®ã‚¨ãƒ³ãƒˆãƒªãŒå¤±ã‚ã‚ŒãŸã‹ã€æ­£ã—ããªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚</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>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>ホワイトリストã®ãƒ”ã‚¢ã‹ã‚‰å—ã‘å–ã£ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«é–¢ã—ã¦ã¯ã€ãŸã¨ãˆãƒ­ãƒ¼ã‚«ãƒ«ã®ä¸­ç¶™ãƒãƒªã‚·ãƒ¼ã«é•åã—ã¦ã„ã‚‹ã¨ã—ã¦ã‚‚中継を行ã†ã‚ˆã†ã«ã™ã‚‹ (デフォルト: %d)</translation>
+ </message>
+ <message>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>時間オフセット調整値ã®ãƒ”ア中央値ã«å¯¾ã™ã‚‹æœ€å¤§ã®è¨±å®¹å€¤ã€‚ローカル時間ã®è¦‹è¾¼ã¿å€¤ã¯ã€æŽ¥ç¶šã™ã‚‹ãƒ”ã‚¢ã«ã‚ˆã‚Šå‰æ–¹ãªã„ã—後方ã¸å½±éŸ¿ã•ã‚Œã¾ã™ã€‚(åˆæœŸå€¤: %u 秒)</translation>
+ </message>
+ <message>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>ã²ã¨ã¤ã®ã‚¦ã‚©ãƒ¬ãƒƒãƒˆãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¾ãŸã¯ç”Ÿãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§ä½¿ç”¨ã™ã‚‹åˆè¨ˆæ‰‹æ•°æ–™ã®æœ€å¤§å€¤ (%s å˜ä½)。低ã™ãŽã‚‹å€¤ã‚’指定ã™ã‚‹ã¨å·¨å¤§ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ä½œæˆãŒã§ããªããªã‚Šã¾ã™ (è¦å®šå€¤: %s)</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>ã‚ãªãŸã®PCã®æ—¥ä»˜ã¨æ™‚刻ãŒæ­£ã—ã„ã“ã¨ã‚’確èªã—ã¦ä¸‹ã•ã„ï¼ ã‚‚ã—ã‚ãªãŸã®æ™‚計ãŒæ­£ã—ããªã‘れ㰠%s ãŒæ­£ç¢ºã«å‹•ä½œã—ã¾ã›ã‚“。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>%s ãŒæœ‰ç”¨ã ã¨æ„Ÿã˜ã‚‰ã‚ŒãŸæ–¹ã¯ãœã²ãƒ—ロジェクトã¸ã®è²¢çŒ®ã‚’ãŠé¡˜ã„ã—ã¾ã™ã€‚ソフトウェアã®ã‚ˆã‚Šè©³ç´°ãªæƒ…å ±ã«ã¤ã„ã¦ã¯ %s ã‚’ã”覧ãã ã•ã„。</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>
@@ -2968,22 +1875,14 @@
<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>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
+ <translation>データベースをフォークå‰ã®çŠ¶æ…‹ã«å·»ã戻ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ブロックãƒã‚§ãƒ¼ãƒ³ã‚’å†ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>リスン ãƒãƒ¼ãƒˆã®å‰²å½“ã« UPnP を使用 (åˆæœŸå€¤: リスン中ãŠã‚ˆã³-proxyãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„å ´åˆã¯1)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>警告:異常ã«å¤šãã®æ•°ã®ãƒ–ロックãŒç”Ÿæˆã•ã‚Œã¦ã„ã¾ã™ã€‚%d ブロックãŒæœ€è¿‘ %d 時間以内ã«å—ã‘å–られã¾ã—ãŸã€‚(期待値: %d)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>警告:ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。%d ブロックãŒæœ€è¿‘ %d 時間以内ã«ã«å—ã‘å–られã¾ã—ãŸã€‚(期待値: %d)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>警告: ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¯å®Œå…¨ã«åŒæ„ã—ãªã„ã¿ãŸã„ã§ã™ã€‚マイナーã¯ä½•ã‹ã®å•é¡Œã‚’経験ã—ã¦ã‚‹ã¿ãŸã„ãªã‚“ã§ã™ã€‚</translation>
</message>
@@ -2992,14 +1891,18 @@
<translation>警告: ピアーã¨å®Œå…¨ã«åŒæ„ã—ãªã„ã¿ãŸã„ã§ã™ï¼ã‚¢ãƒƒãƒ—グレードã¯å¿…è¦ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ã€ãã‚Œã¨ã‚‚ä»–ã®ãƒŽãƒ¼ãƒ‰ã¯ã‚¢ãƒƒãƒ—グレードã¯å¿…è¦ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。</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>警告: 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>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>-txindex を変更ã™ã‚‹ã«ã¯ -reindex-chainstate を使用ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’å†æ§‹ç¯‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™</translation>
+ </message>
+ <message>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s ãŒå£Šã‚Œã¦ã„ã¾ã™ã€‚復旧ã«ã‚‚失敗ã—ã¾ã—ãŸ</translation>
+ </message>
+ <message>
<source>-maxmempool must be at least %d MB</source>
<translation>-maxmempoolã¯æœ€ä½Žã§ã‚‚ %d MBå¿…è¦ã§ã™</translation>
</message>
@@ -3008,10 +1911,26 @@
<translation>&lt;category&gt;ã¯ä»¥ä¸‹ã®å€¤ã‚’指定ã§ãã¾ã™ï¼š</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>ユーザエージェント文字列ã«ã‚³ãƒ¡ãƒ³ãƒˆã‚’</translation>
+ </message>
+ <message>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>起動時ã«å£Šã‚ŒãŸã‚¦ã‚©ãƒ¬ãƒƒãƒˆã‹ã‚‰ç§˜å¯†éµã‚’復旧ã™ã‚‹ã“ã¨ã‚’試ã™</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>ブロック作æˆã‚ªãƒ—ション:</translation>
</message>
<message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>-%s アドレス '%s' を解決ã§ãã¾ã›ã‚“</translation>
+ </message>
+ <message>
+ <source>Change index out of range</source>
+ <translation>ãŠã¤ã‚Šã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒç¯„囲外ã§ã™</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>指定ã—ãŸãƒŽãƒ¼ãƒ‰ã ã‘ã«æŽ¥ç¶š</translation>
</message>
@@ -3020,6 +1939,10 @@
<translation>接続オプション:</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Copyright (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>ç ´æã—ãŸãƒ–ロック データベースãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ
</translation>
@@ -3053,6 +1976,10 @@
<translation>&lt;address&gt; ã«å¯¾ã—ã€ç”Ÿãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å…¬é–‹ã‚’有効ã«ã™ã‚‹</translation>
</message>
<message>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>メモリプール内ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ç½®æ›ã‚’有効化ã™ã‚‹ (デフォルト: %u)</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>ブロック データベースã®åˆæœŸåŒ–中ã«ã‚¨ãƒ©ãƒ¼</translation>
</message>
@@ -3061,6 +1988,22 @@
<translation>ウォレットã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç’°å¢ƒ %s åˆæœŸåŒ–エラー!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>%s 読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>%s 読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: ウォレットãŒå£Šã‚Œã¾ã—ãŸ</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>%s ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: ウォレットã®èª­ã¿è¾¼ã¿ã«ã¯ã‚ˆã‚Šæ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® %s ãŒå¿…è¦ã§ã™</translation>
+ </message>
+ <message>
+ <source>Error loading %s: You can't disable HD on a already existing HD wallet</source>
+ <translation>%s ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: HDウォレットãŒæ—¢ã«å­˜åœ¨ã™ã‚‹ãŸã‚ã€HDウォレットを無効化ã§ãã¾ã›ã‚“</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>ブロック データベースã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼</translation>
</message>
@@ -3085,14 +2028,38 @@
<translation>ä¸æ­£ãªãƒ–ロックã‚ã‚‹ã„ã¯ã€ç”Ÿæˆã•ã‚Œã¦ã„ãªã„ブロックãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã® datadir ãŒé–“é•ã£ã¦ã„ã¾ã›ã‚“ã‹?</translation>
</message>
<message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>åˆæœŸåŒ–時ã®å¥å…¨æ€§ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸã€‚%s を終了ã—ã¾ã™ã€‚</translation>
+ </message>
+ <message>
<source>Invalid -onion address: '%s'</source>
<translation>無効㪠-onion アドレス:'%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>-%s=&lt;æ•°é‡&gt; ã«å¯¾ã™ã‚‹ä¸æ­£ãªé¡: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>ä¸æ­£ãªé¡ -fallbackfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
<translation>トランザクションã®ãƒ¡ãƒ¢ãƒªãƒ»ãƒ—ールã®ç·é‡ã‚’ &lt;n&gt; メガãƒã‚¤ãƒˆä»¥ä¸‹ã«ç¶­æŒã™ã‚‹ (åˆæœŸå€¤: %u)</translation>
</message>
<message>
+ <source>Loading banlist...</source>
+ <translation>banリストを読ã¿è¾¼ã‚“ã§ã„ã¾ã™...</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>èªè¨¼ã‚¯ãƒƒã‚­ãƒ¼ã®å ´æ‰€ (デフォルト: )</translation>
+ </message>
+ <message>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>中継や採掘を行ã£ã¦ã‚‚よã„ã€sigopã‚ãŸã‚Šã®æœ€å°ãƒã‚¤ãƒˆæ•° (デフォルト: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>使用å¯èƒ½ãªãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒ—ã‚¿ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚</translation>
</message>
@@ -3101,6 +2068,14 @@
<translation>&lt;net&gt; (ipv4, ipv6 ã¾ãŸã¯ onion) ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ãƒŽãƒ¼ãƒ‰ã ã‘ã«æŽ¥ç¶šã™ã‚‹</translation>
</message>
<message>
+ <source>Print this help message and exit</source>
+ <translation>ã“ã®ãƒ˜ãƒ«ãƒ—メッセージを表示ã—終了ã™ã‚‹</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã—終了</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>剪定値ã¯è² ã®å€¤ã«è¨­å®šã§ãã¾ã›ã‚“。</translation>
</message>
@@ -3109,10 +2084,26 @@
<translation>剪定モードã¯-txindexã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>ãƒã‚§ã‚¤ãƒ³çŠ¶æ…‹ãŠã‚ˆã³ãƒ–ロックインデックスをディスク上㮠blk*.dat ファイルã‹ã‚‰å†æ§‹ç¯‰ã™ã‚‹</translation>
+ </message>
+ <message>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>æ—¢ã«ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã•ã‚ŒãŸãƒ–ロックã‹ã‚‰ãƒã‚§ã‚¤ãƒ³çŠ¶æ…‹ã‚’å†æ§‹ç¯‰ã™ã‚‹</translation>
+ </message>
+ <message>
+ <source>Rewinding blocks...</source>
+ <translation>ブロックを巻ã戻ã—ã¦ã„ã¾ã™...</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 cost (default: %d)</source>
+ <translation>最大ブロックコストを設定 (åˆæœŸå€¤: %d)</translation>
+ </message>
+ <message>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>最大ブロックサイズをãƒã‚¤ãƒˆã§è¨­å®š (åˆæœŸå€¤: %d)</translation>
</message>
@@ -3121,6 +2112,14 @@
<translation>ウォレットã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’指定 (データ・ディレクトリã®ä¸­ã«)</translation>
</message>
<message>
+ <source>The source code is available from %s.</source>
+ <translation>ソースコード㯠%s より入手å¯èƒ½ã§ã™ã€‚</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>ã“ã®ã‚³ãƒ³ãƒ”ュータ㮠%s ã«ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ãŠãらã %s ã¯æ—¢ã«å®Ÿè¡Œã•ã‚Œã¦ã„ã¾ã™ã€‚</translation>
+ </message>
+ <message>
<source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„引数 -benchmark ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸã€‚-debug=bench を使用ã—ã¦ãã ã•ã„。</translation>
</message>
@@ -3153,16 +2152,16 @@
<translation>財布 %s ã¯ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª%sã®å¤–ã«ã‚ã‚Šã¾ã™</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>ウォレットオプション:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>ウォレットã®ãƒ‡ãƒãƒƒã‚°ãƒ»ãƒ†ã‚¹ãƒˆç”¨ã‚ªãƒ—ション:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>警告: ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“。アップグレードãŒå¿…è¦ã§ã™ï¼</translation>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>ウォレットãŒæ›¸ãç›´ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã—ãŸ: 完了ã™ã‚‹ãŸã‚ã« %s ã‚’å†èµ·å‹•ã—ã¾ã™</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>-txindex を変更ã™ã‚‹ã«ã¯ -reindex を使用ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’å†æ§‹ç¯‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™</translation>
+ <source>Wallet options:</source>
+ <translation>ウォレットオプション:</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>
@@ -3177,10 +2176,6 @@
<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>
@@ -3225,10 +2220,6 @@
<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>
@@ -3237,6 +2228,10 @@
<translation>ã“ã®è£½å“ã¯OpenSSLプロジェクトã«ã‚ˆã‚Šé–‹ç™ºã•ã‚ŒãŸã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’OpenSSLツールキットã¨ã—ã¦åˆ©ç”¨ã—ã¦ã„ã¾ã™ &lt;https://www.openssl.org/&gt;。ã¾ãŸã€Eric Youngæ°ã«ã‚ˆã‚Šé–‹ç™ºã•ã‚ŒãŸæš—å·ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã€Thomas Bernardæ°ã«ã‚ˆã‚Šæ›¸ã‹ã‚ŒãŸUPnPソフトウェアを用ã„ã¦ã„ã¾ã™ã€‚</translation>
</message>
<message>
+ <source>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation>BIP32 ã«å¾“ã£ãŸéšŽå±¤çš„決定性éµç”Ÿæˆæ–¹å¼ (HD) を利用ã—ã¾ã™ã€‚ウォレットã®ç”Ÿæˆæ™‚ãªã„ã—最åˆã«èµ·å‹•ã—ãŸæ™‚ã«ã®ã¿æœ‰åŠ¹ã§ã™ã€‚</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>
@@ -3253,38 +2248,14 @@
<translation>公開 REST リクエストを許å¯ã™ã‚‹ (åˆæœŸå€¤: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>最優良ã®ãƒã‚§ã‚¤ãƒ³ã‚’有効化ã—ã¦ã„ã¾ã™...</translation>
- </message>
- <message>
- <source>Always relay transactions received from whitelisted peers (default: %d)</source>
- <translation>ホワイトリストã«ã‚るピアã‹ã‚‰å—ã‘å–ã£ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’常ã«ãƒªãƒ¬ãƒ¼ã™ã‚‹ (åˆæœŸå€¤: %d)</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>起動時ã«å£Šã‚ŒãŸ wallet.dat ã‹ã‚‰ç§˜å¯†éµã‚’復旧ã™ã‚‹ã“ã¨ã‚’試ã™</translation>
- </message>
- <message>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation>Tor秘匿サービスを自動的ã«ä½œæˆã™ã‚‹ (åˆæœŸå€¤: %d)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>-whitebind アドレス '%s' を解決ã§ãã¾ã›ã‚“</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>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>
@@ -3297,22 +2268,6 @@
<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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <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>
@@ -3337,14 +2292,6 @@
<translation>RPCサーãƒã®ã‚ªãƒ—ション:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>起動時ã«ç¾åœ¨ã® blk000??.dat ファイルã‹ã‚‰ãƒ–ロック ãƒã‚§ãƒ¼ãƒ³ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’å†æ§‹ç¯‰</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>P2Pãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚¢ãƒ©ãƒ¼ãƒˆã®å—ã‘å–ã‚Šã¨è¡¨ç¤ºã‚’行ㆠ(デフォルト: %u)</translation>
- </message>
- <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation>システム上ã®åˆ¶ç´„ã‹ã‚‰ã€-maxconnections ã‚’ %d ã‹ã‚‰ %d ã«å‰Šæ¸›ã—ã¾ã—ãŸã€‚</translation>
</message>
@@ -3417,14 +2364,14 @@
<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: unknown new rules activated (versionbit %i)</source>
+ <translation>警告: 未知ã®æ–°ã—ã„ルールãŒæœ‰åŠ¹åŒ–ã•ã‚Œã¾ã—㟠(ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ“ット %i)</translation>
+ </message>
+ <message>
<source>Whether to operate in a blocks only mode (default: %u)</source>
<translation>ブロックé™å®šãƒ¢ãƒ¼ãƒ‰ã«ãŠã„ã¦å‹•ä½œã‚’è¡Œã†ã‹ã©ã†ã‹ (åˆæœŸå€¤: %u)</translation>
</message>
@@ -3437,10 +2384,6 @@
<translation>ZeroMQ通知オプション:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat ãŒå£Šã‚Œã€å¾©æ—§ã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>JSON-RPC 接続ã®ãƒ‘スワード</translation>
</message>
@@ -3449,10 +2392,6 @@
<translation>最良ã®ãƒ–ロックã«å¤‰æ›´ã™ã‚‹éš›ã«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行 (cmd ã® %s ã¯ãƒ–ロック ãƒãƒƒã‚·ãƒ¥ã«ç½®æ›ã•ã‚Œã‚‹)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>ã“ã®ãƒ˜ãƒ«ãƒ— メッセージ</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>-addnode, -seednode 㨠-connect 㧠DNS ルックアップを許å¯ã™ã‚‹</translation>
</message>
@@ -3461,10 +2400,6 @@
<translation>アドレスを読ã¿è¾¼ã‚“ã§ã„ã¾ã™...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
@@ -3481,8 +2416,8 @@
<translation>mempool内ã§ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’ &lt;n&gt; 時間以上ä¿æŒã—ãªã„ (åˆæœŸå€¤: %u)</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>wallet.dat ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼! ã™ã¹ã¦ã®ã‚­ãƒ¼ã¯æ­£ã—ã読ã¿å–ã‚Œã¾ã™ãŒã€å–引データやアドレス帳ã®ã‚¨ãƒ³ãƒˆãƒªãŒå¤±ã‚ã‚ŒãŸã‹ã€æ­£ã—ããªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>トランザクション作æˆã®éš›ã€ã“ã®å€¤æœªæº€ã®æ‰‹æ•°æ–™ (%s/kBå˜ä½) ã¯ã‚¼ãƒ­ã§ã‚ã‚‹ã¨ã¿ãªã™ (デフォルト: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3501,6 +2436,10 @@
<translation>デãƒãƒƒã‚°æƒ…報を出力ã™ã‚‹ (åˆæœŸå€¤: %u, &lt;category&gt; ã®æŒ‡å®šã¯ä»»æ„ã§ã™)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Bloomフィルタã«ã‚ˆã‚‹ã€ãƒ–ロックãŠã‚ˆã³ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã‚’有効化ã™ã‚‹ (åˆæœŸå€¤: %u)</translation>
+ </message>
+ <message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³æ–‡å­— (%i) ã®é•·ã•ãŒæœ€å¤§ã®é•·ã• (%i) を超ãˆã¦ã„ã¾ã™ã€‚UAコメントã®æ•°ã‚„é•·ã•ã‚’削減ã—ã¦ãã ã•ã„。</translation>
</message>
@@ -3513,24 +2452,32 @@
<translation>サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„引数 -socks ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚SOCKSãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®è¨­å®šã¯ã§ããªã„よã†ã«ãªã‚Šã¾ã—ãŸã€‚SOCKS5プロキシã®ã¿ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚</translation>
</message>
<message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„引数 -whitelistalwaysrelay ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸã€‚-whitelistrelay ã¾ãŸã¯ -whitelistforcerelay を利用ã—ã¦ãã ã•ã„</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>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>JSON-RPC接続時ã®ãƒ¦ãƒ¼ã‚¶åã¨ãƒãƒƒã‚·ãƒ¥åŒ–ã•ã‚ŒãŸãƒ‘スワード。&lt;userpw&gt; フィールドã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯ &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;。標準的㪠Python スクリプト㌠share/rpcuser 内ã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã¯è¤‡æ•°å›žæŒ‡å®šã§ãã¾ã™ã€‚</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>DNS ルックアップを通ã—ã¦ãƒ”アアドレスを常ã«å•ã„åˆã‚ã›ã‚‹ (åˆæœŸå€¤: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>警告: 未知ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ–ロックãŒæŽ¡æŽ˜ã•ã‚Œã¾ã—ãŸã€‚未知ã®ãƒ«ãƒ¼ãƒ«ãŒå°Žå…¥ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>wallet.dat 読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>警告: ウォレットファイルãŒç ´æã—ã¦ã„ã¾ã—ãŸã®ã§ãƒ‡ãƒ¼ã‚¿ã‚’復旧ã—ã¾ã—ãŸï¼å…ƒã® %s 㯠%s ã¨ã—㦠%s ã«ä¿å­˜ã•ã‚Œã¾ã—ãŸ; 残高やトランザクションãŒæ­£ã—ããªã„å ´åˆã«ã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒã—ã¦ãã ã•ã„。</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>ã‚³ã‚¤ãƒ³ã‚’ç”Ÿæˆ (åˆæœŸå€¤: %u)</translation>
+ <source>(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>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3617,18 +2564,6 @@
<translation>-onlynet ã§æŒ‡å®šã•ã‚ŒãŸ '%s' ã¯æœªçŸ¥ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã™</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>-bind ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ '%s' を解決ã§ãã¾ã›ã‚“</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>-externalip ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ '%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>
@@ -3638,7 +2573,7 @@
</message>
<message>
<source>Add a node to connect to and attempt to keep the connection open</source>
- <translation>接続ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’追加ã—接続をæŒç¶šã™ã‚‹ã‚ˆã†ã«è©¦ã—ã¾ã™</translation>
+ <translation>接続ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’追加ã—接続をä¿æŒã—ã¾ã™</translation>
</message>
<message>
<source>Loading wallet...</source>
diff --git a/src/qt/locale/bitcoin_ka.ts b/src/qt/locale/bitcoin_ka.ts
index 68666cfb25..80508be8ee 100644
--- a/src/qt/locale/bitcoin_ka.ts
+++ b/src/qt/locale/bitcoin_ka.ts
@@ -22,10 +22,6 @@
<translation>&amp;დáƒáƒ®áƒ£áƒ áƒ•áƒ</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;მისáƒáƒ›áƒáƒ áƒ—ის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ის წáƒáƒ¨áƒšáƒ სიიდáƒáƒœ</translation>
</message>
@@ -41,69 +37,6 @@
<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>&amp;áƒáƒ áƒ©áƒ”ვáƒ</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>ეს áƒáƒ áƒ˜áƒ¡ თქვენი 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>ეს áƒáƒ áƒ˜áƒ¡ თქვენი Bitcoin-მისáƒáƒ›áƒáƒ áƒ—ები გáƒáƒ“áƒáƒ®áƒ“ების მისáƒáƒ¦áƒ”ბáƒáƒ“. რეკáƒáƒ›áƒ”ნდებულირყáƒáƒ•áƒ”ლი ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒáƒ—ვის áƒáƒ®áƒáƒšáƒ˜ მიღების მისáƒáƒ›áƒáƒ áƒ—ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>ნიშნუ&amp;ლის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>რ&amp;ედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>მისáƒáƒ›áƒáƒ áƒ—ების სიის ექსპáƒáƒ áƒ¢áƒ˜</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>CSV-ფáƒáƒ˜áƒšáƒ˜ (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ექსპáƒáƒ áƒ¢áƒ˜ ვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>ნიშნული</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>მისáƒáƒ›áƒáƒ áƒ—ი</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნიშნული)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -123,82 +56,6 @@
<source>Repeat new passphrase</source>
<translation>გáƒáƒ˜áƒ›áƒ”áƒáƒ áƒ”თ áƒáƒ®áƒáƒšáƒ˜ ფრáƒáƒ–áƒ-პáƒáƒ áƒáƒšáƒ˜</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ თქვენი სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ ფრáƒáƒ–áƒ-პáƒáƒ áƒáƒšáƒ¡ სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ თქვენი სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ ფრáƒáƒ–áƒ-პáƒáƒ áƒáƒšáƒ¡ სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¨áƒ˜áƒ¤áƒ áƒáƒ“.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>ფრáƒáƒ–áƒ-პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლáƒ</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>ყურáƒáƒ“ღებáƒ: ჩáƒáƒ áƒ—ულირCaps Lock რეჟიმი!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ” დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜áƒ</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>ვერ მáƒáƒ®áƒ”რხდრსáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ ვერ მáƒáƒ®áƒ”რხდრსისტემáƒáƒ¨áƒ˜ შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ. თქვენი სáƒáƒ¤áƒ£áƒšáƒ” áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ¨áƒ¤áƒ áƒ£áƒšáƒ˜.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>ფრáƒáƒ–áƒ-პáƒáƒ áƒáƒšáƒ”ბი áƒáƒ  ემთხვევრერთმáƒáƒœáƒ”თს.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ ვერ მáƒáƒ®áƒ”რხდáƒ</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒœáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ˜áƒ¡ ფრáƒáƒ–áƒ-პáƒáƒ áƒáƒšáƒ˜ áƒáƒ áƒáƒ¬áƒáƒ áƒ˜áƒ</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒœáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ ვერ მáƒáƒ®áƒ”რხდáƒ</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ ფრáƒáƒ–áƒ-პáƒáƒ áƒáƒšáƒ˜ შეცვლილიáƒ.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -278,10 +135,6 @@
<translation>&amp;URI-ის გáƒáƒ®áƒ¡áƒœáƒ...</translation>
</message>
<message>
- <source>Importing blocks from disk...</source>
- <translation>ბლáƒáƒ™áƒ”ბის იმპáƒáƒ áƒ¢áƒ˜ დისკიდáƒáƒœ...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>დისკზე ბლáƒáƒ™áƒ”ბის რეინდექსáƒáƒªáƒ˜áƒ...</translation>
</message>
@@ -362,18 +215,10 @@
<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-კáƒáƒ“ები დრbitcoin: ბმულები)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>Bitcoin Core-ს შეს&amp;áƒáƒ®áƒ”ბ</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>გáƒáƒ›áƒáƒ§áƒ”ნებული გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ებისრდრნიშნულების სიის ჩვენებáƒ</translation>
</message>
@@ -390,10 +235,6 @@
<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-ს დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრBitcoin-ის სáƒáƒ™áƒáƒ›áƒáƒœáƒ“რსტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბი áƒáƒžáƒªáƒ˜áƒ”ბის სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“</translation>
- </message>
- <message>
<source>No block source available...</source>
<translation>ბლáƒáƒ™áƒ”ბის წყáƒáƒ áƒ მიუწვდáƒáƒ›áƒ”ლიáƒ...</translation>
</message>
@@ -451,13 +292,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>ქსელური გáƒáƒœáƒ’áƒáƒ¨áƒ˜</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -519,130 +353,6 @@
<source>Priority</source>
<translation>პრიáƒáƒ áƒ˜áƒ¢áƒ”ტი</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>მისáƒáƒ›áƒáƒ áƒ—ის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>ნიშნულის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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 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>
- <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>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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>ხურდრ%1-დáƒáƒœ (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(ხურდáƒ)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -666,38 +376,6 @@
<source>&amp;Address</source>
<translation>მის&amp;áƒáƒ›áƒáƒ áƒ—ი</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>áƒáƒ®áƒáƒšáƒ˜ მიღების მისáƒáƒ›áƒáƒ áƒ—ი</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>მიღების მისáƒáƒ›áƒáƒ áƒ—ის შეცვლáƒ</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის შეცვლáƒ</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>მისáƒáƒ›áƒáƒ áƒ—ი "%1" უკვე áƒáƒ áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ების წიგნში.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>შეყვáƒáƒœáƒ˜áƒšáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი "%1" áƒáƒ  áƒáƒ áƒ˜áƒ¡ ვáƒáƒšáƒ˜áƒ“ური Bitcoin-მისáƒáƒ›áƒáƒ áƒ—ი.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ ვერ მáƒáƒ®áƒ”რხდáƒ.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ¡áƒáƒ¦áƒ”ბის გენერირებრვერ მáƒáƒ®áƒ”რხდáƒ</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -725,18 +403,10 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>ვერსიáƒ</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Bitcoin Core-ს შესáƒáƒ®áƒ”ბ</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>კáƒáƒ›áƒáƒœáƒ“ების ზáƒáƒšáƒ˜áƒ¡ áƒáƒžáƒªáƒ˜áƒ”ბი</translation>
</message>
@@ -748,7 +418,7 @@
<source>command-line options</source>
<translation>კáƒáƒ›áƒáƒœáƒ“ების ზáƒáƒšáƒ˜áƒ¡ áƒáƒžáƒªáƒ˜áƒ”ბი</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -756,14 +426,6 @@
<translation>მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბით</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბáƒáƒ— Bitcoin Core.</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>Use the default data directory</source>
<translation>ნáƒáƒ’ულისხმევი კáƒáƒ¢áƒáƒšáƒáƒ’ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ</translation>
</message>
@@ -772,10 +434,6 @@
<translation>მითითებული კáƒáƒ¢áƒáƒšáƒáƒ’ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error</source>
<translation>შეცდáƒáƒ›áƒ</translation>
</message>
@@ -798,10 +456,6 @@
<source>Select payment request file</source>
<translation>გáƒáƒ“áƒáƒ®áƒ“ის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვáƒ</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>გáƒáƒ“áƒáƒ®áƒ“ის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვრგáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -986,61 +640,6 @@
</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>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>ვერ გáƒáƒ˜áƒ¨áƒ•áƒ bitcoin: click-to-pay</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ გáƒáƒ“áƒáƒ®áƒ“ის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ URL: %1</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>გáƒáƒ“áƒáƒ®áƒ“ის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>áƒáƒ áƒáƒ•áƒ”რიფიცირებული გáƒáƒ“áƒáƒ®áƒ“ის მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბი გáƒáƒ“áƒáƒ®áƒ“ის სáƒáƒ›áƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლრსკრიპტებისáƒáƒ—ვის áƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>დáƒáƒ‘რუნებრ%1-სáƒáƒ’áƒáƒœ</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>
- </message>
- <message>
- <source>Network request error</source>
- <translation>ქსელური მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -1063,31 +662,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <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>
- <source>Client name</source>
- <translation>კლიენტი</translation>
- </message>
- <message>
<source>N/A</source>
<translation>მიუწვდ.</translation>
</message>
@@ -1108,10 +684,6 @@
<translation>სáƒáƒ”რთáƒ</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>OpenSSL-ის ვერსიáƒ</translation>
- </message>
- <message>
<source>Startup time</source>
<translation>სტáƒáƒ áƒ¢áƒ˜áƒ¡ დრáƒ</translation>
</message>
@@ -1168,10 +740,6 @@
<translation>გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>შექმნის დრáƒ</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>დáƒáƒ®áƒ•áƒ”წის ლáƒáƒ’-ფáƒáƒ˜áƒšáƒ˜</translation>
</message>
@@ -1274,18 +842,6 @@
<source>Remove</source>
<translation>წáƒáƒ¨áƒšáƒ</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>ნიშნულის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>მესიჯის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>თáƒáƒœáƒ®áƒ˜áƒ¡ კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1305,73 +861,6 @@
<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>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>მისáƒáƒ›áƒáƒ áƒ—ი</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>თáƒáƒœáƒ®áƒ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ნიშნული</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>მესიჯი</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI ძáƒáƒšáƒ˜áƒáƒœ გრძელი გáƒáƒ›áƒáƒ“ის, შეáƒáƒ›áƒáƒ™áƒšáƒ”თ ნიშნულის/მესიჯის ტექსტი.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>შედáƒáƒ›áƒ URI-ის QR-კáƒáƒ“ში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡áƒáƒ¡.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>თáƒáƒ áƒ˜áƒ¦áƒ˜</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ნიშნული</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>მესიჯი</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>თáƒáƒœáƒ®áƒ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნიშნული)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(მესიჯები áƒáƒ  áƒáƒ áƒ˜áƒ¡)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(თáƒáƒœáƒ®áƒ áƒáƒ  áƒáƒ áƒ˜áƒ¡)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1432,6 +921,10 @@
<translation>ხურდის მისáƒáƒ›áƒáƒ áƒ—ი</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ¤áƒáƒ¡áƒ£áƒ áƒ˜ - სáƒáƒ™áƒáƒ›áƒ˜áƒ¡áƒ˜áƒ:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>გáƒáƒ’ზáƒáƒ•áƒœáƒ რáƒáƒ›áƒ“ენიმე რეციპიენტთáƒáƒœ ერთდრáƒáƒ£áƒšáƒáƒ“</translation>
</message>
@@ -1459,82 +952,6 @@
<source>S&amp;end</source>
<translation>გáƒáƒ’&amp;ზáƒáƒ•áƒœáƒ</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>მáƒáƒœáƒ”ტების გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1-დáƒáƒœ %2-ში</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>Copy change</source>
- <translation>ხურდის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>or</source>
- <translation>áƒáƒœ</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>გáƒáƒ“áƒáƒ®áƒ“ის მáƒáƒªáƒ£áƒšáƒáƒ‘რ0-ზე მეტი უნდრიყáƒáƒ¡</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>თáƒáƒœáƒ®áƒ áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბრთქვენს ბáƒáƒšáƒáƒœáƒ¡áƒ¡</translation>
- </message>
- <message>
- <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>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>Are you sure you want to send?</source>
- <translation>დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბული ხáƒáƒ áƒ—, რáƒáƒ› გინდáƒáƒ— გáƒáƒ’ზáƒáƒ•áƒœáƒ?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>დáƒáƒ›áƒáƒ¢áƒ”ბულირსáƒáƒ™áƒáƒ›áƒ˜áƒ¡áƒ˜áƒ</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1547,10 +964,6 @@
<translation>áƒáƒ“რესáƒ&amp;ტი:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>შეიყვáƒáƒœáƒ”თ áƒáƒ› მისáƒáƒ›áƒáƒ áƒ—ის ნიშნული მისáƒáƒ›áƒáƒ áƒ—ების წიგნში დáƒáƒ¡áƒáƒ›áƒáƒ¢áƒ”ბლáƒáƒ“</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>ნიშნუ&amp;ლი:</translation>
</message>
@@ -1602,10 +1015,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core იხურებáƒ...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>áƒáƒ  გáƒáƒ›áƒáƒ áƒ—áƒáƒ— კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რი áƒáƒ› ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ გáƒáƒ¥áƒ áƒáƒ‘áƒáƒ›áƒ“ე.</translation>
</message>
@@ -1680,70 +1089,10 @@
<source>Reset all verify message fields</source>
<translation>ვერიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ ყველრველის წáƒáƒ¨áƒšáƒ</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>ხელმáƒáƒ¬áƒ”რის გენერირებისáƒáƒ—ვის დáƒáƒáƒ­áƒ˜áƒ áƒ”თ "მესიჯის ხელმáƒáƒ¬áƒ”რáƒ"-ს</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>შეყვáƒáƒœáƒ˜áƒšáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>ვერ მáƒáƒ®áƒ”რხდრმესიჯის ხელმáƒáƒ¬áƒ”რáƒ.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>მესიჯი ხელმáƒáƒ¬áƒ”რილიáƒ.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>ხელმáƒáƒ¬áƒ”რის დეკáƒáƒ“ირებრვერ ხერხდებáƒ.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ ხელმáƒáƒ¬áƒ”რრდრსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>ხელმáƒáƒ¬áƒ”რრáƒáƒ  შეესáƒáƒ‘áƒáƒ›áƒ”ბრმესიჯის დáƒáƒ˜áƒ¯áƒ”სტს.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>მესიჯის ვერიფიკáƒáƒªáƒ˜áƒ ვერ მáƒáƒ®áƒ”რხდáƒ.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>მესიჯი ვერიფიცირებულიáƒ.</translation>
- </message>
</context>
<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>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1756,426 +1105,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>ღირიქნებრსáƒáƒœáƒáƒ› %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/გáƒáƒ—იშულიáƒ</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/დáƒáƒ£áƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბელიáƒ</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბულიáƒ</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>სტáƒáƒ¢áƒ£áƒ¡áƒ˜</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>თáƒáƒ áƒ˜áƒ¦áƒ˜</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>წყáƒáƒ áƒ</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>გენერირებულიáƒ</translation>
- </message>
- <message>
- <source>From</source>
- <translation>გáƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜</translation>
- </message>
- <message>
- <source>To</source>
- <translation>მიმღები</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი</translation>
- </message>
- <message>
- <source>label</source>
- <translation>ნიშნული</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>კრედიტი</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>დებიტი</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ¤áƒáƒ¡áƒ£áƒ áƒ˜ - სáƒáƒ™áƒáƒ›áƒ˜áƒ¡áƒ˜áƒ</translation>
- </message>
- <message>
- <source>Net amount</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>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>ხáƒáƒ áƒ¯áƒ”ბი</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>თáƒáƒœáƒ®áƒ</translation>
- </message>
- <message>
- <source>true</source>
- <translation>ჭეშმáƒáƒ áƒ˜áƒ¢áƒ˜</translation>
- </message>
- <message>
- <source>false</source>
- <translation>მცდáƒáƒ áƒ˜</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, დáƒáƒ’ზáƒáƒ•áƒœáƒ áƒáƒ  áƒáƒ áƒ˜áƒ¡ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>უცნáƒáƒ‘იáƒ</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ დეტáƒáƒšáƒ”ბი</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¬áƒ•áƒ áƒ˜áƒšáƒ”ბითი áƒáƒ¦áƒ¬áƒ”რილáƒáƒ‘áƒ</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>თáƒáƒ áƒ˜áƒ¦áƒ˜</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>ტიპი</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>áƒáƒ  áƒáƒ áƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒ˜áƒ¤áƒ”ბული (%1 დáƒáƒ¡áƒ¢áƒ£áƒ áƒ˜, სáƒáƒ­áƒ˜áƒ áƒáƒ სულ %2)</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>ღირიქნებრსáƒáƒœáƒáƒ› %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბულირ(%1დáƒáƒ¡áƒ¢áƒ£áƒ áƒ˜)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>ეს ბლáƒáƒ™áƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡ მიღებული áƒáƒ áƒªáƒ”რთი კვáƒáƒœáƒ«áƒ˜áƒ¡ მიერ დრსáƒáƒ•áƒáƒ áƒáƒ£áƒ“áƒáƒ“ უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>გენერირებულიáƒ, მáƒáƒ’რáƒáƒ› უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ</translation>
- </message>
- <message>
- <source>Offline</source>
- <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>დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბულირ(%1, რეკáƒáƒ›áƒ”ნდებულირ%2)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>შემáƒáƒ¡áƒ£áƒšáƒ˜áƒ</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>გáƒáƒ›áƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>გáƒáƒ“áƒáƒ®áƒ“ილირსáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ თáƒáƒ•áƒ˜áƒ¡áƒáƒ—ვის</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>მáƒáƒžáƒáƒ•áƒ”ბულიáƒ</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(მიუწვდ.)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜. ველზე კურსáƒáƒ áƒ˜áƒ¡ შეყვáƒáƒœáƒ˜áƒ¡áƒáƒ¡ გáƒáƒ›áƒáƒ©áƒœáƒ“ებრდáƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒ.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ მიღების თáƒáƒ áƒ˜áƒ¦áƒ˜ დრდრáƒ.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ტიპი.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>ბáƒáƒšáƒáƒœáƒ¡áƒ˜áƒ“áƒáƒœ მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜ áƒáƒœ დáƒáƒ›áƒáƒ¢áƒ”ბული თáƒáƒœáƒ®áƒ.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>ყველáƒ</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>დღეს</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>áƒáƒ› კვირის</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>áƒáƒ› თვის</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>ბáƒáƒšáƒ თვის</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>áƒáƒ› წლის</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>შუáƒáƒšáƒ”დი...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>შემáƒáƒ¡áƒ£áƒšáƒ˜áƒ</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ თáƒáƒ•áƒ˜áƒ¡áƒáƒ—ვის</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>მáƒáƒžáƒáƒ•áƒ”ბულიáƒ</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>სხვáƒ</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>შეიყვáƒáƒœáƒ”თ სáƒáƒ«áƒ”ბნი მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒœ ნიშნული</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>მინ. თáƒáƒœáƒ®áƒ</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>მისáƒáƒ›áƒáƒ áƒ—ის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>ნიშნულის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ”ბის ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ექსპáƒáƒ áƒ¢áƒ˜</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ექსპáƒáƒ áƒ¢áƒ˜ ვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>შეცდáƒáƒ›áƒ %1-ში ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ”ბის შენáƒáƒ®áƒ•áƒ˜áƒ¡ მცდელáƒáƒ‘ისáƒáƒ¡.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბულიáƒ</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>თáƒáƒ áƒ˜áƒ¦áƒ˜</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>ტიპი</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>ნიშნული</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>მისáƒáƒ›áƒáƒ áƒ—ი</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>შუáƒáƒšáƒ”დი:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>-</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>áƒáƒ  áƒáƒ áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული სáƒáƒ¤áƒ£áƒšáƒ”.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>მáƒáƒœáƒ”ტების გáƒáƒ’ზáƒáƒ•áƒœáƒ</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;ექსპáƒáƒ áƒ¢áƒ˜</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>áƒáƒ› ბáƒáƒ áƒáƒ—იდáƒáƒœ მáƒáƒœáƒáƒªáƒ”მების ექსპáƒáƒ áƒ¢áƒ˜ ფáƒáƒ˜áƒšáƒ¨áƒ˜</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ áƒ”ბáƒ</translation>
- </message>
- <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>
<source>Options:</source>
@@ -2206,6 +1145,10 @@
<translation>გáƒáƒ áƒ”დáƒáƒœ შეერთებების დáƒáƒ¨áƒ•áƒ”ბრ(ნáƒáƒ’ულისხმევი: 1 თუ áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრ-proxy áƒáƒœ -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</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>
@@ -2226,10 +1169,6 @@
<translation>ყურáƒáƒ“ღებáƒ: ჩვენ áƒáƒ  ვეთáƒáƒœáƒ®áƒ›áƒ”ბით ყველრპირს. შესáƒáƒ«áƒšáƒáƒ თქვენ áƒáƒœ სხვრკვáƒáƒœáƒ«áƒ”ბს გáƒáƒœáƒáƒ®áƒšáƒ”ბრგჭირდებáƒáƒ—.</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>ყურáƒáƒ“ღებáƒ: wallet.dat დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ! áƒáƒ áƒ˜áƒ’ინáƒáƒšáƒ£áƒ áƒ˜ wallet.dat შენáƒáƒ®áƒ£áƒšáƒ˜áƒ რáƒáƒ’áƒáƒ áƒª wallet.{timestamp}.bak %s-ში; თუ შეáƒáƒ›áƒ©áƒœáƒ˜áƒ”თ უზუსტáƒáƒ‘რნáƒáƒ¨áƒ—ში áƒáƒœ ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ”ბში, áƒáƒ¦áƒáƒ“გინეთ áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ“áƒáƒœ.</translation>
- </message>
- <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;category&gt; შეიძლებრიყáƒáƒ¡:</translation>
</message>
@@ -2314,10 +1253,6 @@
<translation>სფულის áƒáƒžáƒªáƒ˜áƒ”ბი:</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>სáƒáƒ­áƒ˜áƒ áƒáƒ ბáƒáƒ–ის ხელáƒáƒ®áƒáƒšáƒ˜ áƒáƒ’ებáƒ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ -reindex რáƒáƒ—რშეცვáƒáƒšáƒáƒ— -txindex</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>ბრძáƒáƒœáƒ”ბის შესრულებრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ უწყების მიღებისáƒáƒ¡ áƒáƒœ რáƒáƒªáƒ შეინიშნებრსáƒáƒ’რძნáƒáƒ‘ი გáƒáƒ®áƒšáƒ”ჩრ(cmd-ში %s შეიცვლებრმესიჯით)</translation>
</message>
@@ -2330,14 +1265,6 @@
<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>
@@ -2374,10 +1301,6 @@
<translation>ტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ”ბის ჩáƒáƒ®áƒ¡áƒœáƒ სáƒáƒ¤áƒ£áƒšáƒ˜áƒ“áƒáƒœ...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ, áƒáƒ¦áƒ“გენრვერ მáƒáƒ®áƒ”რხდáƒ</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>პáƒáƒ áƒáƒšáƒ˜ JSON-RPC-შეერთებისáƒáƒ—ვის</translation>
</message>
@@ -2386,10 +1309,6 @@
<translation>კáƒáƒ›áƒáƒœáƒ“ის შესრულებრუკეთესი ბლáƒáƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ©áƒ”ნისáƒáƒ¡ (%s კáƒáƒ›áƒáƒœáƒ“áƒáƒ¨áƒ˜ ჩáƒáƒœáƒáƒªáƒ•áƒšáƒ“ებრბლáƒáƒ™áƒ˜áƒ¡ ჰეშით)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>ეს ტექსტი</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>DNS-ძებნის დáƒáƒ¨áƒ•áƒ”ბრ-addnode, -seednode დრ-connect-სáƒáƒ—ვის</translation>
</message>
@@ -2398,14 +1317,6 @@
<translation>მისáƒáƒ›áƒáƒ áƒ—ების ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>áƒáƒ  იტვირთებრwallet.dat: სáƒáƒ¤áƒ£áƒšáƒ” დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>áƒáƒ  იტვირთებრwallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ მისáƒáƒ›áƒáƒ áƒ—ი -proxy: '%s'</translation>
</message>
@@ -2414,18 +1325,6 @@
<translation>-onlynet-ში მითითებულირუცნáƒáƒ‘ი ქსელი: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>ვერ ხერხდებრ-bind მისáƒáƒ›áƒáƒ áƒ—ის გáƒáƒ áƒ™áƒ•áƒ”ვáƒ: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>ვერ ხერხდებრ-externalip მისáƒáƒ›áƒáƒ áƒ—ის გáƒáƒ áƒ™áƒ•áƒ”ვáƒ: '%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_kk_KZ.ts b/src/qt/locale/bitcoin_kk_KZ.ts
index 4de8f1b57e..ff02521264 100644
--- a/src/qt/locale/bitcoin_kk_KZ.ts
+++ b/src/qt/locale/bitcoin_kk_KZ.ts
@@ -25,25 +25,6 @@
<source>&amp;Delete</source>
<translation>Жою</translation>
</message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Үтірмен бөлінген текÑÑ‚ (*.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>таңба</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(таңбаÑыз)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -59,31 +40,7 @@
<source>Repeat new passphrase</source>
<translation>Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөзді қайта енгізу</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>ӘмиÑнді шифрлау</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Бұл операциÑÑÑ‹ бойынша Ñіздің әмиÑнізді қоршаудан шығару үшін әмиÑнның Ò›Ò±Ð¿Ð¸Ñ Ñөзі керек</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>ӘмиÑнізді қоршаудан шығару</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Бұл операциÑÑÑ‹ бойынша Ñіздің әмиÑнізді шифрлап таÑтау үшін әмиÑнның Ò›Ò±Ð¿Ð¸Ñ Ñөзі керек</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>ӘмиÑнізді шифрлап таÑтау</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>ÒšÒ±Ð¿Ð¸Ñ Ñөзді өзгерту</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -175,9 +132,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
@@ -219,22 +173,18 @@
<source>Priority</source>
<translation>БаÑымдық</translation>
</message>
- <message>
- <source>no</source>
- <translation>жоқ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(таңбаÑыз)</translation>
- </message>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
+ <source>&amp;Label</source>
+ <translation>таңба</translation>
+ </message>
+ <message>
<source>&amp;Address</source>
<translation>ÐдреÑ</translation>
</message>
- </context>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -253,14 +203,15 @@
</context>
<context>
<name>OptionsDialog</name>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>ӘмиÑн</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -271,47 +222,21 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
+ <message>
+ <source>&amp;Information</source>
+ <translation>ИнформациÑ</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
<message>
- <source>Amount</source>
+ <source>&amp;Amount:</source>
<translation>Саны</translation>
</message>
- <message>
- <source>Label</source>
- <translation>таңба</translation>
- </message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Күні</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>таңба</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Саны</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(таңбаÑыз)</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -335,13 +260,13 @@
<source>Dust:</source>
<translation>Шаң</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation>(таңбаÑыз)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation>Саны</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -356,70 +281,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Date</source>
- <translation>Күні</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Саны</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Күні</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>таңба</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Үтірмен бөлінген файл (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>РаÑÑ‚Ñ‹Ò›</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Күні</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>таңба</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>ЭкÑпорт</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Information</source>
diff --git a/src/qt/locale/bitcoin_ko_KR.ts b/src/qt/locale/bitcoin_ko_KR.ts
index 81677b4732..012632c0e0 100644
--- a/src/qt/locale/bitcoin_ko_KR.ts
+++ b/src/qt/locale/bitcoin_ko_KR.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>&amp;New</source>
- <translation>새 항목(N)</translation>
+ <translation>새 항목(&amp;N)</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -19,15 +19,11 @@
</message>
<message>
<source>&amp;Copy</source>
- <translation>복사</translation>
+ <translation>복사(&amp;C)</translation>
</message>
<message>
<source>C&amp;lose</source>
- <translation>닫기 (L)</translation>
- </message>
- <message>
- <source>&amp;Copy Address</source>
- <translation>주소 복사(&amp;C)</translation>
+ <translation>닫기(&amp;L)</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -39,78 +35,11 @@
</message>
<message>
<source>&amp;Export</source>
- <translation>&amp;내보내기</translation>
+ <translation>내보내기(&amp;E)</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>ì„ íƒí•˜ê¸° (H)</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>
- <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>편집&amp;</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>주소 ëª©ë¡ ë‚´ë³´ë‚´ê¸°</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>쉼표로 êµ¬ë¶„ëœ íŒŒì¼(*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>내보내기 실패</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>주소</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ë¼ë²¨ ì—†ìŒ)</translation>
+ <translation>삭제(&amp;D)</translation>
</message>
</context>
<context>
@@ -131,95 +60,23 @@
<source>Repeat new passphrase</source>
<translation>새로운 암호 재확ì¸</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>지갑 암호화</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>ì´ ìž‘ì—…ì„ ì‹¤í–‰í•˜ë ¤ë©´ ì‚¬ìš©ìž ì§€ê°‘ì˜ ì•”í˜¸ê°€ 필요합니다.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>지갑 잠금해제</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>ì´ ìž‘ì—…ì€ ì§€ê°‘ì„ í•´ë…하기 위해 ì‚¬ìš©ìž ì§€ê°‘ì˜ ì•”í˜¸ê°€ 필요합니다.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>지갑 í•´ë…</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>암호 변경</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>경고: Caps Lock키가 켜져있습니다!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>지갑 암호화 완료</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>ì§€ê°‘ì˜ ê¸°ì¡´ 암호와 새로운 암호를 입력해주세요.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>지갑 암호화 실패</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>지갑 암호화는 내부 ì—러로 ì¸í•´ 실패했습니다. ë‹¹ì‹ ì˜ ì§€ê°‘ì€ ì•”í˜¸í™” ë˜ì§€ 않았습니다.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>지정한 암호가 ì¼ì¹˜í•˜ì§€ 않습니다.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>ì§€ê°‘ì„ ì—´ì§€ 못했습니다.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>지갑 í•´ë…ì„ ìœ„í•œ 암호가 틀렸습니다.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>지갑 í•´ë…ì— ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤.</translation>
+ <source>IP/Netmask</source>
+ <translation>IP주소/넷마스í¬</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>지갑 비밀번호가 성공ì ìœ¼ë¡œ 변경ë˜ì—ˆìŠµë‹ˆë‹¤.</translation>
+ <source>Banned Until</source>
+ <translation>다ìŒê³¼ ê°™ì€ ìƒí™©ì´ ë  ë•Œê¹Œì§€ 계정 정지ë©ë‹ˆë‹¤.</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
- <translation>메시지 서명&amp;...</translation>
+ <translation>메시지 서명(&amp;M)...</translation>
</message>
<message>
<source>Synchronizing with network...</source>
@@ -227,7 +84,7 @@
</message>
<message>
<source>&amp;Overview</source>
- <translation>&amp;개요</translation>
+ <translation>개요(&amp;O)</translation>
</message>
<message>
<source>Node</source>
@@ -239,7 +96,7 @@
</message>
<message>
<source>&amp;Transactions</source>
- <translation>&amp;거래</translation>
+ <translation>거래(&amp;T)</translation>
</message>
<message>
<source>Browse transaction history</source>
@@ -251,11 +108,11 @@
</message>
<message>
<source>Quit application</source>
- <translation>ì ìš© 중단</translation>
+ <translation>어플리케ì´ì…˜ 종료</translation>
</message>
<message>
<source>About &amp;Qt</source>
- <translation>Qt ì •ë³´(&amp;Q)</translation>
+ <translation>&amp;Qt ì •ë³´</translation>
</message>
<message>
<source>Show information about Qt</source>
@@ -263,39 +120,31 @@
</message>
<message>
<source>&amp;Options...</source>
- <translation>&amp;옵션</translation>
+ <translation>옵션(&amp;O)</translation>
</message>
<message>
<source>&amp;Encrypt Wallet...</source>
- <translation>지갑 암호화&amp;...</translation>
+ <translation>지갑 암호화(&amp;E)...</translation>
</message>
<message>
<source>&amp;Backup Wallet...</source>
- <translation>지갑 백업&amp;...</translation>
+ <translation>지갑 백업(&amp;B)...</translation>
</message>
<message>
<source>&amp;Change Passphrase...</source>
- <translation>암호문 변경&amp;...</translation>
+ <translation>암호문 변경(&amp;C)...</translation>
</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>
- <translation>URI&amp;열기...</translation>
- </message>
- <message>
- <source>Bitcoin Core client</source>
- <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´ í´ë¼ì´ì–¸íŠ¸</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>디스í¬ì—ì„œ ë¸”ë¡ ê°€ì ¸ì˜¤ëŠ” 중...</translation>
+ <translation>&amp;URI 열기...</translation>
</message>
<message>
<source>Reindexing blocks on disk...</source>
@@ -315,7 +164,7 @@
</message>
<message>
<source>&amp;Debug window</source>
- <translation>디버그 창&amp;</translation>
+ <translation>디버그 창(&amp;D)</translation>
</message>
<message>
<source>Open debugging and diagnostic console</source>
@@ -323,7 +172,7 @@
</message>
<message>
<source>&amp;Verify message...</source>
- <translation>메시지 확ì¸&amp;...</translation>
+ <translation>메시지 확ì¸(&amp;V)...</translation>
</message>
<message>
<source>Bitcoin</source>
@@ -342,10 +191,6 @@
<translation>받기(&amp;R)</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´ì— ê´€í•œ 정보입니다.</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>ë³´ì´ê¸°/숨기기(&amp;S)</translation>
</message>
@@ -367,33 +212,25 @@
</message>
<message>
<source>&amp;File</source>
- <translation>&amp;파ì¼</translation>
+ <translation>파ì¼(&amp;F)</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation>&amp;설정</translation>
+ <translation>설정(&amp;S)</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation>&amp;ë„움ë§</translation>
+ <translation>ë„움ë§(&amp;H)</translation>
</message>
<message>
<source>Tabs toolbar</source>
<translation>툴바 색ì¸í‘œ</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>지불 요청하기 (QR코드와 비트코ì¸ì´ ìƒì„±ë©ë‹ˆë‹¤: URIs)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;ë¹„íŠ¸ì½”ì¸ ì½”ì–´ 소개</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>한번 ì´ìƒ ì‚¬ìš©ëœ ë³´ë‚´ëŠ” 주소와 주소 ì œëª©ì˜ ëª©ë¡ì„ ë³´ì—¬ì¤ë‹ˆë‹¤.</translation>
</message>
@@ -407,17 +244,21 @@
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>명령어-ë¼ì¸ 옵션</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>
- <translation>사용할 수 있는 ë¹„íŠ¸ì½”ì¸ ëª…ë ¹ì–´ 옵션 목ë¡ì„ 가져오기 위해 Bitcoin-Qt ë„ì›€ë§ ë©”ì‹œì§€ë¥¼ 표시합니다.</translation>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network</source>
+ <translation><numerusform>ë¹„íŠ¸ì½”ì¸ ë„¤íŠ¸ì›Œí¬ì— %nê°œì˜ ì—°ê²°ì´ í™œì„±í™”ë˜ì–´ 있습니다.</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></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n시간</numerusform></translation>
</message>
@@ -517,13 +358,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>ë„¤íŠ¸ì›Œí¬ ê²½ê³ </translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -575,7 +409,15 @@
</message>
<message>
<source>Amount</source>
- <translation>거래량</translation>
+ <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>
@@ -593,119 +435,7 @@
<source>Priority</source>
<translation>우선순위</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>주소 복사하기</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>표 복사하기</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>거래량 복사</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>거래 ì•„ì´ë”” 복사</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>bytes 복사</translation>
- </message>
- <message>
- <source>Copy priority</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>
- <message>
- <source>no</source>
- <translation>아니요</translation>
- </message>
- <message>
- <source>This means a fee of at least %1 per kB is required.</source>
- <translation>ì´ ì˜ë¯¸ëŠ” 수수료가 최소한 %1 per 키로바ì´íŠ¸ 필요합니다</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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>~로부터 변경 %1 (%2)</translation>
- </message>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -714,47 +444,19 @@
</message>
<message>
<source>&amp;Label</source>
- <translation>&amp;표</translation>
+ <translation>ë¼ë²¨(&amp;L)</translation>
</message>
<message>
<source>The label associated with this address list entry</source>
<translation>현재 ì„ íƒëœ 주소 í•„ë“œì˜ ì œëª©ìž…ë‹ˆë‹¤. </translation>
</message>
<message>
- <source>&amp;Address</source>
- <translation>&amp;주소</translation>
- </message>
- <message>
- <source>New receiving address</source>
- <translation>새로 받는 주소</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>새로 보내는 주소</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>받는 주소 편집</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>보내는 주소 편집</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>ìž…ë ¥ëœ ì£¼ì†ŒëŠ”"%1" ì´ë¯¸ 주소ë¡ì— 있습니다.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>입력한 "%1" 주소는 올바른 ë¹„íŠ¸ì½”ì¸ ì£¼ì†Œê°€ 아닙니다.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>ì§€ê°‘ì„ ì—´ 수 없습니다.</translation>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation>본 ì£¼ì†Œë¡ ìž…ë ¥ì€ ì£¼ì†Œì™€ 연계ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ê²ƒì€ 보내는 주소들ì—서만 변경ë ìˆ˜ 있습니다.</translation>
</message>
<message>
- <source>New key generation failed.</source>
- <translation>새로운 키 ìƒì„±ì´ 실패하였습니다</translation>
+ <source>&amp;Address</source>
+ <translation>주소(&amp;A)</translation>
</message>
</context>
<context>
@@ -783,10 +485,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´</translation>
- </message>
- <message>
<source>version</source>
<translation>버전</translation>
</message>
@@ -795,10 +493,6 @@
<translation>(%1-비트)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´ 소개</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>명령줄 옵션</translation>
</message>
@@ -810,24 +504,36 @@
<source>command-line options</source>
<translation>명령줄 옵션</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>환ì˜í•©ë‹ˆë‹¤</translation>
+ <source>UI Options:</source>
+ <translation>UI 옵션:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>실행시 ë°ì´í„° í´ë” ì„ íƒí•˜ê¸° (기본값: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>"ko_KR"와 ê°™ì´ ì–¸ì–´ë¥¼ 설정하십시오 (기본값: 시스템 로캘)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>ìµœì†Œí™”ëœ ìƒíƒœì—ì„œ 시작</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´ì— ì˜¤ì‹ ê²ƒì„ í™˜ì˜í•©ë‹ˆ.</translation>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>지불 ìš”ì²­ì„ ìœ„í•œ SSL 루트 ì¸ì¦ì„œ 설정 (기본값: -system-)</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>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>실행시 시작화면 보기 (기본값: %u)</translation>
</message>
+ </context>
+<context>
+ <name>Intro</name>
<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>ë¹„íŠ¸ì½”ì¸ ì½”ì–´ê°€ 블럭체ì¸ì˜ ë³µì‚¬ë³¸ì„ ë‹¤ìš´ë¡œë“œ 저장합니다. ì ì–´ë„ %1GBì˜ ë°ì´í„°ê°€ ì´ í´ë”ì— ì €ìž¥ë˜ë©° ì‹œê°„ì´ ê²½ê³¼í• ìˆ˜ë¡ ì ì°¨ ì¦ê°€í•©ë‹ˆë‹¤. 그리고 지갑 ë˜í•œ ì´ í´ë”ì— ì €ìž¥ë©ë‹ˆë‹¤. </translation>
+ <source>Welcome</source>
+ <translation>환ì˜í•©ë‹ˆë‹¤</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -838,14 +544,22 @@
<translation>커스텀 ë°ì´í„° í´ë” 사용:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´</translation>
+ <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>
@@ -864,16 +578,12 @@
<source>Select payment request file</source>
<translation>지불 요청 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>지불 요청 파ì¼ì„ 열기 위해서 ì„ íƒí•˜ì„¸ìš”</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
<message>
<source>Options</source>
- <translation>ì„ íƒë“¤</translation>
+ <translation>환경설정</translation>
</message>
<message>
<source>&amp;Main</source>
@@ -881,7 +591,7 @@
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation>ë°ì´í„°ë² ì´ìŠ¤ ìºì‹œ í¬ê¸°</translation>
+ <translation>ë°ì´í„°ë² ì´ìŠ¤ ìºì‹œ í¬ê¸°(&amp;D)</translation>
</message>
<message>
<source>MB</source>
@@ -889,7 +599,7 @@
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation>스í¬ë¦½íŠ¸ ì¸ì¦ ì“°ë ˆë“œì˜ ê°œìˆ˜</translation>
+ <translation>스í¬ë¦½íŠ¸ ì¸ì¦ ì“°ë ˆë“œì˜ ê°œìˆ˜(&amp;V)</translation>
</message>
<message>
<source>Accept connections from outside</source>
@@ -901,7 +611,15 @@
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
- <translation>프ë¡ì‹œ ì•„ì´í”¼ 주소(예. IPv4:127.0.0.1 / IPv6: ::1)</translation>
+ <translation>프ë¡ì‹œ ì•„ì´í”¼ 주소 (예. 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>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 (예. ë¸”ë¡ íƒìƒ‰ê¸°)는 거래 íƒ­ì˜ ì»¨í…스트 ë©”ë‰´ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤. URLì˜ %s는 트랜잭션 해시값으로 대체ë©ë‹ˆë‹¤. 여러 URLs는 ìˆ˜ì§ ë°” | ì—ì„œ 나누어 집니다.</translation>
</message>
<message>
<source>Third party transaction URLs</source>
@@ -909,7 +627,7 @@
</message>
<message>
<source>Active command-line options that override above options:</source>
- <translation>명령어 ë¼ì¸ ì˜µì…˜ì„ í™œì„±í™”í•´ì„œ ì˜µì…˜ì„ ìš°íšŒí•˜ì‹œì˜¤</translation>
+ <translation>명령줄 옵션 활성화는 ìœ„ì˜ ì˜µì…˜ë“¤ì„ ëŒ€ì²´í•©ë‹ˆë‹¤:</translation>
</message>
<message>
<source>Reset all client options to default.</source>
@@ -924,8 +642,12 @@
<translation>네트워í¬(&amp;N)</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>지갑</translation>
+ <translation>지갑(&amp;A)</translation>
</message>
<message>
<source>Expert</source>
@@ -933,19 +655,23 @@
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation>ì½”ì¸ ìƒì„¸ ì œì–´ê¸°ëŠ¥ì„ í™œì„±í™”í•©ë‹ˆë‹¤ - &amp;C</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>
+ <translation>ê²€ì¦ë˜ì§€ ì•Šì€ ìž”ëˆ ì“°ê¸°ë¥¼ 비활성화하면 íŠ¸ëžœìž­ì…˜ì´ ì ì–´ë„ 1회 ì´ìƒ ê²€ì¦ë˜ê¸° 전까지 ê·¸ íŠ¸ëžœìž­ì…˜ì˜ ê±°ìŠ¤ë¦„ëˆì€ 사용할 수 없습니다. ì´ëŠ” 잔액 계산 방법ì—ë„ ì˜í–¥ì„ 미칩니다.</translation>
</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>
- <translation>ë¼ìš°í„°ì˜ ë¹„íŠ¸ì½”ì¸ í´ë¼ì´ì–¸íŠ¸ í¬íŠ¸ë¥¼ ìžë™ìœ¼ë¡œ 엽니다. ë¼ìš°í„°ì—ì„œ UPnP를 지ì›í•˜ê³  활성화 í–ˆì„ ê²½ìš°ì—만 ë™ìž‘합니다.</translation>
+ <translation>ë¼ìš°í„°ì—ì„œ Bitcoin í´ë¼ì´ì–¸íŠ¸ í¬íŠ¸ë¥¼ ìžë™ì ìœ¼ë¡œ 엽니다. ë¼ìš°í„°ì—ì„œ UPnP를 지ì›í•˜ê³  활성화 í–ˆì„ ê²½ìš°ì—만 ë™ìž‘합니다.</translation>
</message>
<message>
<source>Map port using &amp;UPnP</source>
- <translation>ì‚¬ìš©ì¤‘ì¸ UPnP í¬íŠ¸ 매핑(&amp;U)</translation>
+ <translation>ì‚¬ìš©ì¤‘ì¸ &amp;UPnP í¬íŠ¸ 매핑</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
@@ -953,11 +679,11 @@
</message>
<message>
<source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
- <translation>SOCKS5 프ë¡ì‹œë¥¼ ê±°ì³ ì—°ê²°í•©ë‹ˆë‹¤ (기본값 프ë¡ì‹œ):</translation>
+ <translation>SOCKS5 프ë¡ì‹œë¥¼ ê±°ì³ ì—°ê²°í•©ë‹ˆë‹¤(&amp;C) (기본 프ë¡ì‹œ):</translation>
</message>
<message>
<source>Proxy &amp;IP:</source>
- <translation>프ë¡ì‹œ IP(&amp;I):</translation>
+ <translation>프ë¡ì‹œ &amp;IP:</translation>
</message>
<message>
<source>&amp;Port:</source>
@@ -968,6 +694,14 @@
<translation>프ë¡ì‹œì˜ í¬íŠ¸ë²ˆí˜¸ìž…니다(예: 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>í”¼ì–´ì— ì—°ê²°í•˜ê¸° 위해 ì‚¬ìš©ëœ ë°©ë²•:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>ì´ SOCK5 프ë¡ì‹œë¥¼ 통과해 피어와 ì ‘ì†í•œ ë„¤íŠ¸ì›Œí¬ ìœ í˜•ì´ í‘œì‹œë©ë‹ˆë‹¤.</translation>
+ </message>
+ <message>
<source>IPv4</source>
<translation>IPv4</translation>
</message>
@@ -980,6 +714,14 @@
<translation>Tor</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Tor 서비스를 경유하여 ë¹„íŠ¸ì½”ì¸ ë„¤íŠ¸ì›Œí¬ì— 연결하기 위해 ë¶„ë¦¬ëœ SOCKS5 프ë¡ì‹œë¥¼ 사용.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Tor 서비스를 ì´ìš©í•˜ì—¬ 피어ì—게 연결하기 위해 ë¶„ë¦¬ëœ SOCKS5 프ë¡ì‹œ 사용</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>ì°½(&amp;W)</translation>
</message>
@@ -1040,6 +782,10 @@
<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>
@@ -1056,7 +802,7 @@
</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>
+ <translation>í‘œì‹œëœ ì •ë³´ê°€ ì˜¤ëž˜ëœ ê²ƒ 같습니다. ë¹„íŠ¸ì½”ì¸ ë„¤íŠ¸ì›Œí¬ì— 연결하고 ë‚œ 다ìŒì— ì§€ê°‘ì„ ìžë™ìœ¼ë¡œ ë™ê¸°í™” 하지만, ì•„ì§ ê³¼ì •ì´ ë나지는 않았습니다.</translation>
</message>
<message>
<source>Watch-only:</source>
@@ -1103,117 +849,83 @@
<translation>ëª¨ë‹ˆí„°ë§ ì§€ê°‘ì˜ í˜„ìž¬ 잔액</translation>
</message>
<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>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>비트코ì¸ì„ 시작할 수 없습니다: 지급제어기를 í´ë¦­í•˜ì‹œì˜¤</translation>
+ <source>Spendable:</source>
+ <translation>사용가능:</translation>
</message>
<message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>대금 ì²­êµ¬ì„œì˜ URLì´ ì˜¬ë°”ë¥´ì§€ 않습니다: %1</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>ì§€ë¶ˆì´ íŒŒì¼ ì²˜ë¦¬ë¥¼ 요청합니다</translation>
+ <source>Recent transactions</source>
+ <translation>최근 거래</translation>
</message>
<message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>ìž„ì˜ë¡œ 변경한 ê²°ì œ 스í¬ë¦½íŠ¸ ê¸°ë°˜ì˜ ëŒ€ê¸ˆ 청구서 ì–‘ì‹ì€ ê²€ì¦ë˜ê¸° 전까지는 지ì›ë˜ì§€ 않습니다.</translation>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>ëª¨ë‹ˆí„°ë§ ì§€ê°‘ì˜ ê²€ì¦ë˜ì§€ ì•Šì€ íŠ¸ëžœìž­ì…˜</translation>
</message>
<message>
- <source>Refund from %1</source>
- <translation>%1 ìœ¼ë¡œë¶€í„°ì˜ í™˜ë¶ˆ</translation>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation>ëª¨ë‹ˆí„°ë§ ì§€ê°‘ì˜ ì±„êµ´ëœ ìž”ì•¡ 중 숙성ë˜ì§€ ì•Šì€ ê²ƒ</translation>
</message>
<message>
- <source>Error communicating with %1: %2</source>
- <translation>%1ê³¼ ì†Œí†µí•˜ëŠ”ë° ì• ëŸ¬: %2</translation>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>ëª¨ë‹ˆí„°ë§ ì§€ê°‘ì˜ í˜„ìž¬ 잔액</translation>
</message>
+</context>
+<context>
+ <name>PeerTableModel</name>
<message>
- <source>Bad response from server %1</source>
- <translation>서버로 부터 ë°˜ì‘ì´ ì—†ìŠµë‹ˆë‹¤ %1</translation>
+ <source>User Agent</source>
+ <translation>유저 ì—ì´ì „트</translation>
</message>
<message>
- <source>Payment acknowledged</source>
- <translation>ì§€ë¶ˆì´ ìŠ¹ì¸ë¨</translation>
+ <source>Node/Service</source>
+ <translation>노드/서비스</translation>
</message>
<message>
- <source>Network request error</source>
- <translation>ë„¤íŠ¸ì›Œí¬ ìš”ì²­ 애러</translation>
+ <source>Ping Time</source>
+ <translation>Ping 시간</translation>
</message>
</context>
<context>
- <name>PeerTableModel</name>
- </context>
-<context>
<name>QObject</name>
<message>
<source>Amount</source>
- <translation>거래량</translation>
+ <translation>거래액</translation>
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
<translation>ë¹„íŠ¸ì½”ì¸ ì£¼ì†Œë¥¼ 입력하기 (예. %1)</translation>
</message>
<message>
- <source>%1 s</source>
- <translation>%1 ì´ˆ</translation>
+ <source>%1 d</source>
+ <translation>%1 ì¼</translation>
</message>
<message>
- <source>N/A</source>
- <translation>ì—†ìŒ</translation>
+ <source>%1 h</source>
+ <translation>%1 시간</translation>
</message>
<message>
- <source>%1 ms</source>
- <translation>%1 ms</translation>
+ <source>%1 m</source>
+ <translation>%1 분</translation>
</message>
-</context>
-<context>
- <name>QRImageWidget</name>
<message>
- <source>&amp;Save Image...</source>
- <translation>ì´ë¯¸ì§€ 저장(&amp;S)...</translation>
+ <source>%1 s</source>
+ <translation>%1 ì´ˆ</translation>
</message>
<message>
- <source>&amp;Copy Image</source>
- <translation>ì´ë¯¸ì§€ 복사(&amp;C)</translation>
+ <source>None</source>
+ <translation>ì—†ìŒ</translation>
</message>
<message>
- <source>Save QR Code</source>
- <translation>QR코드 저장</translation>
+ <source>N/A</source>
+ <translation>ì—†ìŒ</translation>
</message>
<message>
- <source>PNG Image (*.png)</source>
- <translation>PNG ì´ë¯¸ì§€(*.png)</translation>
+ <source>%1 ms</source>
+ <translation>%1 ms</translation>
</message>
</context>
<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>í´ë¼ì´ì–¸íŠ¸ ì´ë¦„</translation>
- </message>
- <message>
<source>N/A</source>
<translation>ì—†ìŒ</translation>
</message>
@@ -1223,7 +935,7 @@
</message>
<message>
<source>&amp;Information</source>
- <translation>ì •ë³´</translation>
+ <translation>ì •ë³´(&amp;I)</translation>
</message>
<message>
<source>Debug window</source>
@@ -1234,12 +946,8 @@
<translation>ì¼ë°˜</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>ì‚¬ìš©ì¤‘ì¸ OpenSSL 버전</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
- <translation>ì‚¬ìš©ì¤‘ì¸ BerkeleyDB 버전</translation>
+ <translation>사용 ì¤‘ì¸ BerkeleyDB 버전</translation>
</message>
<message>
<source>Startup time</source>
@@ -1266,6 +974,18 @@
<translation>현재 블럭 수</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation>메모리 풀</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>현재 트랜잭션 수</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>메모리 사용량</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>ë°›ìŒ</translation>
</message>
@@ -1275,13 +995,81 @@
</message>
<message>
<source>&amp;Peers</source>
- <translation>&amp;피어</translation>
+ <translation>피어(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation>ì°¨ë‹¨ëœ í”¼ì–´</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>ìžì„¸í•œ 정보를 보려면 피어를 ì„ íƒí•˜ì„¸ìš”.</translation>
+ </message>
+ <message>
+ <source>Whitelisted</source>
+ <translation>í™”ì´íŠ¸ë¦¬ìŠ¤íŠ¸ì— í¬í•¨</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>ë°©í–¥</translation>
</message>
<message>
<source>Version</source>
<translation>버전</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>ì‹œìž‘ëœ ë¸”ë¡</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>ë™ê¸°í™”ëœ í—¤ë”</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>ë™ê¸°í™”ëœ ë¸”ë¡</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation>유저 ì—ì´ì „트</translation>
+ </message>
+ <message>
+ <source>Services</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>Ping Time</source>
+ <translation>Ping 시간</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>현재 ì§„í–‰ì¤‘ì¸ PINGì— ê±¸ë¦° 시간.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Ping 대기</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation>시간 오프셋</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>최종 블럭 ì‹œê°</translation>
</message>
@@ -1295,11 +1083,11 @@
</message>
<message>
<source>&amp;Network Traffic</source>
- <translation>&amp;ë„¤íŠ¸ì›Œí¬ íŠ¸ëž˜í”½</translation>
+ <translation>ë„¤íŠ¸ì›Œí¬ íŠ¸ëž˜í”½(&amp;N)</translation>
</message>
<message>
<source>&amp;Clear</source>
- <translation>&amp;지우기</translation>
+ <translation>지우기(&amp;C)</translation>
</message>
<message>
<source>Totals</source>
@@ -1314,10 +1102,6 @@
<translation>Out:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>빌드 날짜</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>로그 íŒŒì¼ ë””ë²„ê·¸</translation>
</message>
@@ -1326,6 +1110,34 @@
<translation>콘솔 초기화</translation>
</message>
<message>
+ <source>&amp;Disconnect Node</source>
+ <translation>ëŠê¸´ 노드(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>ì¶”ë°©ëœ ë…¸ë“œ:</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1시간(&amp;H)</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1ì¼(&amp;D)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1주(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1ë…„(&amp;Y)</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>노드 추방 취소(&amp;U)</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>
@@ -1333,20 +1145,68 @@
<source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
<translation>사용할 수 있는 ëª…ë ¹ì„ ë‘˜ëŸ¬ë³´ë ¤ë©´ &lt;b&gt;help&lt;/b&gt;를 입력하십시오.</translation>
</message>
- </context>
+ <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>(node id: %1)</source>
+ <translation>(노드 ID: %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>Yes</source>
+ <translation>예</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>아니오</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>알수없ìŒ</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Amount:</source>
- <translation>&amp;거래량:</translation>
+ <translation>거래액(&amp;A):</translation>
</message>
<message>
<source>&amp;Label:</source>
- <translation>ë¼ë²¨:</translation>
+ <translation>ë¼ë²¨(&amp;L):</translation>
</message>
<message>
<source>&amp;Message:</source>
- <translation>&amp;메시지:</translation>
+ <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>
@@ -1354,7 +1214,11 @@
</message>
<message>
<source>R&amp;euse an existing receiving address (not recommended)</source>
- <translation>í˜„ìž¬ì˜ ìˆ˜ì·¨ìš© 주소를 재사용합니다만 권장하지는 않습니다. (R&amp;)</translation>
+ <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>지불 ìš”ì²­ì— ì²¨ë¶€ë˜ëŠ” ì„ íƒê°€ëŠ¥í•œ 메시지 입니다. ì´ ë©”ì„¸ì§€ëŠ” ìš”ì²­ì´ ì—´ë¦´ ë•Œ í‘œì‹œë  ê²ƒ 입니다. 메모: ì´ ë©”ì‹œì§€ëŠ” ë¹„íŠ¸ì½”ì¸ ë„¤íŠ¸ì›Œí¬ë¡œ 전송ë˜ì§€ 않습니다.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
@@ -1385,6 +1249,10 @@
<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>
@@ -1396,18 +1264,6 @@
<source>Remove</source>
<translation>삭제</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>표 복사하기</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>메시지 복사</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>거래량 복사</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1427,73 +1283,6 @@
<source>&amp;Save Image...</source>
<translation>ì´ë¯¸ì§€ 저장(&amp;S)...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>%1ì— ì§€ë¶ˆì„ ìš”ì²­í–ˆìŠµë‹ˆë‹¤</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>지불 정보</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>주소</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>거래량</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>표</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>메시지</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI 결과가 너무 길ìŒ, í‘œ/ë©”ì„¸ì§€ì˜ ê¸€ì„ ì¤„ì´ë„ë¡ í•˜ì„¸ìš”.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>QR코드 ì¸ì½”딩 오류</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>날짜</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>표</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>메시지</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>거래량</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ë¼ë²¨ ì—†ìŒ)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(메세지가 없습니다)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(거래량 ì—†ìŒ)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1527,7 +1316,7 @@
</message>
<message>
<source>Amount:</source>
- <translation>거래량:</translation>
+ <translation>거래액:</translation>
</message>
<message>
<source>Priority:</source>
@@ -1546,6 +1335,10 @@
<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>
@@ -1554,135 +1347,107 @@
<translation>거래 수수료:</translation>
</message>
<message>
- <source>Recommended:</source>
- <translation>권장:</translation>
+ <source>Choose...</source>
+ <translation>ì„ íƒ í•˜ê¸°...</translation>
</message>
<message>
- <source>Send to multiple recipients at once</source>
- <translation>ë‹¤ìˆ˜ì˜ ìˆ˜ë ¹ì¸ë“¤ì—게 í•œë²ˆì— ë³´ë‚´ê¸°</translation>
- </message>
- <message>
- <source>Add &amp;Recipient</source>
- <translation>ìˆ˜ë ¹ì¸ ì¶”ê°€í•˜ê¸°</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;A)</translation>
- </message>
- <message>
- <source>Balance:</source>
- <translation>잔액:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation>전송 기능 확ì¸</translation>
+ <source>collapse fee-settings</source>
+ <translation>수수료 설정 접기</translation>
</message>
<message>
- <source>S&amp;end</source>
- <translation>보내기(&amp;E)</translation>
+ <source>per kilobyte</source>
+ <translation>킬로바ì´íŠ¸ 당</translation>
</message>
<message>
- <source>Confirm send coins</source>
- <translation>ì½”ì¸ ì „ì†¡ì„ í™•ì¸</translation>
+ <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ë°”ì´íŠ¸ ì¼ ê²½ìš° 1킬로바ì´íŠ¸ë‹¹ 250사토시만 지불ë˜ì§€ë§Œ "최소 수수료"ì—ì„  1000사토시가 지불ë©ë‹ˆë‹¤. 1킬로바ì´íŠ¸ê°€ 넘는 íŠ¸ëžœìž­ì…˜ì¸ ê²½ìš° ì–´ë– í•œ 경우ì—ë“  1킬로바ì´íŠ¸ 기준으로 지불ë©ë‹ˆë‹¤.</translation>
</message>
<message>
- <source>%1 to %2</source>
- <translation>%1ì„(를) %2(으)ë¡œ</translation>
+ <source>Hide</source>
+ <translation>숨기기</translation>
</message>
<message>
- <source>Copy quantity</source>
- <translation>수량 복사</translation>
+ <source>total at least</source>
+ <translation>최소 수수료</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>거래량 복사</translation>
+ <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>Copy fee</source>
- <translation>수수료 복사</translation>
+ <source>(read the tooltip)</source>
+ <translation>(툴íŒì„ ì½ì–´ë³´ì„¸ìš”)</translation>
</message>
<message>
- <source>Copy after fee</source>
- <translation>수수료 ì´í›„ 복사</translation>
+ <source>Recommended:</source>
+ <translation>권장:</translation>
</message>
<message>
- <source>Copy bytes</source>
- <translation>bytes 복사</translation>
+ <source>Custom:</source>
+ <translation>ì‚¬ìš©ìž ì •ì˜:</translation>
</message>
<message>
- <source>Copy priority</source>
- <translation>ìš°ì„ ë„ ë³µì‚¬</translation>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Smart feeê°€ ì•„ì§ ì´ˆê¸°í™”ë˜ì§€ 않았습니다. ë¸”ë¡ ë¶„ì„ì´ ì™„ë£Œë  ë•Œ 까지 기다려주십시오...)</translation>
</message>
<message>
- <source>or</source>
- <translation>ë˜ëŠ”</translation>
+ <source>Confirmation time:</source>
+ <translation>ìŠ¹ì¸ ì‹œê°„:</translation>
</message>
<message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>지불하는 ê¸ˆì•¡ì€ 0 보다 커야 합니다.</translation>
+ <source>normal</source>
+ <translation>ì¼ë°˜</translation>
</message>
<message>
- <source>The amount exceeds your balance.</source>
- <translation>잔고를 초과하였습니다.</translation>
+ <source>fast</source>
+ <translation>빠름</translation>
</message>
<message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>%1 ì˜ ê±°ëž˜ìˆ˜ìˆ˜ë£Œë¥¼ í¬í•¨í•˜ë©´ 잔고를 초과합니다.</translation>
+ <source>Send to multiple recipients at once</source>
+ <translation>ë‹¤ìˆ˜ì˜ ìˆ˜ë ¹ì¸ë“¤ì—게 í•œë²ˆì— ë³´ë‚´ê¸°</translation>
</message>
<message>
- <source>Transaction creation failed!</source>
- <translation>거래를 ìƒì„±í•˜ëŠ” ê²ƒì„ ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤</translation>
+ <source>Add &amp;Recipient</source>
+ <translation>ìˆ˜ë ¹ì¸ ì¶”ê°€í•˜ê¸°(&amp;R)</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>
+ <source>Clear all fields of the form.</source>
+ <translation>ì–‘ì‹ì˜ 모든 필드를 지ì›ë‹ˆë‹¤</translation>
</message>
<message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>경고: ìž˜ëª»ëœ ë¹„íŠ¸ì½”ì¸ì£¼ì†Œìž…니다</translation>
+ <source>Dust:</source>
+ <translation>ë”스트:</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(í‘œ ì—†ìŒ)</translation>
+ <source>Clear &amp;All</source>
+ <translation>ëª¨ë‘ ì§€ìš°ê¸°(&amp;A)</translation>
</message>
<message>
- <source>Warning: Unknown change address</source>
- <translation>경고: 알려지지 ì•Šì€ ì£¼ì†Œë³€ê²½ìž…ë‹ˆë‹¤</translation>
+ <source>Balance:</source>
+ <translation>잔액:</translation>
</message>
<message>
- <source>Are you sure you want to send?</source>
- <translation>ì •ë§ë¡œ 보내시겠습니까?</translation>
+ <source>Confirm the send action</source>
+ <translation>전송 기능 확ì¸</translation>
</message>
<message>
- <source>added as transaction fee</source>
- <translation>거래 수수료로 추가ë¨</translation>
+ <source>S&amp;end</source>
+ <translation>보내기(&amp;E)</translation>
</message>
</context>
<context>
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation>금액:</translation>
+ <translation>금액(&amp;M):</translation>
</message>
<message>
<source>Pay &amp;To:</source>
- <translation>지급&amp;수신:</translation>
- </message>
- <message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>ë‹¹ì‹ ì˜ ì£¼ì†Œë¡ì— ì´ ì£¼ì†Œë¥¼ 추가하기 위하여 표를 입역하세요 </translation>
+ <translation>송금할 대ìƒ(&amp;T) : </translation>
</message>
<message>
<source>&amp;Label:</source>
- <translation>표:</translation>
+ <translation>ë¼ë²¨(&amp;L)</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -1690,7 +1455,11 @@
</message>
<message>
<source>This is a normal payment.</source>
- <translation>í‰ê· ì§€ê¸‰ìž…니다</translation>
+ <translation>ì´ê²ƒì€ ì •ìƒì ì¸ 지불입니다.</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation>ì´ ë¹„íŠ¸ì½”ì¸ ì£¼ì†Œë¡œ 송금ë©ë‹ˆë‹¤</translation>
</message>
<message>
<source>Alt+A</source>
@@ -1698,7 +1467,7 @@
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>í´ë¦½ë³´ë“œë¡œ 부터 주소를 붙ì´ì„¸ìš”</translation>
+ <translation>í´ë¦½ë³´ë“œë¡œ 부터 주소 붙여넣기</translation>
</message>
<message>
<source>Alt+P</source>
@@ -1706,15 +1475,31 @@
</message>
<message>
<source>Remove this entry</source>
- <translation>í•­ëª©ì„ ì§€ìš°ì‹œì˜¤</translation>
+ <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>
+ <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>
@@ -1732,10 +1517,6 @@
<context>
<name>ShutdownWindow</name>
<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>
@@ -1751,6 +1532,14 @@
<translation>메시지 서명(&amp;S)</translation>
</message>
<message>
+ <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation>여러분 ìžì‹ ì„ ì¦ëª…하기 위해 주소를 첨가하고 서명할 수 있습니다. 피싱 공격으로 ë§ë¯¸ì•”ì•„ ì—¬ëŸ¬ë¶„ì˜ ì„œëª…ì„ í†µí•´ ì†ì•„ 넘어가게 í•  수 있으므로, 서명하지 ì•Šì€ ëª¨ë“  모호한 요소를 주ì˜í•˜ì‹­ì‹œì˜¤. ì¡°í•­ë“¤ì´ ì™„ì „ 무결한지 í™•ì¸ í›„ ë™ì˜í•˜ëŠ” 경우ì—만 서명하십시오.</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation>메세지를 서명한 ë¹„íŠ¸ì½”ì¸ ì£¼ì†Œ</translation>
+ </message>
+ <message>
<source>Choose previously used address</source>
<translation>ì´ì „ì— ì‚¬ìš©í•œ 주소를 ì„ íƒí•˜ì‹­ì‹œì˜¤</translation>
</message>
@@ -1760,7 +1549,7 @@
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>í´ë¦½ë³´ë“œë¡œ 부터 주소를 붙ì´ì„¸ìš”</translation>
+ <translation>í´ë¦½ë³´ë“œë¡œ 부터 주소를 복사하기</translation>
</message>
<message>
<source>Alt+P</source>
@@ -1799,6 +1588,14 @@
<translation>메시지 ê²€ì¦(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation>메시지를 ê²€ì¦í•˜ê¸° 위해 아래 ì¹¸ì— ê°ê° 지갑 주소와 메시지, ì „ìžì„œëª…ì„ ìž…ë ¥í•˜ì„¸ìš”. (메시지 ì›ë³¸ì˜ ë„어쓰기, 들여쓰기, í–‰ 나눔 ë“±ì´ ì •í™•í•˜ê²Œ ìž…ë ¥ë˜ì–´ì•¼ 하므로 ì›ë³¸ì„ 복사해서 입력하세요) ì´ ê¸°ëŠ¥ì€ ë©”ì‹œì§€ ê²€ì¦ì´ 주 목ì ì´ë©°, ë„¤íŠ¸ì›Œí¬ ì¹¨ìž…ìžì— ì˜í•´ 변조ë˜ì§€ ì•Šë„ë¡ ì „ìžì„œëª… í•´ë…ì— ë¶ˆí•„ìš”í•œ ì‹œê°„ì„ ì†Œëª¨í•˜ì§€ 마세요. </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>
<translation>정확한 비트코ì¸ì£¼ì†Œê°€ ìž…ë ¥ë¬ëŠ”지 메시지를 확ì¸í•˜ì‹œì˜¤</translation>
</message>
@@ -1810,772 +1607,730 @@
<source>Reset all verify message fields</source>
<translation>모든 ê²€ì¦ ë©”ì‹œì§€ í•„ë“œ 재설정</translation>
</message>
+</context>
+<context>
+ <name>SplashScreen</name>
<message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>ì„œëª…ì„ ë§Œë“¤ë ¤ë©´ "메시지 서명"ì„ ëˆ„ë¥´ì‹­ì‹œì˜¤</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>입력한 주소가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>주소를 확ì¸í•˜ê³  다시 ì‹œë„하십시오.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>입력한 주소는 키ì—ì„œ 참조하지 않습니다.</translation>
+ <source>[testnet]</source>
+ <translation>[테스트넷]</translation>
</message>
+</context>
+<context>
+ <name>TrafficGraphWidget</name>
<message>
- <source>Wallet unlock was cancelled.</source>
- <translation>지갑 잠금 해제를 취소했습니다.</translation>
+ <source>KB/s</source>
+ <translation>KB/s</translation>
</message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
<message>
- <source>Private key for the entered address is not available.</source>
- <translation>입력한 ì£¼ì†Œì— ëŒ€í•œ ê°œì¸í‚¤ê°€ 없습니다.</translation>
+ <source>This pane shows a detailed description of the transaction</source>
+ <translation>ì´ ì°½ì€ ê±°ëž˜ì˜ ì„¸ë¶€ë‚´ì—­ì„ ë³´ì—¬ì¤ë‹ˆë‹¤</translation>
</message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Message signing failed.</source>
- <translation>메시지 ì„œëª…ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤.</translation>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>ê±°ëž˜ì•¡ì„ í‘œì‹œí•˜ëŠ” 단위. í´ë¦­í•´ì„œ 다른 단위를 ì„ íƒí•  수 있습니다.</translation>
</message>
+</context>
+<context>
+ <name>bitcoin-core</name>
<message>
- <source>Message signed.</source>
- <translation>메시지를 서명했습니다.</translation>
+ <source>Options:</source>
+ <translation>옵션:</translation>
</message>
<message>
- <source>The signature could not be decoded.</source>
- <translation>ì„œëª…ì„ í•´ë…í•  수 없습니다.</translation>
+ <source>Specify data directory</source>
+ <translation>ë°ì´í„° í´ë” 지정</translation>
</message>
<message>
- <source>Please check the signature and try again.</source>
- <translation>ì„œëª…ì„ í™•ì¸í•˜ê³  다시 ì‹œë„하십시오.</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>피어 주소를 받기 위해 ë…¸ë“œì— ì—°ê²°í•˜ê³ , ë°›ì€ í›„ì— ì—°ê²°ì„ ëŠìŠµë‹ˆë‹¤</translation>
</message>
<message>
- <source>The signature did not match the message digest.</source>
- <translation>메시지 다ì´ì œìŠ¤íŠ¸ì™€ ì„œëª…ì´ ì¼ì¹˜í•˜ì§€ 않습니다.</translation>
+ <source>Specify your own public address</source>
+ <translation>ê³µì¸ ì£¼ì†Œë¥¼ 지정하십시오</translation>
</message>
<message>
- <source>Message verification failed.</source>
- <translation>메시지 ê²€ì¦ì— 실패했습니다.</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>명령줄과 JSON-RPC 명령 수ë½</translation>
</message>
<message>
- <source>Message verified.</source>
- <translation>메시지를 ê²€ì¦í–ˆìŠµë‹ˆë‹¤.</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>&lt;category&gt;ê°€ 제공ë˜ì§€ 않거나 &lt;category&gt; = 1 ì¸ ê²½ìš°, 모든 디버깅 정보를 출력</translation>
</message>
-</context>
-<context>
- <name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>ë¸”ë¡ ì¶•ì†Œê°€ ìµœì†Œì¹˜ì˜ %d MiB 밑으로 설정ë˜ì–´ 있습니다. ë” ë†’ì€ ê°’ì„ ì‚¬ìš©í•´ 보세요.</translation>
</message>
<message>
- <source>The Bitcoin Core developers</source>
- <translation>비트코ì¸ì½”ì–´ 개발ìžë“¤</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>ë¸”ë¡ ì¶•ì†Œ: 마지막 지갑 ë™ê¸°í™” 지ì ì´ ì¶•ì†Œëœ ë°ì´í„°ë³´ë‹¤ ê³¼ê±°ì˜ ê²ƒ 입니다. -reindexê°€ 필요합니다 (ì •ì§€ëœ ë…¸ë“œì˜ ê²½ìš° 모든 블ë¡ì²´ì¸ì„ 재다운로드합니다)</translation>
</message>
<message>
- <source>[testnet]</source>
- <translation>[테스트넷]</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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 와 -rescan ê³¼ 호환ë˜ì§€ 않습니다. 경고: ì´ ëª¨ë“œë¥¼ 취소하면 모든 블ë¡ì²´ì¸ì„ 다시 다운로드 받아야 합니다. (기본값:0 = ë¸”ë¡ ì¶•ì†Œ 비활성화, &gt;%u = 블ë¡íŒŒì¼ì— 사용할 ìš©ëŸ‰ì„ MiB단위로 지정)</translation>
</message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
<message>
- <source>KB/s</source>
- <translation>KB/s</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>ë¸”ë¡ ì¶•ì†Œ 모드ì—서는 ìž¬ê²€ìƒ‰ì´ ë¶ˆê°€ëŠ¥ 합니다. -reindex ëª…ë ¹ì„ ì‚¬ìš©í•´ì„œ 모든 블ë¡ì²´ì¸ì„ 다시 다운로드 해야 합니다.</translation>
</message>
-</context>
-<context>
- <name>TransactionDesc</name>
<message>
- <source>Open until %1</source>
- <translation>%1 까지 열림</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>ì—러: 치명ì ì¸ 내부 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤, ìžì„¸í•œ ë‚´ìš©ì€ debug.log 를 확ì¸í•´ì£¼ì„¸ìš”.</translation>
</message>
<message>
- <source>conflicted</source>
- <translation>충ëŒ</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>송금 거래시 추가ë˜ëŠ” 수수료 (%s/kB) (기본값: %s)</translation>
</message>
<message>
- <source>%1/offline</source>
- <translation>%1/오프ë¼ì¸</translation>
+ <source>Pruning blockstore...</source>
+ <translation>ë¸”ë¡ ë°ì´í„°ë¥¼ 축소 중입니다..</translation>
</message>
<message>
- <source>%1/unconfirmed</source>
- <translation>%1/미확ì¸</translation>
+ <source>Run in the background as a daemon and accept commands</source>
+ <translation>ë°ëª¬ìœ¼ë¡œ 백그ë¼ìš´ë“œì—ì„œ 실행하고 ëª…ë ¹ì„ í—ˆìš©</translation>
</message>
<message>
- <source>%1 confirmations</source>
- <translation>%1 확ì¸ë¨</translation>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>HTTP 서버를 시작할 수 없습니다. ìžì„¸í•œ ì‚¬í•­ì€ ë””ë²„ê·¸ 로그를 í™•ì¸ í•˜ì„¸ìš”.</translation>
</message>
<message>
- <source>Status</source>
- <translation>ìƒíƒœ</translation>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <translation>외부 ì ‘ì†ì„ 승ì¸í•©ë‹ˆë‹¤</translation>
</message>
<message>
- <source>Date</source>
- <translation>날짜</translation>
+ <source>Bitcoin Core</source>
+ <translation>ë¹„íŠ¸ì½”ì¸ ì½”ì–´</translation>
</message>
<message>
- <source>Source</source>
- <translation>소스</translation>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfeeì€ ë„ˆë¬´ 높습니다! ì´ê²ƒì€ 수수료 ì˜ˆì¸¡ì„ ì´ìš©í•  수 ì—†ì„ ë•Œ 지불ë˜ëŠ” 트랜잭션 수수료입니다.</translation>
</message>
<message>
- <source>Generated</source>
- <translation>ìƒì„±í•˜ë‹¤</translation>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>충분한 ë°ì´í„°ê°€ 축ì ë˜ì§€ ì•Šì€ ìƒíƒœì—ì„œì˜ ìˆ˜ìˆ˜ë£Œ 추정 ê¸°ëŠ¥ì´ ì‚¬ìš©í•˜ëŠ” 수수료 비율(%s/kB) (기본값: %s)</translation>
</message>
<message>
- <source>From</source>
- <translation>으로부터</translation>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>íŠ¸ëžœìž­ì…˜ì˜ ì¤‘ê³„ë¥¼ 하지 ì•Šë”ë¼ë„ í™”ì´íŠ¸ ë¦¬ìŠ¤íŠ¸ì— í¬í•¨ëœ 피어ì—ì„œ ë°›ì€ íŠ¸ëžœìž­ì…˜ì€ ì¤‘ê³„í•˜ê¸° (기본값: %d)</translation>
</message>
<message>
- <source>To</source>
- <translation>ì—게</translation>
+ <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
+ <translation>ì„ íƒëœ 주소로 고정하며 í•­ìƒ ë¦¬ìŠ¨(Listen)합니다. IPv6 í”„ë¡œí† ì½œì¸ ê²½ìš° [host]:port ë°©ì‹ì˜ 명령어 í‘œê¸°ë²•ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.</translation>
</message>
<message>
- <source>own address</source>
- <translation>ìžì‹ ì˜ 주소</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>label</source>
- <translation>ë¼ë²¨</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 소프트웨어 ë¼ì´ì„¼ìŠ¤ì— ë”°ë¼ ë°°í¬ë©ë‹ˆë‹¤. ë™ë´‰ëœ íŒŒì¼ í˜¹ì€ &lt;http://www.opensource.org/licenses/mit-license.php&gt;를 참조하세요.</translation>
</message>
<message>
- <source>Credit</source>
- <translation>예금</translation>
+ <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
+ <translation>지갑 거래가 바뀌면 ëª…ë ¹ì„ ì‹¤í–‰í•©ë‹ˆë‹¤.(%s ì•ˆì˜ ëª…ë ¹ì–´ê°€ TxIDë¡œ ë°”ë€ë‹ˆë‹¤)</translation>
</message>
<message>
- <source>not accepted</source>
- <translation>허용ë˜ì§€ 않는다</translation>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>í”¼ì–´ë“¤ì´ ë¡œì»¬ 중계 ì •ì±…ì„ ìœ„ë°˜í•˜ë”ë¼ë„ í™”ì´íŠ¸ ë¦¬ìŠ¤íŠ¸ì— í¬í•¨ëœ 피어ì¸ê²½ìš° 강제로 중계하기 (기본값: %d)</translation>
</message>
<message>
- <source>Debit</source>
- <translation>차변</translation>
+ <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>Transaction fee</source>
- <translation>송금 수수료</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ì— ë¯¸ëž˜ì˜ ë¸”ë¡ì´ í¬í•¨ë˜ì–´ 있습니다. ì´ê²ƒì€ 사용ìžì˜ ì»´í“¨í„°ì˜ ë‚ ì§œì™€ ì‹œê°„ì´ ì˜¬ë°”ë¥´ê²Œ 설정ë˜ì–´ 있지 ì•Šì„ë•Œ 나타날 수 있습니다. 만약 사용ìžì˜ ì»´í“¨í„°ì˜ ë‚ ì§œì™€ ì‹œê°„ì´ ì˜¬ë°”ë¥´ë‹¤ê³  확신할 ë•Œì—만 ë¸”ë¡ ë°ì´í„° ë² ì´ìŠ¤ì˜ ìž¬êµ¬ì„±ì„ í•˜ì‹­ì‹œì˜¤</translation>
</message>
<message>
- <source>Net amount</source>
- <translation>ì´ì•¡</translation>
+ <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>Message</source>
- <translation>메시지</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>리슨(Listen) í¬íŠ¸ë¥¼ 할당하기 위해 UPnP 사용 (기본값: 열려있거나 -proxy ì˜µì…˜ì„ ì‚¬ìš©í•˜ì§€ ì•Šì„ ì‹œ 1)</translation>
</message>
<message>
- <source>Comment</source>
- <translation>설명</translation>
+ <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
+ <translation>경고 : 모든 네트워í¬ê°€ ë™ì˜í•´ì•¼ 하나, ì¼ë¶€ 채굴ìžë“¤ì—게 문제가 있는 것으로 보입니다. </translation>
</message>
<message>
- <source>Transaction ID</source>
- <translation>ì•„ì´ë””</translation>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation>경고: 현재 ë¹„íŠ¸ì½”ì¸ ë²„ì „ì´ ë‹¤ë¥¸ ë„¤íŠ¸ì›Œí¬ ì°¸ì—¬ìžë“¤ê³¼ ë™ì¼í•˜ì§€ 않는 것 같습니다. 당신 ë˜ëŠ” 다른 참여ìžë“¤ì´ ë™ì¼í•œ ë¹„íŠ¸ì½”ì¸ ë²„ì „ìœ¼ë¡œ 업그레ì´ë“œ í•  필요가 있습니다.</translation>
</message>
<message>
- <source>Merchant</source>
- <translation>ìƒì¸</translation>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>ì„¤ì •ëœ ë„·ë§ˆìŠ¤í¬ í˜¹ì€ IP 주소로 í™”ì´íŠ¸ë¦¬ìŠ¤íŠ¸ì— í¬í•¨ëœ í”¼ì–´ì— ì ‘ì†í•©ë‹ˆë‹¤. ì´ ì„¤ì •ì€ ë³µìˆ˜ë¡œ 지정 í•  수 있습니다.</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>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempoolì€ ìµœì†Œí•œ %d MBê°€ 필요합니다</translation>
</message>
<message>
- <source>Debug information</source>
- <translation>디버깅 정보</translation>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;category&gt; 지정 가능:</translation>
</message>
<message>
- <source>Transaction</source>
- <translation>송금</translation>
+ <source>Append comment to the user agent string</source>
+ <translation>ì‚¬ìš©ìž ì—ì´ì „트 문ìžì—´ì— 코멘트 첨부</translation>
</message>
<message>
- <source>Inputs</source>
- <translation>ìž…ë ¥</translation>
+ <source>Block creation options:</source>
+ <translation>ë¸”ë¡ ìƒì„± 옵션:</translation>
</message>
<message>
- <source>Amount</source>
- <translation>거래량</translation>
+ <source>Connect only to the specified node(s)</source>
+ <translation>ì§€ì •ëœ ë…¸ë“œì—만 연결하기</translation>
</message>
<message>
- <source>true</source>
- <translation>ì°¸</translation>
+ <source>Connection options:</source>
+ <translation>연결 설정 : </translation>
</message>
<message>
- <source>false</source>
- <translation>거짓</translation>
+ <source>Corrupted block database detected</source>
+ <translation>ì†ìƒëœ ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ê°€ ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤</translation>
</message>
<message>
- <source>, has not been successfully broadcast yet</source>
- <translation>. ì•„ì§ ì„±ê³µì ìœ¼ë¡œ 통보하지 ì•ŠìŒ</translation>
+ <source>Debugging/Testing options:</source>
+ <translation>디버그 ë° í…ŒìŠ¤íŠ¸ 설정</translation>
</message>
<message>
- <source>unknown</source>
- <translation>알수없ìŒ</translation>
+ <source>Do not load the wallet and disable wallet RPC calls</source>
+ <translation>지갑 불러오기를 하지마시오 ë˜í•œ 지갑 RPC ì—°ê²°ì„ ì°¨ë‹¨í•˜ì‹­ì‹œì˜¤</translation>
</message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>거래 세부 내역</translation>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation>ë¸”ë½ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 다시 ìƒì„±í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</translation>
</message>
<message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation>ì´ ì°½ì€ ê±°ëž˜ì˜ ì„¸ë¶€ë‚´ì—­ì„ ë³´ì—¬ì¤ë‹ˆë‹¤</translation>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>&lt;address&gt;ì— ëŒ€í•œ í•´ì‹œ ë¸”ë¡ ê³µê°œ 활성화</translation>
</message>
-</context>
-<context>
- <name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation>날짜</translation>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>&lt;address&gt;ì— ëŒ€í•œ í•´ì‹œ 트랙잭션 공개 활성화</translation>
</message>
<message>
- <source>Type</source>
- <translation>종류</translation>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>&lt;address&gt;ì— ëŒ€í•œ 로우 ë¸”ë¡ ê³µê°œ 활성화</translation>
</message>
<message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>충분히 숙성ë˜ì§€ ì•Šì€ ìƒíƒœ (%1 승ì¸, %2 í›„ì— ì‚¬ìš© 가능합니다)</translation>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>&lt;address&gt;ì— ëŒ€í•œ 로우 트랜잭션 공개 활성화</translation>
</message>
<message>
- <source>Open until %1</source>
- <translation>%1 까지 열림</translation>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>메모리 í’€(pool) ë‚´ì˜ íŠ¸ëžœìž­ì…˜ 치환(replacement) 활성화 (기본값: %u)</translation>
</message>
<message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>확ì¸ë¨(%1 확ì¸ë¨)</translation>
+ <source>Error initializing block database</source>
+ <translation>ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ì´ˆê¸°í™”í•˜ëŠ”ë° ì˜¤ë¥˜</translation>
</message>
<message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>ì´ ë¸”ëŸ­ì€ ë‹¤ë¥¸ 노드로부터 받지 ì•Šì•„ 허용ë˜ì§€ ì•Šì„ ê²ƒìž„.</translation>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation>지갑 ë°ì´í„°ë² ì´ìŠ¤ 환경 ì´ˆê¸°í™”í•˜ëŠ”ë° ì˜¤ë¥˜ %s</translation>
</message>
<message>
- <source>Generated but not accepted</source>
- <translation>ìƒì„±ë˜ì—ˆìœ¼ë‚˜ ê±°ì ˆë¨</translation>
+ <source>Error loading block database</source>
+ <translation>ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ë¶ˆëŸ¬ì˜¤ëŠ”ë° ì˜¤ë¥˜</translation>
</message>
<message>
- <source>Offline</source>
- <translation>오프ë¼ì¸</translation>
+ <source>Error opening block database</source>
+ <translation>ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ì—¬ëŠ”ë° ì˜¤ë¥˜</translation>
</message>
<message>
- <source>Label</source>
- <translation>표</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>오류: ë””ìŠ¤í¬ ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤!</translation>
</message>
<message>
- <source>Unconfirmed</source>
- <translation>미확ì¸</translation>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <translation>ì–´ë–¤ í¬íŠ¸ë„ ë°˜ì‘하지 않습니다. ì‚¬ìš©ìž ë°˜ì‘=0 만약 ì›í•œë‹¤ë©´</translation>
</message>
<message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>ìŠ¹ì¸ ì¤‘ (권장ë˜ëŠ” ìŠ¹ì¸ íšŒìˆ˜ %2 대비 현재 ìŠ¹ì¸ ìˆ˜ %1)</translation>
+ <source>Importing...</source>
+ <translation>들여오기 중...</translation>
</message>
<message>
- <source>Conflicted</source>
- <translation>충ëŒ</translation>
+ <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <translation>올바르지 않거나 ìƒì„±ëœ 블ë¡ì„ ì°¾ì„ ìˆ˜ 없습니다. ìž˜ëª»ëœ ë„¤íŠ¸ì›Œí¬ ìžë£Œ 디렉토리?</translation>
</message>
<message>
- <source>Received with</source>
- <translation>보낸 주소</translation>
+ <source>Invalid -onion address: '%s'</source>
+ <translation>ìž˜ëª»ëœ -onion 주소입니다: '%s'</translation>
</message>
<message>
- <source>Received from</source>
- <translation>보낸 주소</translation>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>유효하지 ì•Šì€ ê¸ˆì•¡ -fallbackfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>받는 주소</translation>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>트랜잭션 메모리 í’€ì˜ ìš©ëŸ‰ì„ &lt;n&gt;메가바ì´íŠ¸ 아래로 유지하기 (기본값: %u)</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation>ìžì‹ ì—게 지불</translation>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>ì¸ì¦ ì¿ í‚¤ì˜ ìœ„ì¹˜ (기본값: data dir)</translation>
</message>
<message>
- <source>Mined</source>
- <translation>채굴</translation>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>중계 ë° ì±„êµ´ì„ í•  ë•Œ 트랜잭션ì—ì„œì˜ sigop 당 ë°ì´í„°ì˜ 최소 í¬ê¸° (기본값: %u)</translation>
</message>
<message>
- <source>(n/a)</source>
- <translation>(ì—†ìŒ)</translation>
+ <source>Not enough file descriptors available.</source>
+ <translation>사용 가능한 íŒŒì¼ ë””ìŠ¤í¬ë¦½í„°-File Descriptor-ê°€ 부족합니다. </translation>
</message>
<message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>거래ìƒí™©. 마우스를 올리면 승ì¸íšŸìˆ˜ê°€ 표시ë©ë‹ˆë‹¤.</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>Date and time that the transaction was received.</source>
- <translation>거래가 ì´ë£¨ì–´ì§„ 날짜와 ì‹œê°.</translation>
+ <source>Print version and exit</source>
+ <translation>버전 출력후 종료</translation>
</message>
<message>
- <source>Type of transaction.</source>
- <translation>ê±°ëž˜ì˜ ì¢…ë¥˜.</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>ë¸”ë¡ ì¶•ì†ŒëŠ” ìŒìˆ˜ë¡œ 설정할 수 없습니다.</translation>
</message>
<message>
- <source>Amount removed from or added to balance.</source>
- <translation>ë³€ê²½ëœ ìž”ê³ .</translation>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>ë¸”ë¡ ì¶•ì†Œ 모드는 -txindex와 호환ë˜ì§€ 않습니다.</translation>
</message>
-</context>
-<context>
- <name>TransactionView</name>
<message>
- <source>All</source>
- <translation>ì „ì²´</translation>
+ <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
+ <translation>ë°ì´í„°ë² ì´ìŠ¤ 케시 í¬ê¸°ë¥¼ 메가바ì´íŠ¸ë¡œ 설정(%d 부터 %d, 기본값: %d)</translation>
</message>
<message>
- <source>Today</source>
- <translation>오늘</translation>
+ <source>Set maximum block size in bytes (default: %d)</source>
+ <translation>최대 ë¸”ë½ í¬ê¸°ë¥¼ Bytesë¡œ 지정하세요 (기본: %d)</translation>
</message>
<message>
- <source>This week</source>
- <translation>ì´ë²ˆì£¼</translation>
+ <source>Specify wallet file (within data directory)</source>
+ <translation>ë°ì´í„° í´ë” ì•ˆì— ì§€ê°‘ 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”.</translation>
</message>
<message>
- <source>This month</source>
- <translation>ì´ë²ˆ 달</translation>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>지ì›í•˜ì§€ 않는 ì¸ìˆ˜ -benchmark ì€ ë¬´ì‹œë©ë‹ˆë‹¤, -debug=bench 형태로 사용하세요.</translation>
</message>
<message>
- <source>Last month</source>
- <translation>지난 달</translation>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>지ì›í•˜ì§€ 않는 ì¸ìˆ˜ -debugnet ì€ ë¬´ì‹œë©ë‹ˆë‹¤, -debug=net 형태로 사용하세요.</translation>
</message>
<message>
- <source>This year</source>
- <translation>올 해</translation>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>지ì›í•˜ì§€ 않는 ì¸ìˆ˜ -tor를 찾았습니다. -onion를 사용해주세요.</translation>
</message>
<message>
- <source>Range...</source>
- <translation>범위...</translation>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>리슨(Listen) í¬íŠ¸ë¥¼ 할당하기 위해 UPnP 사용 (기본값: %u)</translation>
</message>
<message>
- <source>Received with</source>
- <translation>보낸 주소</translation>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>ì‚¬ìš©ìž ì •ì˜ ì½”ë©˜íŠ¸ (%s)ì— ì•ˆì „í•˜ì§€ 못한 글ìžê°€ í¬í•¨ë˜ì–´ 있습니다.</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>받는 주소</translation>
+ <source>Verifying blocks...</source>
+ <translation>ë¸”ë¡ ê²€ì¦ì¤‘...</translation>
</message>
<message>
- <source>To yourself</source>
- <translation>ìžê¸°ê±°ëž˜</translation>
+ <source>Verifying wallet...</source>
+ <translation>지갑 ê²€ì¦ì¤‘...</translation>
</message>
<message>
- <source>Mined</source>
- <translation>채굴</translation>
+ <source>Wallet %s resides outside data directory %s</source>
+ <translation>지갑 %s는 ë°ì´í„° 디렉토리 %s ë°–ì— ìœ„ì¹˜í•©ë‹ˆë‹¤.</translation>
</message>
<message>
- <source>Other</source>
- <translation>기타</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>지갑 디버깅/테스트 옵션:</translation>
</message>
<message>
- <source>Enter address or label to search</source>
- <translation>검색하기 위한 주소 ë˜ëŠ” í‘œ ìž…ë ¥</translation>
+ <source>Wallet options:</source>
+ <translation>지갑 옵션:</translation>
</message>
<message>
- <source>Min amount</source>
- <translation>최소 거래량</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>특정 소스ì—ì„œì˜ 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>Copy address</source>
- <translation>주소 복사하기</translation>
+ <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>Copy label</source>
- <translation>표 복사하기</translation>
+ <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 ì—°ê²°ì„ ë¦¬ìŠ¨(Listen)합니다. IPv6 í”„ë¡œí† ì½œì¸ ê²½ìš° [host]:port ë°©ì‹ì˜ 명령어 í‘œê¸°ë²•ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. ì´ ì˜µì…˜ì€ ë³µìˆ˜ë¡œ 지정 할수 있습니다. (기본값: 모든 ì¸í„°íŽ˜ì´ìŠ¤ì— ê³ ì •)</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>거래량 복사</translation>
+ <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>Copy transaction ID</source>
- <translation>거래 ì•„ì´ë”” 복사</translation>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>ìžì‹ ì˜ 주소를 íƒìƒ‰ (기본값: 열려있거나 -externalip 나 -proxy ì˜µì…˜ì´ ì—†ìœ¼ë©´ 1)</translation>
</message>
<message>
- <source>Edit label</source>
- <translation>표 수정하기</translation>
+ <source>Error: Listening for incoming connections failed (listen returned error %s)</source>
+ <translation>오류: 들어오는 ì—°ê²°ì„ ë¦¬ìŠ¨(Listen)í•˜ëŠ”ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤ (오류 리턴 %s)</translation>
</message>
<message>
- <source>Show transaction details</source>
- <translation>거래 ë‚´ì—­ 확ì¸</translation>
+ <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>ì´ ì‚¬í•­ê³¼ 관련있는 경고가 ë°œìƒí•˜ê±°ë‚˜ 아주 긴 í¬í¬ê°€ ë°œìƒí–ˆì„ ë•Œ 명령어를 실행해 주세요. (cmd 명령어 목ë¡ì—ì„œ %s는 메시지로 대체ë©ë‹ˆë‹¤) </translation>
</message>
<message>
- <source>Export Transaction History</source>
- <translation>거래 ê¸°ë¡ ë‚´ë³´ë‚´ê¸°</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>해당 금액(%s/kB) 보다 ì ì€ 수수료는 중계, 채굴, 트랜잭션 ìƒì„±ì—ì„œ 수수료 면제로 간주ë©ë‹ˆë‹¤ (기본값: %s)</translation>
</message>
<message>
- <source>Exporting Failed</source>
- <translation>내보내기 실패</translation>
+ <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>There was an error trying to save the transaction history to %1.</source>
- <translation>%1으로 거래 기ë¡ì„ ì €ìž¥í•˜ëŠ”ë° ì• ëŸ¬ê°€ 있었습니다.</translation>
+ <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>Exporting Successful</source>
- <translation>내보내기 성공</translation>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>중계 ë° ì±„êµ´ì„ í•  ë•Œ ë°ì´í„° 운송 트랜잭션ì—ì„œ ë°ì´í„°ì˜ 최대 í¬ê¸° (기본값: %u)</translation>
</message>
<message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>거래 기ë¡ì´ 성공ì ìœ¼ë¡œ %1ì— ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤.</translation>
+ <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
+ <translation>DNS lookup를 통해 피어 ì£¼ì†Œì— ëŒ€í•œ 쿼리 보내기 (기본값: 1 -connect 예외)</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>ê°ê°ì˜ 파ì¼ì— 쉼표하기(*.csv)</translation>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>ì¸ì¦ì •ë³´ë¥¼ 프ë¡ì‹œ 연결마다 무작위로 합니다. ì´ëŠ” Tor ìŠ¤íŠ¸ë¦¼ì„ ê²©ë¦¬ì‹œí‚¬ 수 있습니다 (기본값: %u)</translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>확ì¸ë¨</translation>
+ <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
+ <translation>최대 í¬ê¸°ë¥¼ 최우선으로 설정 / ë°”ì´íŠ¸ë‹¹ 최소 수수료로 거래(기본값: %d)</translation>
</message>
<message>
- <source>Date</source>
- <translation>날짜</translation>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>ê±°ëž˜ì•¡ì´ ìˆ˜ìˆ˜ë£Œë¥¼ 지불하기엔 너무 작습니다</translation>
</message>
<message>
- <source>Type</source>
- <translation>종류</translation>
+ <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 툴킷&lt;https://www.openssl.org/&gt; 사용 목ì ìœ¼ë¡œ 개발한 OpenSSL 프로ì íŠ¸ë¥¼ í¬í•¨í•˜ê³  있으며, 암호화 í”„ë¡œê·¸ëž¨ì€ Eric Youngì´, UPnP í”„ë¡œê·¸ëž¨ì€ Thomas Bernardê°€ 작성했습니다.</translation>
</message>
<message>
- <source>Label</source>
- <translation>표</translation>
+ <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 ì¶”ë°©ì´ ë˜ì§€ 않으며 ê·¸ë“¤ì˜ íŠ¸ëžœìž­ì…˜ì´ í•­ìƒ ì¤‘ê³„ë©ë‹ˆë‹¤, ì´ëŠ” 예를 들면 게ì´íŠ¸ì›¨ì´ì—ì„œ 유용합니다.</translation>
</message>
<message>
- <source>Address</source>
- <translation>주소</translation>
+ <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>ID</source>
- <translation>ì•„ì´ë””</translation>
+ <source>(default: %u)</source>
+ <translation>(기본값: %u)</translation>
</message>
<message>
- <source>Range:</source>
- <translation>범위:</translation>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>공개 REST ìš”ì²­ì„ í—ˆê°€ (기본값: %u)</translation>
</message>
<message>
- <source>to</source>
- <translation>ìƒëŒ€ë°©</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Tor서비스를 ìžë™ì ìœ¼ë¡œ ìƒì„± (기본값: %d)</translation>
</message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- </context>
-<context>
- <name>WalletFrame</name>
<message>
- <source>No wallet has been loaded.</source>
- <translation>지갑 불러오기가 안ë©ë‹ˆë‹¤</translation>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>SOCK5 프ë¡ì‹œë¥¼ 통해 ì—°ê²°</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>ì½”ì¸ë“¤ 보내기</translation>
+ <source>Error reading from database, shutting down.</source>
+ <translation>ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ë¶ˆëŸ¬ì˜¤ëŠ”ë° ì˜¤ë¥˜ê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤, 종료ë©ë‹ˆë‹¤.</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;내보내기</translation>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>외부 blk000??.dat 파ì¼ì—ì„œ 블ë¡ì„ 가져오기</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>현재 íƒ­ì— ìžˆëŠ” ë°ì´í„°ë¥¼ 파ì¼ë¡œ 내보내기</translation>
+ <source>Information</source>
+ <translation>ì •ë³´</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>지갑 백업</translation>
+ <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>Wallet Data (*.dat)</source>
- <translation>지갑 ë°ì´í„°(*.dat)</translation>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation>유효하지 ì•Šì€ ë„·ë§ˆìŠ¤í¬ê°€ -whitelist: '%s" 를 통해 지정ë¨</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>백업 실패</translation>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>최대 &lt;n&gt;ê°œì˜ ì—°ê²°í•  수 없는 íŠ¸ëžœìž­ì…˜ì„ ë©”ëª¨ë¦¬ì— ì €ìž¥ (기본값: %u)</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>지갑 ë°ì´í„°ë¥¼ %1 í´ë”ì— ì €ìž¥í•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. </translation>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation>-whitebind를 ì´ìš©í•˜ì—¬ í¬íŠ¸ë¥¼ 지정해야 합니다: '%s"</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>지갑 ì •ë³´ê°€ %1ì— ì„±ê³µì ìœ¼ë¡œ 저장ë˜ì—ˆìŠµë‹ˆë‹¤</translation>
+ <source>Node relay options:</source>
+ <translation>Node 중계 옵션:</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>백업 성공</translation>
+ <source>RPC server options:</source>
+ <translation>RPC 서버 설정</translation>
</message>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>옵션:</translation>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>시스템 한계로 ì¸í•˜ì—¬ -maxconnections를 %d ì—ì„œ %dë¡œ 줄였습니다.</translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>ë°ì´í„° í´ë” 지정</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>시작시 누ë½ëœ 지갑 íŠ¸ëžœìž­ì…˜ì— ëŒ€í•´ ë¸”ë¡ ì²´ì¸ì„ 다시 검색 합니다</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>피어 주소를 받기 위해 ë…¸ë“œì— ì—°ê²°í•˜ê³ , ë°›ì€ í›„ì— ì—°ê²°ì„ ëŠìŠµë‹ˆë‹¤</translation>
+ <source>Send trace/debug info to console instead of debug.log file</source>
+ <translation>추ì ì˜¤ë¥˜ 정보를 degug.log ìžë£Œë¡œ 보내는 대신 콘솔로 보내기</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>ê³µì¸ ì£¼ì†Œë¥¼ 지정하십시오</translation>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>가능한 경우 수수료 ì—†ì´ íŠ¸ëžœìž­ì…˜ 보내기 (기본값: %u)</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>명령줄과 JSON-RPC 명령 수ë½</translation>
+ <source>Show all debugging options (usage: --help -help-debug)</source>
+ <translation>모든 디버그 설정 보기(설정: --help -help-debug)</translation>
</message>
<message>
- <source>Run in the background as a daemon and accept commands</source>
- <translation>ë°ëª¬ìœ¼ë¡œ 백그ë¼ìš´ë“œì—ì„œ 실행하고 ëª…ë ¹ì„ í—ˆìš©</translation>
+ <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
+ <translation>í´ë¼ì´ì–¸íŠ¸ 시작시 debug.log íŒŒì¼ ë¹„ìš°ê¸°(기본값: 디버그 안할때 1)</translation>
</message>
<message>
- <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>외부 ì ‘ì†ì„ 승ì¸í•©ë‹ˆë‹¤</translation>
+ <source>Signing transaction failed</source>
+ <translation>거래를 ì„œëª…í•˜ëŠ”ê²ƒì„ ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤.</translation>
</message>
<message>
- <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
- <translation>ì„ íƒëœ 주소로 고정하며 í•­ìƒ ë¦¬ìŠ¨(Listen)합니다. IPv6 í”„ë¡œí† ì½œì¸ ê²½ìš° [host]:port ë°©ì‹ì˜ 명령어 í‘œê¸°ë²•ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.</translation>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>ê±°ëž˜ì•¡ì´ ìˆ˜ìˆ˜ë£Œë¥¼ 지불하기엔 너무 작습니다</translation>
</message>
<message>
- <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
- <translation>지갑 거래가 바뀌면 ëª…ë ¹ì„ ì‹¤í–‰í•©ë‹ˆë‹¤.(%s ì•ˆì˜ ëª…ë ¹ì–´ê°€ TxIDë¡œ ë°”ë€ë‹ˆë‹¤)</translation>
+ <source>This is experimental software.</source>
+ <translation>ì´ ì†Œí”„íŠ¸ì›¨ì–´ëŠ” 시험ì ìž…니다.</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>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Tor 관리 í¬íŠ¸ 암호 (기본값: 공란)</translation>
</message>
<message>
- <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>경고 : 모든 네트워í¬ê°€ ë™ì˜í•´ì•¼ 하나, ì¼ë¶€ 채굴ìžë“¤ì—게 문제가 있는 것으로 보입니다. </translation>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>onion ì—´ë¦¼ì´ í™œì„±í™”ì‹œ Tor 관리 í¬íŠ¸ 사용 (기본값: %s)</translation>
</message>
<message>
- <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation>경고: 현재 ë¹„íŠ¸ì½”ì¸ ë²„ì „ì´ ë‹¤ë¥¸ ë„¤íŠ¸ì›Œí¬ ì°¸ì—¬ìžë“¤ê³¼ ë™ì¼í•˜ì§€ 않는 것 같습니다. 당신 ë˜ëŠ” 다른 참여ìžë“¤ì´ ë™ì¼í•œ ë¹„íŠ¸ì½”ì¸ ë²„ì „ìœ¼ë¡œ 업그레ì´ë“œ í•  필요가 있습니다.</translation>
+ <source>Transaction amount too small</source>
+ <translation>ê±°ëž˜ì•¡ì´ ë„ˆë¬´ ì ìŠµë‹ˆë‹¤</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>경고 : wallet.datê°€ ì†ìƒë˜ì–´ ë°ì´í„°ê°€ 복구ë˜ì—ˆìŠµë‹ˆë‹¤. ì›ëž˜ì˜ wallet.dat 파ì¼ì€ %s í›„ì— wallet.{timestamp}.bak ì´ë¦„으로 저장ë©ë‹ˆë‹¤. 잔액과 거래 ë‚´ì—­ì´ ì •í™•í•˜ì§€ 않다면 백업 파ì¼ë¡œ 부터 ë³µì›í•´ì•¼ 합니다. </translation>
+ <source>Transaction amounts must be positive</source>
+ <translation>ê±°ëž˜ì•¡ì€ ë°˜ë“œì‹œ 정수여야합니다.</translation>
</message>
<message>
- <source>Block creation options:</source>
- <translation>ë¸”ë¡ ìƒì„± 옵션:</translation>
+ <source>Transaction too large for fee policy</source>
+ <translation>수수료 ì •ì±…ì— ë¹„í•´ íŠ¸ëžœìž­ì…˜ì´ ë„ˆë¬´ í½ë‹ˆë‹¤</translation>
</message>
<message>
- <source>Connect only to the specified node(s)</source>
- <translation>ì§€ì •ëœ ë…¸ë“œì—만 연결하기</translation>
+ <source>Transaction too large</source>
+ <translation>너무 í° ê±°ëž˜</translation>
</message>
<message>
- <source>Connection options:</source>
- <translation>연결 설정 : </translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>시작시 지갑 í¬ë©§ì„ 최신으로 업그레ì´ë“œ 합니다</translation>
</message>
<message>
- <source>Corrupted block database detected</source>
- <translation>ì†ìƒëœ ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ê°€ ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>JSON-RPC ì—°ê²°ì— ì‚¬ìš©í•  ì‚¬ìš©ìž ì´ë¦„</translation>
</message>
<message>
- <source>Debugging/Testing options:</source>
- <translation>디버그 ë° í…ŒìŠ¤íŠ¸ 설정</translation>
+ <source>Warning</source>
+ <translation>경고</translation>
</message>
<message>
- <source>Do not load the wallet and disable wallet RPC calls</source>
- <translation>지갑 불러오기를 하지마시오 ë˜í•œ 지갑 RPC ì—°ê²°ì„ ì°¨ë‹¨í•˜ì‹­ì‹œì˜¤</translation>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>경고: 알려지지 ì•Šì€ ìƒˆë¡œìš´ ê·œì¹™ì´ í™œì„±í™”ë˜ì—ˆìŠµë‹ˆë‹¤. (버전비트 %i)</translation>
</message>
<message>
- <source>Do you want to rebuild the block database now?</source>
- <translation>ë¸”ë½ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 다시 ìƒì„±í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</translation>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>ë¸”ë¡ ì „ìš© 모드로 ë™ìž‘할지 여부 (기본값: %u)</translation>
</message>
<message>
- <source>Error initializing block database</source>
- <translation>ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ì´ˆê¸°í™”í•˜ëŠ”ë° ì˜¤ë¥˜</translation>
+ <source>Zapping all transactions from wallet...</source>
+ <translation>ì§€ê°‘ì˜ ëª¨ë“ ê±°ëž˜ë‚´ì—­ 건너뛰기...</translation>
</message>
<message>
- <source>Error loading block database</source>
- <translation>ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ë¶ˆëŸ¬ì˜¤ëŠ”ë° ì˜¤ë¥˜</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>ZeroMQ 알림 옵션:</translation>
</message>
<message>
- <source>Error opening block database</source>
- <translation>ë¸”ë¡ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ì—¬ëŠ”ë° ì˜¤ë¥˜</translation>
+ <source>Password for JSON-RPC connections</source>
+ <translation>JSON-RPC ì—°ê²°ì— ì‚¬ìš©í•  암호</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>오류: ë””ìŠ¤í¬ ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤!</translation>
+ <source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
+ <translation>ìµœê³ ì˜ ë¸”ëŸ­ì´ ë³€í•˜ë©´ ëª…ë ¹ì„ ì‹¤í–‰(cmd ì— ìžˆëŠ” %s 는 블럭 í•´ì‹œì— ì˜í•´ 대체ë˜ì–´ ì§)</translation>
</message>
<message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation>ì–´ë–¤ í¬íŠ¸ë„ ë°˜ì‘하지 않습니다. ì‚¬ìš©ìž ë°˜ì‘=0 만약 ì›í•œë‹¤ë©´</translation>
+ <source>Allow DNS lookups for -addnode, -seednode and -connect</source>
+ <translation>-addnode, -seednode, -connect ì˜µì…˜ì— ëŒ€í•´ DNS íƒìƒ‰ 허용</translation>
</message>
<message>
- <source>Importing...</source>
- <translation>들여오기 중...</translation>
+ <source>Loading addresses...</source>
+ <translation>주소를 불러오는 중...</translation>
</message>
<message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation>올바르지 않거나 ìƒì„±ëœ 블ë¡ì„ ì°¾ì„ ìˆ˜ 없습니다. ìž˜ëª»ëœ ë„¤íŠ¸ì›Œí¬ ìžë£Œ 디렉토리?</translation>
+ <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>Invalid -onion address: '%s'</source>
- <translation>ìž˜ëª»ëœ -onion 주소입니다: '%s'</translation>
+ <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfeeê°’ì´ ë„ˆë¬´ í½ë‹ˆë‹¤! í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ì— ë„ˆë¬´ í° ìˆ˜ìˆ˜ë£Œê°€ 지불 ë©ë‹ˆë‹¤.</translation>
</message>
<message>
- <source>Not enough file descriptors available.</source>
- <translation>사용 가능한 íŒŒì¼ ë””ìŠ¤í¬ë¦½í„°-File Descriptor-ê°€ 부족합니다. </translation>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfeeê°’ì´ ë„ˆë¬´ í½ë‹ˆë‹¤! ì´ ê°’ì€ ì†¡ê¸ˆí• ë•Œ 지불할 송금 수수료입니다.</translation>
</message>
<message>
- <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
- <translation>ë°ì´í„°ë² ì´ìŠ¤ 케시 í¬ê¸°ë¥¼ 메가바ì´íŠ¸ë¡œ 설정(%d 부터 %d, 기본값: %d)</translation>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>메모리 í’€ì— ìžˆëŠ” 트랜잭션 기ë¡ì„ &lt;n&gt;시간 후 부터는 유지하지 않기 (기본값: %u)</translation>
</message>
<message>
- <source>Set maximum block size in bytes (default: %d)</source>
- <translation>최대 ë¸”ë½ í¬ê¸°ë¥¼ Bytesë¡œ 지정하세요 (기본: %d)</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>해당 금액(%s/kB) 보다 ì ì€ 수수료는 수수료 면제로 간주ë©ë‹ˆë‹¤.(기본값: %s)</translation>
</message>
<message>
- <source>Specify wallet file (within data directory)</source>
- <translation>ë°ì´í„° í´ë” ì•ˆì— ì§€ê°‘ 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”.</translation>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>-checkblocksì„ í†µí•œ ë¸”ë¡ ì ê²€ (0-4, 기본값: %u)</translation>
</message>
<message>
- <source>Verifying blocks...</source>
- <translation>ë¸”ë¡ ê²€ì¦ì¤‘...</translation>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>getrawtransaction를 RPC CALL를 통해 완전한 트랜잭션 ì¸ë±ìŠ¤ 유지 (기본값: %u)</translation>
</message>
<message>
- <source>Verifying wallet...</source>
- <translation>지갑 ê²€ì¦ì¤‘...</translation>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>ì´ìƒí–‰ë™ì„ 하는 ë„¤íŠ¸ì›Œí¬ ì°¸ì—¬ìžë“¤ì„ 다시 ì—°ê²°ì‹œí‚¤ëŠ”ë° ê±¸ë¦¬ëŠ” 시간 (기본값: %u)</translation>
</message>
<message>
- <source>Wallet %s resides outside data directory %s</source>
- <translation>지갑 %s는 ë°ì´í„° 디렉토리 %s ë°–ì— ìœ„ì¹˜í•©ë‹ˆë‹¤.</translation>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>디버그 ì •ë³´ 출력 (기본값: %u, &lt;category&gt; ì œê³µì€ ì„ íƒìž…니다)</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>지갑 옵션:</translation>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>블룸필터를 통해 블ë¡ê³¼ 트랜잭션 í•„í„°ë§ ì§€ì› (기본값: %u)</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>-txindex를 바꾸기 위해서는 -reindex를 사용해서 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 재구성해야 합니다. </translation>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>ë„¤íŠ¸ì›Œí¬ ë²„ì „ ë¬¸ìž (%i)ì˜ ê¸¸ì´ê°€ ìµœëŒ€ê¸¸ì´ (%i)를 초과합니다. UAì½”ë©˜íŠ¸ì˜ ê°¯ìˆ˜ë‚˜ 길ì´ë¥¼ 줄ì´ì„¸ìš”.</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>ë°ì´í„° 디렉토리 %sì— ë½ì„ 걸 수 없었습니다. ë¹„íŠ¸ì½”ì¸ ì½”ì–´ê°€ ì´ë¯¸ 실행 ì¤‘ì¸ ê²ƒìœ¼ë¡œ 보입니다.</translation>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>아웃바운드 íŠ¸ëž˜í”½ì„ ì„¤ì •ëœ ëª©í‘œì¹˜ ì´í•˜ë¡œ 유지하기 (24시간당 MiB기준), 0 = 무제한 (기본값: %d)</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>ì´ ì‚¬í•­ê³¼ 관련있는 경고가 ë°œìƒí•˜ê±°ë‚˜ 아주 긴 í¬í¬ê°€ ë°œìƒí–ˆì„ ë•Œ 명령어를 실행해 주세요. (cmd 명령어 목ë¡ì—ì„œ %s는 메시지로 대체ë©ë‹ˆë‹¤) </translation>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>지ì›í•˜ì§€ 않는 ì¸ìˆ˜ -socks를 찾았습니다. ì„¤ì •ëœ SOCKSì˜ ë²„ì „ì€ ë”ì´ìƒ 사용할 수 없으며, SOCK5 프ë¡ì‹œë§Œì„ 지ì›í•©ë‹ˆë‹¤.</translation>
</message>
<message>
- <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
- <translation>최대 í¬ê¸°ë¥¼ 최우선으로 설정 / ë°”ì´íŠ¸ë‹¹ 최소 수수료로 거래(기본값: %d)</translation>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>지ì›í•˜ì§€ 않는 ì¸ìˆ˜ -whitelistalwaysrelay 는 무시ë©ë‹ˆë‹¤, -whitelistrelay 나 -whitelistforcerelay 를 사용해 주세요.</translation>
</message>
<message>
- <source>Information</source>
- <translation>ì •ë³´</translation>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Tor 서비스를 ì´ìš©í•˜ì—¬ 피어ì—게 연결하기 위해 ë¶„ë¦¬ëœ SOCKS5 프ë¡ì‹œë¥¼ 사용 (기본값: %s)</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>노드로 전달하기 위한 최저 거래 수수료가 부족합니다. - minrelaytxfee=&lt;amount&gt;: '%s' -</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>JSON-RPC ì—°ê²°ì‹œ ì‚¬ìš©ìž ì´ë¦„ê³¼ í•´ì‹œí™”ëœ ì•”í˜¸ë¬¸. &lt;userpw&gt; 필드는 &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt; í¬ë©§ìœ¼ë¡œ 구성ë˜ì–´ 있습니다. ì „í˜•ì  íŒŒì´ì¬ 스í¬ë¦½íŠ¸ì—ì„  share/rpcuserê°€ í¬í•¨ë˜ì–´ 있습니다. ì´ ì˜µì…˜ì€ ì—¬ëŸ¬ë²ˆ 지정할 수 있습니다.</translation>
</message>
<message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>최저 거래 수수료가 부족합니다. -mintxfee=&lt;amount&gt;: '%s'</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>경고: 알려지지 ì•Šì€ ë²„ì „ì˜ ë¸”ë¡ì´ 채굴ë˜ì—ˆìŠµë‹ˆë‹¤. 알려지지 ì•Šì€ ê·œì¹™ì´ ì ìš©ë˜ì—ˆì„ ê°€ëŠ¥ì„±ì´ ìžˆìŠµë‹ˆë‹¤.</translation>
</message>
<message>
- <source>RPC server options:</source>
- <translation>RPC 서버 설정</translation>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>DNS lookupì„ í†µí•´ í•­ìƒ í”¼ì–´ì£¼ì†Œì— ëŒ€í•œ 쿼리 보내기 (기본값: %u)</translation>
</message>
<message>
- <source>Send trace/debug info to console instead of debug.log file</source>
- <translation>추ì ì˜¤ë¥˜ 정보를 degug.log ìžë£Œë¡œ 보내는 대신 콘솔로 보내기</translation>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>시작시 ì ê²€í•  ë¸”ë¡ ê°¯ìˆ˜ (기본값: %u, 0 = 모ë‘)</translation>
</message>
<message>
- <source>Show all debugging options (usage: --help -help-debug)</source>
- <translation>모든 디버그 설정 보기(설정: --help -help-debug)</translation>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>디버그 ì¶œë ¥ì— IP주소 í¬í•¨í•˜ê¸° (기본값: %u)</translation>
</message>
<message>
- <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
- <translation>í´ë¼ì´ì–¸íŠ¸ 시작시 debug.log íŒŒì¼ ë¹„ìš°ê¸°(기본값: 디버그 안할때 1)</translation>
+ <source>Invalid -proxy address: '%s'</source>
+ <translation>ìž˜ëª»ëœ -proxy 주소입니다: '%s'</translation>
</message>
<message>
- <source>Signing transaction failed</source>
- <translation>거래를 ì„œëª…í•˜ëŠ”ê²ƒì„ ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤.</translation>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>JSON-RPC ì—°ê²°ì„ &lt;port&gt;í¬íŠ¸ë¡œ 받기 (기본값: %u í˜¹ì€ í…ŒìŠ¤íŠ¸ë„·: %u)</translation>
</message>
<message>
- <source>Transaction amount too small</source>
- <translation>ê±°ëž˜ëŸ‰ì´ ë„ˆë¬´ ì ìŠµë‹ˆë‹¤</translation>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>&lt;port&gt;í¬íŠ¸ë¡œ ì—°ê²° 받기 (기본값: %u í˜¹ì€ í…ŒìŠ¤íŠ¸ë„·: %u)</translation>
</message>
<message>
- <source>Transaction amounts must be positive</source>
- <translation>ê±°ëž˜ëŸ‰ì€ ë°˜ë“œì‹œ 정수여야합니다.</translation>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>피어 연결수를 &lt;n&gt;개로 유지 (기본값: %u)</translation>
</message>
<message>
- <source>Transaction too large</source>
- <translation>너무 í° ê±°ëž˜</translation>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>지갑 브로드ìºìŠ¤íŠ¸ íŠ¸ëžœìž­ì…˜ì„ ë§Œë“¤ê¸°</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>JSON-RPC ì—°ê²°ì— ì‚¬ìš©í•  ì‚¬ìš©ìž ì´ë¦„</translation>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>ì ‘ì†ë³„ 최대 수신 버í¼. &lt;n&gt; × 1000ë°”ì´íŠ¸ (기본값: %u)</translation>
</message>
<message>
- <source>Warning</source>
- <translation>경고</translation>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>ì ‘ì†ë³„ 최대 전송 버í¼. &lt;n&gt; × 1000ë°”ì´íŠ¸ (기본값: %u)</translation>
</message>
<message>
- <source>Zapping all transactions from wallet...</source>
- <translation>ì§€ê°‘ì˜ ëª¨ë“ ê±°ëž˜ë‚´ì—­ 건너뛰기...</translation>
+ <source>Prepend debug output with timestamp (default: %u)</source>
+ <translation>디버그 ì¶œë ¥ì— íƒ€ìž„ 스탬프 í¬í•¨í•˜ê¸° (기본값: %u)</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat 파ì¼ì´ ì†ìƒë˜ì—ˆê³  복구가 실패하였습니다.</translation>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>ë°ì´í„° 운송 íŠ¸ëžœìž­ì…˜ì„ ì¤‘ê³„ ë° ì±„êµ´ (기본값: %u)</translation>
</message>
<message>
- <source>Password for JSON-RPC connections</source>
- <translation>JSON-RPC ì—°ê²°ì— ì‚¬ìš©í•  암호</translation>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>비 P2SH ë‹¤ì¤‘ì„œëª…ì„ ì¤‘ê³„ (기본값: %u)</translation>
</message>
<message>
- <source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
- <translation>ìµœê³ ì˜ ë¸”ëŸ­ì´ ë³€í•˜ë©´ ëª…ë ¹ì„ ì‹¤í–‰(cmd ì— ìžˆëŠ” %s 는 블럭 í•´ì‹œì— ì˜í•´ 대체ë˜ì–´ ì§)</translation>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>키 í’€ 사ì´ì¦ˆë¥¼ &lt;n&gt; ë¡œ 설정 (기본값: %u)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>ë„ì›€ë§ ë©”ì‹œì§€ìž…ë‹ˆë‹¤</translation>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>ì›ê²© 프로시져 호출 서비스를 위한 쓰레드 개수를 설정 (기본값 : %d)</translation>
</message>
<message>
- <source>Allow DNS lookups for -addnode, -seednode and -connect</source>
- <translation>-addnode, -seednode, -connect ì˜µì…˜ì— ëŒ€í•´ DNS íƒìƒ‰ 허용</translation>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>ì„¤ì •íŒŒì¼ ì§€ì • (기본값: %s)</translation>
</message>
<message>
- <source>Loading addresses...</source>
- <translation>주소를 불러오는 중...</translation>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>밀리초 단위로 ì—°ê²° ì œí•œì‹œê°„ì„ ì„¤ì • (최소값: 1, 기본값: %d)</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>wallet.dat 불러오기 ì—러: 지갑 오류</translation>
+ <source>Specify pid file (default: %s)</source>
+ <translation>pid íŒŒì¼ ì§€ì • (기본값: %s)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>wallet.dat 불러오기 ì—러</translation>
+ <source>Spend unconfirmed change when sending transactions (default: %u)</source>
+ <translation>íŠ¸ëžœìž­ì…˜ì„ ë³´ë‚¼ ë•Œ ê²€ì¦ë˜ì§€ ì•Šì€ ìž”ëˆ ì“°ê¸° (기본값: %u)</translation>
</message>
<message>
- <source>Invalid -proxy address: '%s'</source>
- <translation>ìž˜ëª»ëœ -proxy 주소입니다: '%s'</translation>
+ <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>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>-bind 주소를 확ì¸í•  수 없습니다: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>-externalip 주소를 확ì¸í•  수 없습니다: '%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_ku_IQ.ts b/src/qt/locale/bitcoin_ku_IQ.ts
new file mode 100644
index 0000000000..da5e41a358
--- /dev/null
+++ b/src/qt/locale/bitcoin_ku_IQ.ts
@@ -0,0 +1,272 @@
+<TS language="ku_IQ" version="2.1">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Create a new address</source>
+ <translation>ناوونیشانێکی نوێ دروست بکە</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;نوێ</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;ڕوونووس</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>C&amp;داخستن</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;هەناردن</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;سڕینەوە</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ </context>
+<context>
+ <name>BanTableModel</name>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;ناردن</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;پەرگە</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation>&amp;سازکارییەکان</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;یارمەتی</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Ù‡Û•ÚµÛ•</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>ئاگاداری</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>زانیاری</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Amount:</source>
+ <translation>Ú©Û†:</translation>
+ </message>
+ <message>
+ <source>Priority:</source>
+ <translation>لەپێشی:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>تێچوون:</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation>سەرجەم</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation>رێکەت</translation>
+ </message>
+ <message>
+ <source>Priority</source>
+ <translation>لەپێشی</translation>
+ </message>
+</context>
+<context>
+ <name>EditAddressDialog</name>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ <message>
+ <source>name</source>
+ <translation>ناو</translation>
+ </message>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ <message>
+ <source>version</source>
+ <translation>وەشان</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>بەخێربێن</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Ù‡Û•ÚµÛ•</translation>
+ </message>
+ </context>
+<context>
+ <name>OpenURIDialog</name>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Options</source>
+ <translation>هەڵبژاردنەکان</translation>
+ </message>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ <message>
+ <source>Total:</source>
+ <translation>گشتی</translation>
+ </message>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ </context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Amount</source>
+ <translation>سەرجەم</translation>
+ </message>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>&amp;Information</source>
+ <translation>&amp;زانیاری</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>ناو</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>وەشان</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;کردنەوە</translation>
+ </message>
+ <message>
+ <source>&amp;Clear</source>
+ <translation>&amp;پاککردنەوە</translation>
+ </message>
+ <message>
+ <source>Totals</source>
+ <translation>گشتییەکان</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>بەڵێ</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>نەخێر</translation>
+ </message>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ <message>
+ <source>&amp;Amount:</source>
+ <translation>&amp;سەرجەم:</translation>
+ </message>
+ <message>
+ <source>&amp;Message:</source>
+ <translation>&amp;پەیام:</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>پاککردنەوە</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation>پیشاندان</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>سڕینەوە</translation>
+ </message>
+</context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message>
+ <source>Amount:</source>
+ <translation>Ú©Û†:</translation>
+ </message>
+ <message>
+ <source>Priority:</source>
+ <translation>لەپێشی:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>تێچوون:</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>خێرا</translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>Message:</source>
+ <translation>پەیام:</translation>
+ </message>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ </context>
+<context>
+ <name>SplashScreen</name>
+ </context>
+<context>
+ <name>TrafficGraphWidget</name>
+ </context>
+<context>
+ <name>TransactionDescDialog</name>
+ </context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Options:</source>
+ <translation>هەڵبژاردنەکان:</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>زانیاری</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>ئاگاداری</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Ù‡Û•ÚµÛ•</translation>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ky.ts b/src/qt/locale/bitcoin_ky.ts
index 495f11b1f4..14cb9c2020 100644
--- a/src/qt/locale/bitcoin_ky.ts
+++ b/src/qt/locale/bitcoin_ky.ts
@@ -9,17 +9,6 @@
<source>&amp;Delete</source>
<translation>Ө&amp;чүрүү</translation>
</message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Address</source>
- <translation>Дарек</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(аты жок)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -71,22 +60,11 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Date</source>
<translation>Дата</translation>
</message>
- <message>
- <source>none</source>
- <translation>жок</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(аты жок)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -94,7 +72,7 @@
<source>&amp;Address</source>
<translation>&amp;Дарек</translation>
</message>
- </context>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -126,6 +104,10 @@
<translation>&amp;Тармак</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>Капчык</translation>
+ </message>
+ <message>
<source>&amp;Port:</source>
<translation>&amp;Порт:</translation>
</message>
@@ -154,18 +136,12 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
<source>&amp;Information</source>
@@ -176,6 +152,10 @@
<translation>Жалпы</translation>
</message>
<message>
+ <source>Network</source>
+ <translation>&amp;Тармак</translation>
+ </message>
+ <message>
<source>Name</source>
<translation>ÐÑ‚Ñ‹</translation>
</message>
@@ -194,32 +174,13 @@
</context>
<context>
<name>ReceiveCoinsDialog</name>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Дарек</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Билдирүү</translation>
+ <source>&amp;Message:</source>
+ <translation>Билдирүү:</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Билдирүү</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(аты жок)</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -231,11 +192,7 @@
<source>S&amp;end</source>
<translation>&amp;Жөнөтүү</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation>(аты жок)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -268,54 +225,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>%1/offline</source>
- <translation>%1/тармакта ÑмеÑ</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Билдирүү</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Дарек</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Information</source>
diff --git a/src/qt/locale/bitcoin_la.ts b/src/qt/locale/bitcoin_la.ts
index f775002050..dc532fe011 100644
--- a/src/qt/locale/bitcoin_la.ts
+++ b/src/qt/locale/bitcoin_la.ts
@@ -10,10 +10,6 @@
<translation>Copia inscriptionem iam selectam in latibulum systematis</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copia Inscriptionem</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Dele active selectam inscriptionem ex enumeratione</translation>
</message>
@@ -29,37 +25,6 @@
<source>&amp;Delete</source>
<translation>&amp;Dele</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>Hae sunt inscriptiones mittendi pensitationes. Semper inspice quantitatem et inscriptionem accipiendi antequam nummos mittis.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copia &amp;Titulum</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Muta</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma Separata Plica (*.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Titulus</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Inscriptio</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nullus titulus)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -79,82 +44,6 @@
<source>Repeat new passphrase</source>
<translation>Itera novam tesseram</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Cifra cassidile</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Huic operationi necesse est tessera cassidili tuo ut cassidile reseret.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Resera cassidile</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Huic operationi necesse est tessera cassidili tuo ut cassidile decifret.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Decifra cassidile</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Muta tesseram</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirma cifrationem cassidilis</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation>Monitio: Si cassidile tuum cifras et tesseram amittis, tu &lt;b&gt;AMITTES OMNES TUOS NUMMOS BITOS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Certusne es te velle tuum cassidile cifrare?</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>GRAVE: Oportet ulla prioria conservata quae fecisti de plica tui cassidilis reponi a nove generata cifrata plica cassidilis. Propter securitatem, prioria conservata de plica non cifrata cassidilis inutilia fiet simul atque incipis uti novo cifrato cassidili.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Monitio: Litterae ut capitales seratae sunt!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Cassidile cifratum</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Cassidile cifrare abortum est</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Cassidile cifrare abortum est propter internum errorem. Tuum cassidile cifratum non est.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Tesserae datae non eaedem sunt.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Cassidile reserare abortum est.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Tessera inserta pro cassidilis decifrando prava erat.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Cassidile decifrare abortum est.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Tessera cassidilis successa est in mutando.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -218,10 +107,6 @@
<translation>&amp;Muta tesseram...</translation>
</message>
<message>
- <source>Importing blocks from disk...</source>
- <translation>Importans frusta ab disco...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Recreans indicem frustorum in disco...</translation>
</message>
@@ -302,8 +187,8 @@
<translation>Tabella instrumentorum "Tabs"</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Nucleus</translation>
+ <source>&amp;Command-line options</source>
+ <translation>Optiones mandati initiantis</translation>
</message>
<message>
<source>No block source available...</source>
@@ -359,13 +244,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Monitio Retis</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
@@ -383,26 +261,6 @@
<source>Confirmed</source>
<translation>Confirmatum</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copia inscriptionem</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copia titulum</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia quantitatem</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copia transactionis ID</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nullus titulus)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -418,38 +276,6 @@
<source>&amp;Address</source>
<translation>&amp;Inscriptio</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nova inscriptio accipiendi</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nova inscriptio mittendi</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Muta inscriptionem accipiendi</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Muta inscriptionem mittendi</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Inserta inscriptio "%1" iam in libro inscriptionum est.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Inscriptio inserta "%1" non valida inscriptio Bitcoin est.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Non potuisse cassidile reserare</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Generare novam clavem abortum est.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -457,10 +283,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Nucleus</translation>
- </message>
- <message>
<source>version</source>
<translation>versio</translation>
</message>
@@ -476,14 +298,10 @@
<source>command-line options</source>
<translation>Optiones mandati intiantis</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Nucleus</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
@@ -514,6 +332,10 @@
<translation>&amp;Rete</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>Cassidile</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>Aperi per se portam clientis Bitcoin in itineratore. Hoc tantum effectivum est si itineratrum tuum supportat UPnP et id activum est.</translation>
</message>
@@ -606,17 +428,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Tractatio URI</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Bitcoin incipere non potest: cliccare-ad-pensandum handler</translation>
- </message>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -631,19 +442,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>Save QR Code</source>
- <translation>Salva codicem QR</translation>
- </message>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nomen clientis</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -656,8 +456,8 @@
<translation>&amp;Informatio</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Utens OpenSSL versione</translation>
+ <source>Debug window</source>
+ <translation>Fenestra Debug</translation>
</message>
<message>
<source>Startup time</source>
@@ -692,10 +492,6 @@
<translation>&amp;Terminale</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Dies aedificandi</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Debug catalogi plica</translation>
</message>
@@ -715,66 +511,23 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>&amp;Titulus:</translation>
+ <source>&amp;Amount:</source>
+ <translation>Quantitas:</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Copia titulum</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;Titulus:</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Copia quantitatem</translation>
+ <source>&amp;Message:</source>
+ <translation>Nuntius:</translation>
</message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Inscriptio</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Quantitas</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Titulus</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Nuntius</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Resultato URI nimis longo, conare minuere verba pro titulo / nuntio.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Error codificandi URI in codicem QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dies</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Titulus</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Nuntius</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Quantitas</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nullus titulus)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Copia Inscriptionem</translation>
</message>
</context>
<context>
@@ -784,10 +537,18 @@
<translation>Mitte Nummos</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>Inopia nummorum</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>Quantitas:</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Transactionis merces:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Mitte pluribus accipientibus simul</translation>
</message>
@@ -811,31 +572,7 @@
<source>S&amp;end</source>
<translation>&amp;Mitte</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirma mittendum nummorum</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia quantitatem</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Quantitas est ultra quod habes.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Quantitas est ultra quod habes cum merces transactionis %1 includitur.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nullus titulus)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -847,10 +584,6 @@
<translation>Pensa &amp;Ad:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Insero titulum huic inscriptioni ut eam in tuum librum inscriptionum addas.</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Titulus:</translation>
</message>
@@ -870,6 +603,10 @@
<source>Message:</source>
<translation>Nuntius:</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Pensa Ad:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -940,66 +677,10 @@
<source>Reset all verify message fields</source>
<translation>Reconstitue omnes campos verificandi nuntii</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Clicca "Signa Nuntium" ut signatio generetur</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Inscriptio inserta non valida est.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Sodes inscriptionem proba et rursus conare.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Inserta inscriptio clavem non refert.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Cassidilis reserare cancellatum est.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Clavis privata absens est pro inserta inscriptione.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Nuntium signare abortum est.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Nuntius signatus.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Signatio decodificari non potuit.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Sodes signationem proba et rursus conare.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Signatio non convenit digesto nuntii</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Nuntium verificare abortum est.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Nuntius verificatus.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Nucleus</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1008,362 +689,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Apertum donec %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/non conecto</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/non confirmata</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmationes</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dies</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Fons</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generatum</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Ab</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Ad</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>inscriptio propria</translation>
- </message>
- <message>
- <source>label</source>
- <translation>titulus</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Creditum</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>non acceptum</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debitum</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Transactionis merces</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Cuncta quantitas</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Nuntius</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Annotatio</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID transactionis</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Informatio de debug</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transactio</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Lectenda</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Quantitas</translation>
- </message>
- <message>
- <source>true</source>
- <translation>verum</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falsum</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, nondum prospere disseminatum est</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>ignotum</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Particularia transactionis</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Haec tabula monstrat descriptionem verbosam transactionis</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dies</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typus</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Apertum donec %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmatum (%1 confirmationes)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Hoc frustum non acceptum est ab ulla alia nodis et probabiliter non acceptum erit!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Acceptum ab</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Missum ad</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pensitatio ad te ipsum</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Fossa</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Status transactionis. Supervola cum mure ut monstretur numerus confirmationum.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Dies et tempus quando transactio accepta est.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Typus transactionis.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Quantitas remota ex pendendo aut addita ei.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Omne</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Hodie</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Hac hebdomade</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Hoc mense</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Postremo mense</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Hoc anno</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Intervallum...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Acceptum cum</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Missum ad</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Ad te ipsum</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Fossa</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Alia</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Insere inscriptionem vel titulum ut quaeras</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Quantitas minima</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copia inscriptionem</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copia titulum</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copia quantitatem</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copia transactionis ID</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Muta titulum</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Monstra particularia transactionis</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma Separata Plica (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmatum</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dies</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typus</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Titulus</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Inscriptio</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Intervallum:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>ad</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Mitte Nummos</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exporta</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporta data in hac tabella in plicam</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Conserva cassidile</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Data cassidilis (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Conservare abortum est.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Successum in conservando</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1394,6 +729,10 @@
<translation>Accipe conexiones externas (praedefinitum: 1 nisi -proxy neque -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Nucleus</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>
@@ -1406,10 +745,6 @@
<translation>Hoc est prae-dimittum experimentala aedes - utere eo periculo tuo proprio - nolite utere fodendo vel applicationibus mercatoriis</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>Monitio: wallet.data corrupta, data salvata! Originalis wallet.dat salvata ut wallet.{timestamp}.bak in %s; si pendendum tuum vel transactiones pravae sunt, oportet ab conservato restituere.</translation>
- </message>
- <message>
<source>Block creation options:</source>
<translation>Optiones creandi frustorum:</translation>
</message>
@@ -1466,14 +801,6 @@
<translation>Informatio</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Quantitas non valida pro -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Quantitas non valida pro -mintxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Mitte informationem vestigii/debug ad terminale potius quam plicam debug.log</translation>
</message>
@@ -1506,10 +833,6 @@
<translation>Monitio</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrupta, salvare abortum est</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Tessera pro conexionibus JSON-RPC</translation>
</message>
@@ -1518,10 +841,6 @@
<translation>Pelle mandatum quando optissimum frustum mutat (%s in mandato substituitur ab hash frusti)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Hic nuntius auxilii</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permitte quaerenda DNS pro -addnode, -seednode, et -connect</translation>
</message>
@@ -1530,14 +849,6 @@
<translation>Legens inscriptiones...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Error legendi wallet.dat: Cassidile corruptum</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Error legendi wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Inscriptio -proxy non valida: '%s'</translation>
</message>
@@ -1546,18 +857,6 @@
<translation>Ignotum rete specificatum in -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Non posse resolvere -bind inscriptonem: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Non posse resolvere -externalip inscriptionem: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Quantitas non valida pro -paytxfee=&lt;quantitas&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Inopia nummorum</translation>
</message>
diff --git a/src/qt/locale/bitcoin_lt.ts b/src/qt/locale/bitcoin_lt.ts
index c125d1b72b..1f6cda1f52 100644
--- a/src/qt/locale/bitcoin_lt.ts
+++ b/src/qt/locale/bitcoin_lt.ts
@@ -26,14 +26,14 @@
<translation>&amp;Užverti</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopijuoti adresÄ…</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Ištrinti pasirinktą adresą iš sąrašo</translation>
</message>
<message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Eksportuoti informaciją iš dabartinės lentelės į failą</translation>
+ </message>
+ <message>
<source>&amp;Export</source>
<translation>&amp;Eksportuoti</translation>
</message>
@@ -41,61 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Trinti</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Pasirinkite adresą kuriam siūsite monetas</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>P&amp;asirinkti</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>SiunÄiami adresai</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Gaunami adresai</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopijuoti ž&amp;ymę</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Keisti</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Eksportuoti adresų sąrašą</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kableliais atskirtų duomenų failas (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Eksportavimas nepavyko</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Bandant išsaugoti adresų sąrašą - įvyko klaida keliant į %1. Prašome bandyti dar kartą.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Žymė</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresas</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nėra žymės)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -115,82 +60,14 @@
<source>Repeat new passphrase</source>
<translation>Pakartokite naujÄ… slaptafrazÄ™</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Užšifruoti piniginę</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ši operacija reikalauja jūsų piniginės slaptafrazės jai atrakinti.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Atrakinti piniginÄ™</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ši operacija reikalauja jūsų piniginės slaptafrazės jai iššifruoti.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>IÅ¡Å¡ifruoti piniginÄ™</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Pakeisti slaptafrazÄ™</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Patvirtinkite piniginės užšifravimą</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>Dėmesio: jei užšifruosite savo piniginę ir pamesite slaptafrazę, jūs&lt;b&gt;PRARASITE VISUS SAVO BITCOINUS&lt;/b&gt;! </translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Ar tikrai norite Å¡ifruoti savo piniginÄ™?</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Įspėjimas: įjungtas Caps Lock klavišas!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Piniginė užšifruota</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Nepavyko užšifruoti piniginę</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Dėl vidinės klaidos nepavyko užšifruoti piniginę.Piniginė neužšifruota.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Įvestos slaptafrazės nesutampa.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Nepavyko atrakinti piniginÄ™</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Neteisingai įvestas slaptažodis piniginės iššifravimui.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Nepavyko iššifruoti piniginės</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Piniginės slaptažodis sėkmingai pakeistas.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
- </context>
+ <message>
+ <source>Banned Until</source>
+ <translation>Užblokuotas iki</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -230,6 +107,10 @@
<translation>IÅ¡jungti programÄ…</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Apie %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Apie &amp;Qt</translation>
</message>
@@ -266,14 +147,6 @@
<translation>Atidaryti &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core klientas</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Blokai importuojami iš disko...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Blokai iš naujo indeksuojami...</translation>
</message>
@@ -318,10 +191,6 @@
<translation>&amp;Gauti</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Rodyti informacijÄ… apie Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Rodyti / SlÄ—pti</translation>
</message>
@@ -350,12 +219,8 @@
<translation>Kortelių įrankinė</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin branduolys</translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Apie Bitcoin Core</translation>
+ <source>&amp;Command-line options</source>
+ <translation>KomandinÄ—s eilutÄ—s parametrai</translation>
</message>
<message>
<source>Error</source>
@@ -395,13 +260,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Tinklo įspėjimas</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -467,91 +325,7 @@
<source>Priority</source>
<translation>Pirmumas</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopijuoti adresÄ…</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopijuoti žymę</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopijuoti sumÄ…</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopijuoti kiekį</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopijuoti mokestį</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopijuoti po mokesÄio</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopijuoti baitus</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopijuoti pirmumÄ…</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>auksÄiausias</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>aukštesnis</translation>
- </message>
- <message>
- <source>high</source>
- <translation>aukštas</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>vidutiniškai aukštas</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>vidutiniškai</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>žemai-vidutiniškas</translation>
- </message>
- <message>
- <source>low</source>
- <translation>žemas</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>žemesnis</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>žemiausias</translation>
- </message>
- <message>
- <source>none</source>
- <translation>niekas</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>taip</translation>
- </message>
- <message>
- <source>no</source>
- <translation>ne</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nėra žymės)</translation>
- </message>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -566,38 +340,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresas</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Naujas gavimo adresas</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Naujas siuntimo adresas</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Keisti gavimo adresÄ…</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Keisti siuntimo adresÄ…</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Įvestas adresas „%1“ jau yra adresų knygelėje.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Įvestas adresas „%1“ nėra galiojantis Bitcoin adresas.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Nepavyko atrakinti piniginÄ—s.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Naujo rakto generavimas nepavyko.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -609,18 +351,10 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin branduolys</translation>
- </message>
- <message>
<source>version</source>
<translation>versija</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Apie Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>KomandinÄ—s eilutÄ—s parametrai</translation>
</message>
@@ -632,7 +366,7 @@
<source>command-line options</source>
<translation>komandinÄ—s eilutÄ—s parametrai</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -640,14 +374,6 @@
<translation>Sveiki</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Sveiki atvykę į Bitcoin Core.</translation>
- </message>
- <message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin branduolys</translation>
- </message>
- <message>
<source>Error</source>
<translation>Klaida</translation>
</message>
@@ -666,10 +392,26 @@
<translation>&amp;PagrindinÄ—s</translation>
</message>
<message>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation>Proxy IP adresas (Pvz. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation>&amp;Atstatyti Parinktis</translation>
+ </message>
+ <message>
<source>&amp;Network</source>
<translation>&amp;Tinklas</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>PiniginÄ—</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>Automatiškai atidaryti Bitcoin kliento prievadą maršrutizatoriuje. Tai veikia tik tada, kai jūsų maršrutizatorius palaiko UPnP ir ji įjungta.</translation>
</message>
@@ -690,6 +432,18 @@
<translation>Tarpinio serverio preivadas (pvz, 9050)</translation>
</message>
<message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Langas</translation>
</message>
@@ -742,6 +496,14 @@
<translation>Patvirtinti nustatymų atstatymą</translation>
</message>
<message>
+ <source>Client restart required to activate changes.</source>
+ <translation>Kliento perkrovimas reikalingas nustatymų aktyvavimui</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation>Šis pakeitimas reikalautų kliento perkrovimo</translation>
+ </message>
+ <message>
<source>The supplied proxy address is invalid.</source>
<translation>Nurodytas tarpinio serverio adresas negalioja.</translation>
</message>
@@ -757,6 +519,10 @@
<translation>Galimi:</translation>
</message>
<message>
+ <source>Your current spendable balance</source>
+ <translation>Jūsų dabartinis išleidžiamas balansas</translation>
+ </message>
+ <message>
<source>Pending:</source>
<translation>Laukiantys:</translation>
</message>
@@ -774,21 +540,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI apdorojimas</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>MokÄ—jimo siuntimas atmestas</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Tinklo užklausos klaida</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -811,19 +562,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>Save QR Code</source>
- <translation>Įrašyti QR kodą</translation>
- </message>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Kliento pavadinimas</translation>
- </message>
- <message>
<source>N/A</source>
<translation>nÄ—ra</translation>
</message>
@@ -836,8 +576,8 @@
<translation>&amp;Informacija</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Naudojama OpenSSL versija</translation>
+ <source>Debug window</source>
+ <translation>Derinimo langas</translation>
</message>
<message>
<source>Startup time</source>
@@ -848,6 +588,10 @@
<translation>Tinklas</translation>
</message>
<message>
+ <source>Name</source>
+ <translation>Pavadinimas</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation>Prisijungimų kiekis</translation>
</message>
@@ -884,12 +628,12 @@
<translation>&amp;KonsolÄ—</translation>
</message>
<message>
- <source>Totals</source>
- <translation>Viso:</translation>
+ <source>&amp;Clear</source>
+ <translation>IÅ¡valyti</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Kompiliavimo data</translation>
+ <source>Totals</source>
+ <translation>Viso:</translation>
</message>
<message>
<source>Debug log file</source>
@@ -919,26 +663,34 @@
<source>never</source>
<translation>Niekada</translation>
</message>
+ <message>
+ <source>Yes</source>
+ <translation>Taip</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Ne</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>Ž&amp;ymė:</translation>
+ <source>&amp;Amount:</source>
+ <translation>Suma:</translation>
</message>
<message>
- <source>Clear</source>
- <translation>IÅ¡valyti</translation>
+ <source>&amp;Label:</source>
+ <translation>Ž&amp;ymė:</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Kopijuoti žymę</translation>
+ <source>&amp;Message:</source>
+ <translation>Žinutė:</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Kopijuoti sumÄ…</translation>
+ <source>Clear</source>
+ <translation>IÅ¡valyti</translation>
</message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
@@ -946,51 +698,8 @@
<translation>QR kodas</translation>
</message>
<message>
- <source>Payment information</source>
- <translation>MokÄ—jimo informacija</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresas</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Suma</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Žymė</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Žinutė</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Klaida, koduojant URI į QR kodą.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Žymė</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Žinutė</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Suma</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nėra žymės)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Kopijuoti adresÄ…</translation>
</message>
</context>
<context>
@@ -1000,6 +709,10 @@
<translation>Siųsti monetas</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>Nepakanka lėšų</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Kiekis:</translation>
</message>
@@ -1028,6 +741,10 @@
<translation>Graža:</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Sandorio mokestis:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Siųsti keliems gavėjams vienu metu</translation>
</message>
@@ -1051,51 +768,7 @@
<source>S&amp;end</source>
<translation>&amp;Siųsti</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Patvirtinti monetų siuntimą</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopijuoti kiekį</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopijuoti sumÄ…</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopijuoti mokestį</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopijuoti po mokesÄio</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopijuoti baitus</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopijuoti pirmumÄ…</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Suma viršija jūsų balansą.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Jei pridedame sandorio mokestį %1 bendra suma viršija jūsų balansą.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(nėra žymės)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -1107,10 +780,6 @@
<translation>MokÄ—ti &amp;gavÄ—jui:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Įveskite žymę šiam adresui kad galėtumėte įtraukti ją į adresų knygelę</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>Ž&amp;ymė:</translation>
</message>
@@ -1130,6 +799,10 @@
<source>Message:</source>
<translation>Žinutė:</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>MokÄ—ti gavÄ—jui:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -1177,57 +850,13 @@
<translation>Patikrinkite žinutę, jog įsitikintumėte, kad ją pasirašė nurodytas Bitcoin adresas</translation>
</message>
<message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Spragtelėkite "Registruotis žinutę" tam, kad gauti parašą</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Įvestas adresas negalioja.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Prašom patikrinti adresą ir bandyti iš naujo.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Piniginės atrakinimas atšauktas.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Žinutės pasirašymas nepavyko.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Žinutė pasirašyta.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Nepavyko iškoduoti parašo.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Prašom patikrinti parašą ir bandyti iš naujo.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Parašas neatitinka žinutės.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Žinutės tikrinimas nepavyko.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Žinutė patikrinta.</translation>
+ <source>Verify &amp;Message</source>
+ <translation>&amp;Patikrinti žinutę</translation>
</message>
-</context>
+ </context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin branduolys</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testavimotinklas]</translation>
</message>
@@ -1240,354 +869,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Atidaryta iki %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/neprisijungęs</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/nepatvirtintas</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 patvirtinimų</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>BÅ«sena</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Å altinis</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Sugeneruotas</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Nuo</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Kam</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>savo adresas</translation>
- </message>
- <message>
- <source>label</source>
- <translation>žymė</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Kreditas</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>nepriimta</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debitas</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Sandorio mokestis</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Neto suma</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Žinutė</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Komentaras</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Sandorio ID</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Derinimo informacija</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Sandoris</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Suma</translation>
- </message>
- <message>
- <source>true</source>
- <translation>tiesa</translation>
- </message>
- <message>
- <source>false</source>
- <translation>netiesa</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, transliavimas dar nebuvo sÄ—kmingas</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>nežinomas</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Sandorio detelÄ—s</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Šis langas sandorio detalų aprašymą</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipas</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Atidaryta iki %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Patvirtinta (%1 patvirtinimai)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Šis blokas negautas nė vienu iš mazgų ir matomai nepriimtas</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Gauta iš</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Išsiųsta</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>MokÄ—jimas sau</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>IÅ¡gauta</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>nepasiekiama</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Sandorio bÅ«klÄ—. Užvedus pelÄ—s žymeklį ant Å¡ios srities matysite patvirtinimų skaiÄių.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Sandorio gavimo data ir laikas</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Sandorio tipas.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Suma pridÄ—ta ar iÅ¡skaiÄiuota iÅ¡ balanso</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Visi</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Å iandien</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Å iÄ… savaitÄ™</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Šį mėnesį</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Paskutinį mėnesį</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Å iais metais</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Intervalas...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Gauta su</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Išsiųsta</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Skirta sau</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>IÅ¡gauta</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Kita</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Įveskite adresą ar žymę į paiešką</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimali suma</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopijuoti adresÄ…</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopijuoti žymę</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopijuoti sumÄ…</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Taisyti žymę</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Rodyti sandÄ—rio detales</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Eksportavimas nepavyko</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kableliais atskirtų duomenų failas (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Patvirtintas</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipas</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Žymė</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresas</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>GrupÄ—:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>skirta</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Siųsti monetas</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Eksportuoti</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Backup piniginÄ™</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>PiniginÄ—s duomenys (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Nepavyko padaryti atsarginÄ—s kopijos</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>AtsarginÄ— kopija sÄ—kmingai padaryta</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1610,6 +901,10 @@
<translation>Dirbti fone kaip šešėlyje ir priimti komandas</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin branduolys</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>Prisijungti tik prie nurodyto mazgo</translation>
</message>
@@ -1646,10 +941,6 @@
<translation>Slaptažodis JSON-RPC sujungimams</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Pagelbos žinutė</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Leisti DNS paiešką sujungimui ir mazgo pridėjimui</translation>
</message>
@@ -1658,22 +949,10 @@
<translation>Užkraunami adresai...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation> wallet.dat pakrovimo klaida, wallet.dat sugadintas</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation> wallet.dat pakrovimo klaida</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Neteisingas proxy adresas: '%s'</translation>
</message>
<message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neteisinga suma -paytxfee=&lt;amount&gt;: '%s'</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 2d3eab3394..38333531e4 100644
--- a/src/qt/locale/bitcoin_lv_LV.ts
+++ b/src/qt/locale/bitcoin_lv_LV.ts
@@ -22,10 +22,6 @@
<translation>&amp;Aizvērt</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopēt adresi</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>IzdzÄ“st iezÄ«mÄ“tÄs adreses no saraksta</translation>
</message>
@@ -41,73 +37,6 @@
<source>&amp;Delete</source>
<translation>&amp;Dzēst</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Izvēlies adresi uz kuru sūtīt bitcoins</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Izvēlies adresi ar kuru saņemt bitcoins</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Izvēlēties</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Sūtīšanas adreses</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Saņemšanas adreses</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>Å Ä«s ir jÅ«su Bitcoin adreses maksÄjumu sÅ«tÄ«Å¡anai. VienmÄ“r pÄrbaudiet summu un saņēmÄ“ja adresi pirms monÄ“tu sÅ«tÄ«Å¡anas.</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>Å Ä«s ir jÅ«su Bitcoin adreses maksÄjumu saņemÅ¡anai. Ir ieteicams katram darÄ«jumam izmantot jaunu saņemÅ¡anas adresi.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopēt &amp;Nosaukumu</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Rediģēt</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Eksportēt Adrešu Sarakstu</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fails ar komatu kÄ atdalÄ«tÄju (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>EksportÄ“Å¡ana NeizdevÄs</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>RadÄs kļūda, saglabÄjot adreÅ¡u sarakstu %1. LÅ«dzu, mÄ“Ä£iniet vÄ“lreiz!</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Nosaukums</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adrese</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez nosaukuma)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -127,90 +56,6 @@
<source>Repeat new passphrase</source>
<translation>JaunÄ parole vÄ“lreiz</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Šifrēt maciņu</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Lai veikto Å¡o darbÄ«bu, maciņš jÄatslÄ“dz ar paroli.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Atslēgt maciņu</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Å ai darbÄ«bai maciņš jÄatÅ¡ifrÄ“ ar maciņa paroli.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Atšifrēt maciņu</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Mainīt paroli</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>ApstiprinÄt maciņa Å¡ifrÄ“Å¡anu</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>BrÄ«dinÄjums: Ja tu noÅ¡ifrÄ“ savu maciņu un pazaudÄ“ paroli, tu &lt;b&gt;PAZAUDÄ’SI VISAS SAVAS BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Vai tu tieÅ¡Äm vÄ“lies Å¡ifrÄ“t savu maciņu?</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 tiks aizvÄ“rts, lai pabeigtu Å¡ifrÄ“Å¡ansa procesu. Atcerieties, ka jÅ«su maka Å¡ifrÄ“Å¡ana nevar pilnÄ«bÄ pasargÄt jÅ«su monÄ“tas no to nozagaÅ¡anas, inficÄ“jot datoru ar ļaunprÄtÄ«gÄm programmÄm.</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>SVARĪGI: IepriekÅ¡Ä“jie maka faila dublÄ“jumi ir jÄaizvieto ar jauno, Å¡ifrÄ“to maka failu. DroÅ¡Ä«bas apsvÄ“rumu dēļ iepriekÅ¡Ä“jie neÅ¡ifrÄ“tÄ maka dublÄ“jumi vairs nebÅ«s derÄ«gi, tiklÄ«dz sÄksiet izmantot jauno, Å¡ifrÄ“to maku.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>BrÄ«dinÄjums: Caps Lock ir ieslÄ“gts!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Maciņš nošifrēts</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Ievadiet veco un jauno maka paroli.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Maciņa Å¡ifrÄ“Å¡ana neizdevÄs</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Maciņa Å¡ifrÄ“Å¡ana neizdevÄs programmas kļūdas dēļ. JÅ«su maciņš netika Å¡ifrÄ“ts.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>IevadÄ«tÄs paroles nav vienÄdas.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Maciņu atÅ¡ifrÄ“t neizdevÄs</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Maciņa atÅ¡ifrÄ“Å¡anai ievadÄ«tÄ parole nav pareiza.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Maciņu neizdevÄs atÅ¡ifrÄ“t</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Maciņa parole tika veiksmīgi nomainīta.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -290,14 +135,6 @@
<translation>Atvērt &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core klients</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importē blokus no diska...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Bloku reindeksēšana no diska...</translation>
</message>
@@ -342,10 +179,6 @@
<translation>&amp;Saņemt</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>ParÄdÄ«t informÄciju par Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;RÄdÄ«t / PaslÄ“pt</translation>
</message>
@@ -382,18 +215,10 @@
<translation>Ciļņu rīkjosla</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>PieprasÄ«t maksÄjumus (izveido QR kodu un bitcoin: URIs)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>Par &amp;Bitcoin Core</translation>
- </message>
- <message>
<source>Open a bitcoin: URI or payment request</source>
<translation>AtvÄ“rt bitcoin URI vai maksÄjuma pieprasÄ«jumu</translation>
</message>
@@ -455,13 +280,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>TÄ«kla brÄ«dinÄjums</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -523,118 +341,6 @@
<source>Priority</source>
<translation>PrioritÄte</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopēt adresi</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopēt nosaukumu</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopēt daudzumu</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopēt transakcijas ID</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Aizslēgt neiztērēto</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Atslēgt neiztērēto</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopēt daudzumu</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopēt maksu</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopēt pēc maksas</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopēt baitus</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>KopÄ“t prioritÄti</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopēt atlikumu</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>augstÄkais</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>augstÄks</translation>
- </message>
- <message>
- <source>high</source>
- <translation>augsts</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>vidēji-augsts</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>vidējs</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>zemi-vidējs</translation>
- </message>
- <message>
- <source>low</source>
- <translation>zems</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>zemÄks</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>zemÄkais</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 aizslēgts)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>neviena</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>jÄ</translation>
- </message>
- <message>
- <source>no</source>
- <translation>nē</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez nosaukuma)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>atlikums no %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(atlikums)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -650,38 +356,6 @@
<source>&amp;Address</source>
<translation>&amp;Adrese</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Jauna saņemšanas adrese</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Jauna nosūtīšanas adrese</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Mainīt saņemšanas adresi</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Mainīt nosūtīšanas adresi</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Nupat ierakstÄ«tÄ adrese "%1" jau atrodas adreÅ¡u grÄmatÄ.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>IerakstÄ«tÄ adrese "%1" nav derÄ«ga Bitcoin adrese.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Nav iespējams atslēgt maciņu.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>NeizdevÄs Ä£enerÄ“t jaunu atslÄ“gu.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -705,10 +379,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>versija</translation>
</message>
@@ -717,8 +387,8 @@
<translation>(%1-biti)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Par Bitcoin Core</translation>
+ <source>Command-line options</source>
+ <translation>Komandrindas iespējas</translation>
</message>
<message>
<source>Usage:</source>
@@ -728,7 +398,7 @@
<source>command-line options</source>
<translation>komandrindas izvēles</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -736,10 +406,6 @@
<translation>Sveiciens</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>SveicinÄts Bitcoin Core</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>Izmantot noklusēto datu mapi</translation>
</message>
@@ -748,10 +414,6 @@
<translation>Izmantot pielÄgotu datu mapi:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error</source>
<translation>Kļūda</translation>
</message>
@@ -774,10 +436,6 @@
<source>Select payment request file</source>
<translation>IzvÄ“lies maksÄjuma pieprasÄ«juma datni</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>IzvÄ“lies maksÄjuma pieprasÄ«juma datni lai atvÄ“ru</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -970,45 +628,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI apstrÄde</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>NederÄ«ga maksÄjuma adrese %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>MaksÄjuma pieprasÄ«jums noraidÄ«ts</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>MaksÄjuma pieprasÄ«juma tÄ«kls neatbilst klienta tÄ«klam.</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>MaksÄjumu pieprasÄ«juma kļūda</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Nevar palaist Bitcoin: nospied-lai-maksÄtu apstrÄdÄtÄju</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>Atmaksa no %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>MaksÄjums atzÄ«ts</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Tīkla pieprasījuma kļūda</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -1031,31 +650,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;SaglabÄt AttÄ“lu...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopēt Attēlu</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>SaglabÄt QR kodu</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG Attēls (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Klienta vÄrds</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1076,10 +672,6 @@
<translation>VispÄrÄ“js</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>IzmantotÄ OpenSSL versija</translation>
- </message>
- <message>
<source>Startup time</source>
<translation>SÄkuma laiks</translation>
</message>
@@ -1136,10 +728,6 @@
<translation>Iz.:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>KompilÄcijas datums</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>AtkļūdoÅ¡anas žurnÄla datne</translation>
</message>
@@ -1222,18 +810,6 @@
<source>Remove</source>
<translation>Noņemt</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopēt nosaukumu</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopēt ziņojumu</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopēt daudzumu</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1253,73 +829,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;SaglabÄt AttÄ“lu...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>PieprasÄ«t maksÄjumu uz %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>MaksÄjuma informÄcija</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adrese</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Daudzums</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nosaukums</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Ziņojums</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>RezultÄta URI pÄrÄk garÅ¡, mÄ“Ä£iniet saÄ«sinÄt nosaukumu vai ziņojumu. </translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Kļūda kodÄ“jot URI QR kodÄ.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datums</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nosaukums</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Ziņojums</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Daudzums</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez nosaukuma)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(nav ziņojuma)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(nav summas)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1376,6 +885,10 @@
<translation>PielÄgota atlikuma adrese</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Transakcijas maksa:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>SÅ«tÄ«t vairÄkiem saņēmÄ“jiem uzreiz</translation>
</message>
@@ -1403,78 +916,6 @@
<source>S&amp;end</source>
<translation>&amp;Sūtīt</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>ApstiprinÄt bitkoinu sÅ«tÄ«Å¡anu</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 līdz %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopēt daudzumu</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopēt daudzumu</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopēt maksu</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopēt pēc maksas</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopēt baitus</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>KopÄ“t prioritÄti</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopēt atlikumu</translation>
- </message>
- <message>
- <source>or</source>
- <translation>vai</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Daudzums pÄrsniedz pieejamo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Kopsumma pÄrsniedz pieejamo, ja pieskaitÄ«ta %1 transakcijas maksa.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Transakcijas izveidoÅ¡ana neizdevÄs!</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>BrÄ«dinÄjums: NederÄ«ga Bitcoin adrese</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez nosaukuma)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>BrÄ«dinÄjums: NezinÄma atlikuma adrese</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>pievienots kÄ transakcijas maksa</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1487,10 +928,6 @@
<translation>&amp;Saņēmējs:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Lai pievienotu adresi adreÅ¡u grÄmatai, tai jÄdod nosaukums</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Nosaukums:</translation>
</message>
@@ -1534,10 +971,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core tiek izslēgta...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Neizslēdziet datoru kamēr šis logs nepazūd.</translation>
</message>
@@ -1608,70 +1041,10 @@
<source>Reset all verify message fields</source>
<translation>Atiestatīt visus laukus</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Nospied "Parakstīt Ziņojumu" lai ģenerētu parakstu</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>IevadÄ«tÄ adrese ir nederÄ«ga.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>LÅ«dzu pÄrbaudi adresi un mÄ“Ä£ini vÄ“lreiz.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>IevadÄ«tÄ adrese neattiecas uz atslÄ“gu.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Maciņa atslēgšana tika atcelta.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>PrivÄtÄ atslÄ“ga priekÅ¡ ievadÄ«tÄs adreses nav pieejama.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>NeizdevÄs parakstÄ«t ziņojumu.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Ziņojums parakstīts.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Paraksts nevarēja tikt dekodēts.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>LÅ«dzu pÄrbaudi parakstu un mÄ“Ä£ini vÄ“lreiz.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Paraksts neatbilda ziņojuma apkopojumam.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Ziņojumu neizdevÄs pÄrbaudÄ«t.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Ziņojums pÄrbaudÄ«ts.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Bitcoin Core izstrÄdÄtÄji</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnets]</translation>
</message>
@@ -1684,410 +1057,16 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Atvērts līdz %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>pretrunÄ</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/bezsaistē</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/neapstiprinÄtas</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 apstiprinÄjumu</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datums</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Avots</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Ģenerēts</translation>
- </message>
- <message>
- <source>From</source>
- <translation>No</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Uz</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>paša adrese</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiÄ·ete</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Kredīts</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>nav pieņemts</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debets</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Transakcijas maksa</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Neto summa</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Ziņojums</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>KomentÄrs</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transakcijas ID</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>TirgotÄjs</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>AtkļūdoÅ¡anas informÄcija</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transakcija</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Ieejas</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Daudzums</translation>
- </message>
- <message>
- <source>true</source>
- <translation>patiess</translation>
- </message>
- <message>
- <source>false</source>
- <translation>nepatiess</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, vēl nav veiksmīgi izziņots</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>nav zinÄms</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transakcijas detaļas</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Å is panelis parÄda transakcijas detaļas</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datums</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tips</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Atvērts līdz %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>ApstiprinÄts (%1 apstiprinÄjumu)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Neviens cits mezgls šo bloku nav saņēmis un droši vien netiks akceptēts!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Ä¢enerÄ“ts, taÄu nav akceptÄ“ts</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Bezsaitē</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nosaukums</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>NeapstiprinÄts</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>PretrunÄ</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Saņemts ar</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Saņemts no</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Nosūtīts</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>MaksÄjums sev</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Atrasts</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(nav pieejams)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Transakcijas statuss. Turiet peli virs Å¡Ä« lauka, lai redzÄ“tu apstiprinÄjumu skaitu.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Transakcijas saņemšanas datums un laiks.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Transakcijas tips.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Bilancei pievienotais vai atņemtais daudzums.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Visi</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Å odien</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Šonedēļ</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Šomēnes</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Pēdējais mēnesis</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Å ogad</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Diapazons...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Saņemts ar</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Nosūtīts</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Sev</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Atrasts</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Cits</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Ierakstiet meklējamo nosaukumu vai adresi</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>MinimÄlais daudzums</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopēt adresi</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopēt nosaukumu</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopēt daudzumu</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopēt transakcijas ID</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Mainīt nosaukumu</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>RÄdÄ«t transakcijas detaļas</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Eksportēt Transakciju Vēsturi</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>EksportÄ“Å¡ana NeizdevÄs</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Eksportēšana Veiksmīga</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Transakciju vÄ“sture tika veiksmÄ«gi saglabÄta uz %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fails ar komatu kÄ atdalÄ«tÄju (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>ApstiprinÄts</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datums</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tips</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nosaukums</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adrese</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Diapazons:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>uz</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Neviens maciņš nav ielÄdÄ“ts.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Sūtīt Bitkoinus</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Eksportēt</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Datus no tekoÅ¡Ä ieliktņa eksportÄ“t uz failu</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Izveidot maciņa rezerves kopiju</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Maciņa dati (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Rezerves kopÄ“Å¡ana neizdevÄs</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Notikusi kļūme mÄ“Ä£inot saglabÄt maciņa datus uz %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Maciņa dati tika veiksmÄ«gi saglabÄti uz %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Dublēšana Veiksmīga</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2114,6 +1093,10 @@
<translation>DarbinÄt fonÄ kÄ servisu un pieņemt komandas</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;category&gt; var būt:</translation>
</message>
@@ -2194,10 +1177,6 @@
<translation>BrÄ«dinÄjums</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat ir bojÄts, glÄbÅ¡ana neizdevÄs</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>JSON-RPC savienojumu parole</translation>
</message>
@@ -2206,10 +1185,6 @@
<translation>IzpildÄ«t komandu, kad labÄk atbilstoÅ¡ais bloks izmainÄs (%s cmd aizvieto ar bloka heÅ¡u)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Šis palīdzības paziņojums</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Atļaut DNS uzmeklēšanu priekš -addnode, -seednode un -connect</translation>
</message>
@@ -2218,14 +1193,6 @@
<translation>IelÄdÄ“ adreses...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Nevar ielÄdÄ“t wallet.dat: maciņš bojÄts</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Kļūda ielÄdÄ“jot wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Nederīga -proxy adrese: '%s'</translation>
</message>
@@ -2234,18 +1201,6 @@
<translation>-onlynet komandÄ norÄdÄ«ts nepazÄ«stams tÄ«kls: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Nevar uzmeklēt -bind adresi: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Nevar atrisinÄt -externalip adresi: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nederīgs daudzums priekš -paytxfree=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nepietiek bitkoinu</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mk_MK.ts b/src/qt/locale/bitcoin_mk_MK.ts
index 269b06f83a..b696111a53 100644
--- a/src/qt/locale/bitcoin_mk_MK.ts
+++ b/src/qt/locale/bitcoin_mk_MK.ts
@@ -26,10 +26,6 @@
<translation>З&amp;атвори</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Копирај ÐдреÑа</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Избриши ја избраната адреÑа од лиÑтата</translation>
</message>
@@ -45,57 +41,6 @@
<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>И&amp;збери</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>ÐдреÑи за праќање</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>ÐдреÑи за примање</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Копирај &amp;Етикета</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Уреди</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>ЕкÑпортирај ЛиÑта Ñо ÐдреÑи</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ЕкÑпортирањето не УÑпеа</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Етикета</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без етикета)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -111,70 +56,6 @@
<source>Repeat new passphrase</source>
<translation>Повторете ја новата тајна фраза</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Криптирање на паричник</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Отклучи паричник</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Декриптирање на паричник</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Измени тајна фраза</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Дали Ñте Ñигурни дека Ñакате да криптирате вашиот паричник?</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Предупредување: Caps Lock копчето е активно!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Паричникот е криптиран</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Криптирањето на паричникот е неуÑпешно</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Криптирањето на паричникот не уÑпеа поради интерна грешка. Вашиот паричник не е криптиран.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Приложените тајни фрази не Ñе поклопуваат</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Отклучувањето на паричникот е неуÑпешно</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Тајната фраза која што ја внеÑовте за декриптирање на паричникот е неточна.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Декриптирањето на паричникот е неуÑпешно</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Тајната фраза е уÑпешно променета.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -250,14 +131,6 @@
<translation>Отвори &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Биткоин Core Ñофтверот</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>ВнеÑување на блокови од диÑкот...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Повторно индекÑирање на блокови од диÑкот...</translation>
</message>
@@ -286,10 +159,6 @@
<translation>&amp;Прими</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Прикажи информации за Биткоин Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Прикажи / Сокриј</translation>
</message>
@@ -305,14 +174,6 @@
<source>&amp;Help</source>
<translation>&amp;Помош</translation>
</message>
- <message>
- <source>Bitcoin Core</source>
- <translation>Биткоин Core</translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;За Биткоин Core</translation>
- </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation><numerusform>Обработен %n блок од иÑторијата на транÑакции.</numerusform><numerusform>Обработени %n блокови од иÑторијата на транÑакции.</numerusform></translation>
@@ -385,9 +246,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Bytes:</source>
@@ -429,126 +287,6 @@
<source>Priority</source>
<translation>Приоритет</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Копирај адреÑа</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Копирај етикета</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Копирај Ñума</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>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>yes</source>
- <translation>да</translation>
- </message>
- <message>
- <source>no</source>
- <translation>не</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>
- <message>
- <source>(change)</source>
- <translation>(куÑур)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -564,7 +302,7 @@
<source>&amp;Address</source>
<translation>&amp;ÐдреÑа</translation>
</message>
- </context>
+</context>
<context>
<name>FreespaceChecker</name>
<message>
@@ -575,10 +313,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Биткоин Core</translation>
- </message>
- <message>
<source>version</source>
<translation>верзија</translation>
</message>
@@ -586,18 +320,10 @@
<source>(%1-bit)</source>
<translation>(%1-бит)</translation>
</message>
- <message>
- <source>About Bitcoin Core</source>
- <translation>За Биткоин Core</translation>
- </message>
</context>
<context>
<name>Intro</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Биткоин Core</translation>
- </message>
- <message>
<source>Error</source>
<translation>Грешка</translation>
</message>
@@ -656,9 +382,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -689,21 +412,6 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save 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>
<source>Network</source>
@@ -768,19 +476,7 @@
<source>Show</source>
<translation>Прикажи</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Копирај етикета</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Копирај порака</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Копирај Ñума</translation>
- </message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
@@ -799,50 +495,7 @@
<source>&amp;Save Image...</source>
<translation>&amp;Сними Слика...</translation>
</message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сума</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Етикета</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Порака</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Етикета</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Порака</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сума</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без етикета)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
@@ -873,49 +526,21 @@
<source>Dust:</source>
<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>Copy change</source>
- <translation>Копирај куÑур</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без етикета)</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Копирај прашина</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
<message>
+ <source>A&amp;mount:</source>
+ <translation>Сума:</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Етикета:</translation>
</message>
+ <message>
+ <source>Message:</source>
+ <translation>Порака:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -925,96 +550,26 @@
</context>
<context>
<name>SplashScreen</name>
- <message>
- <source>Bitcoin Core</source>
- <translation>Биткоин Core</translation>
- </message>
</context>
<context>
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Порака</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сума</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Етикета</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Copy address</source>
- <translation>Копирај ÐдреÑа</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Копирај етикета</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Копирај Ñума</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ЕкÑпортирањето не УÑпеа</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Етикета</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
+ <name>bitcoin-core</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;ЕкÑпорт</translation>
+ <source>Options:</source>
+ <translation>Опции:</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>ЕкÑпортирај ги податоците од активното јазиче во датотека</translation>
+ <source>Bitcoin Core</source>
+ <translation>Биткоин Core</translation>
</message>
- </context>
-<context>
- <name>bitcoin-core</name>
<message>
<source>Warning</source>
<translation>Предупредување</translation>
diff --git a/src/qt/locale/bitcoin_mn.ts b/src/qt/locale/bitcoin_mn.ts
index d1a5976224..d9ef0d127b 100644
--- a/src/qt/locale/bitcoin_mn.ts
+++ b/src/qt/locale/bitcoin_mn.ts
@@ -22,10 +22,6 @@
<translation>&amp;Хаах</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>ХаÑгийг &amp;Хуулбарлах</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Одоо ÑонгогдÑон байгаа хаÑгуудыг жагÑÐ°Ð°Ð»Ñ‚Ð°Ð°Ñ ÑƒÑтгах</translation>
</message>
@@ -41,65 +37,6 @@
<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>С&amp;онго</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>
- <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>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Ѳѳрчлѳх</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>ЭкÑпорт хийх хаÑгуудын жагÑаалт</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>ТаÑлалаар туÑгаарлагдÑан Ñ…Ò¯ÑнÑгтÑн файл (.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Шошго</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ХаÑг</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(шошгогүй)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -115,66 +52,6 @@
<source>Repeat new passphrase</source>
<translation>Ð¨Ð¸Ð½Ñ Ð½ÑƒÑƒÑ† үгийг давтана уу</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Түрүйвчийг цоожлох</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ð­Ð½Ñ Ò¯Ð¹Ð»Ð´Ñлийг гүйцÑтгÑхийн тулд та нууц үгÑÑÑ€ÑÑ Ñ‚Ò¯Ñ€Ò¯Ð¹Ð²Ñ‡Ð¸Ð¹Ð½ цоожийг тайлах Ñ…ÑÑ€ÑгтÑй</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Түрүйвчийн цоожийг тайлах</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ð­Ð½Ñ Ò¯Ð¹Ð»Ð´Ñлийг гүйцÑтгÑхийн тулд та ÑхлÑÑд түрүйвчийн нууц үгийг оруулж цоожийг тайлах шаардлагтай.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Түрүйвчийн цоожийг уÑтгах</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Ðууц үгийг Ñолих</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Түрүйвчийн цоожийг баталгаажуулах</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Түрүйвч цоожлогдлоо</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Түрүйвчийн цоожлол амжилттай болÑонгүй</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Түрүйвчийн цоожлол дотоод Ð°Ð»Ð´Ð°Ð°Ð½Ð°Ð°Ñ Ò¯Ò¯Ð´Ñн амжилттай болÑонгүй. Түрүйвч цоожлогдоогүй байна.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Таны оруулÑан нууц үг таарÑангүй</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Түрүйвчийн цоож тайлагдÑангүй</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Таны оруулÑан түрүйвчийн цоожийг тайлах нууц үг буруу байна</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Түрүйвчийн цоож амжилттай уÑтгагдÑангүй</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Түрүйвчийн нууц үг амжилттай ѳѳр</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -234,6 +111,10 @@
<translation>&amp;Ðууц Үгийг Солих...</translation>
</message>
<message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>ХүлÑÑн авах хаÑг</translation>
+ </message>
+ <message>
<source>Change the passphrase used for wallet encryption</source>
<translation>Түрүйвчийг цоожлох нууц үгийг Ñолих</translation>
</message>
@@ -270,6 +151,10 @@
<translation>Ðлдаа</translation>
</message>
<message>
+ <source>Information</source>
+ <translation>ÐœÑдÑÑллÑл</translation>
+ </message>
+ <message>
<source>Up to date</source>
<translation>ШинÑчлÑгдÑÑн</translation>
</message>
@@ -291,9 +176,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
@@ -315,31 +197,7 @@
<source>Confirmed</source>
<translation>Баталгаажлаа</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>ХаÑгийг Ñанах</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Шошгыг Ñанах</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Ð¥ÑмжÑÑг Ñанах</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Ѳѳрчлѳлтийг Ñанах</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(шошгогүй)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(ѳѳрчлѳх)</translation>
- </message>
-</context>
+ </context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -354,34 +212,6 @@
<source>&amp;Address</source>
<translation>&amp;ХаÑг</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Ð¨Ð¸Ð½Ñ Ñ…Ò¯Ð»ÑÑн авах хаÑг</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Ð¨Ð¸Ð½Ñ Ñвуулах хаÑг</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>ХүлÑÑн авах хаÑгийг ѳѳрчлѳх</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Явуулах хаÑгийг ѳѳрчлѳх</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Таны оруулÑан хаÑг "%1" нь хаÑгийн бүртгÑлд ѳмнѳ нь орÑон байна</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Түрүйвчийн цоожийг тайлж чадÑангүй</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ð¨Ð¸Ð½Ñ Ñ‚Ò¯Ð»Ñ…Ò¯Ò¯Ñ€ амжилттай гарÑангүй</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -422,6 +252,14 @@
<translation>прокÑигийн IP хаÑг (жишÑÑ Ð½ÑŒ: IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
<message>
+ <source>&amp;Network</source>
+ <translation>СүлжÑÑ</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>Түрүйвч</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<translation>Ѳѳрчлѳлтүүдийг идÑвхижүүлхийн тулд клиентийг ахин ÑхлүүлÑÑ… шаардлагтай</translation>
</message>
@@ -438,9 +276,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -455,19 +290,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG форматын зураг (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Клиентийн нÑÑ€</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Ðлга Байна</translation>
</message>
@@ -523,10 +347,18 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation>Ð¥ÑмжÑÑ:</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Шошго:</translation>
</message>
<message>
+ <source>&amp;Message:</source>
+ <translation>ЗурваÑ:</translation>
+ </message>
+ <message>
<source>Show</source>
<translation>Харуул</translation>
</message>
@@ -538,63 +370,12 @@
<source>Remove</source>
<translation>УÑтгах</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Шошгыг Ñанах</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>ЗурваÑыг Ñанах</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Ð¥ÑмжÑÑг Ñанах</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>ХаÑг</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Ð¥ÑмжÑÑ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Шошго</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>ЗурваÑ</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Огноо</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Шошго</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>ЗурваÑ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Ð¥ÑмжÑÑ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(шошгогүй)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(Ð·ÑƒÑ€Ð²Ð°Ñ Ð°Ð»Ð³Ð°)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>ХаÑгийг &amp;Хуулбарлах</translation>
</message>
</context>
<context>
@@ -643,43 +424,7 @@
<source>S&amp;end</source>
<translation>Яв&amp;уул</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Ð—Ð¾Ð¾Ñ Ñвуулахыг баталгаажуулна уу</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Ð¥ÑмжÑÑг Ñанах</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Ѳѳрчлѳлтийг Ñанах</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ÑÑвÑл</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Тѳлѳх Ñ…ÑмжÑÑ 0.-Ð¾Ð¾Ñ Ð¸Ñ… байх Ñ‘Ñтой</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Ð­Ð½Ñ Ñ…ÑмжÑÑ Ñ‚Ð°Ð½Ñ‹ баланÑÐ°Ð°Ñ Ñ…ÑÑ‚ÑÑ€ÑÑн байна.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>ГүйлгÑÑний тѳлбѳр %1-ийг тооцхоор нийт дүн нь таны баланÑÐ°Ð°Ñ Ñ…ÑÑ‚Ñ€ÑÑд байна.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Ðнхаар:Буруу Биткойны хаÑг байна</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(шошгогүй)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -691,10 +436,6 @@
<translation>Тѳлѳх &amp;хаÑг:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Ð­Ð½Ñ Ñ…Ð°Ñгийг ѳѳрийн бүртгÑлдÑÑ Ð°Ð²Ð°Ñ…Ñ‹Ð½ тулд шошго оруул</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Шошго:</translation>
</message>
@@ -714,14 +455,14 @@
<source>Message:</source>
<translation>ЗурваÑ:</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Тѳлѳх хаÑг:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
<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>
@@ -752,278 +493,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>%1 хүртÑл нÑÑлттÑй</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>зѳрчилдлѳѳ</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/баталгаажаагүй</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 баталгаажилтууд</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Огноо</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>ЗурваÑ</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Тодорхойлолт</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Ð¥ÑмжÑÑ</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, хараахан амжилттай цацагдаагүй байна</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>үл мÑдÑгдÑÑ…</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>ГүйлгÑÑний мÑдÑÑллÑл</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>ГүйлгÑÑний дÑлгÑÑ€Ñнгүйг ÑÐ½Ñ Ð±Ð¸Ñ‡Ð¸Ð» цонх харуулж байна</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Огноо</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тѳрѳл</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>%1 хүртÑл нÑÑлттÑй</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Баталгаажлаа (%1 баталгаажилт)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ð­Ð½Ñ Ð±Ð»Ð¾ÐºÐ¸Ð¹Ð³ аль ч нод хүлÑÑн авÑангүй ба ер нь зѳвшѳѳрѳгдѳхгүй байж мÑднÑ!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Ò®Ò¯ÑгÑгдÑÑн гÑхдÑÑ Ñ…Ò¯Ð»ÑÑн авагдаагүй</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Шошго</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Баталгаажаагүй</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Зѳрчилдлѳѳ</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>ХүлÑÑн авÑан хаÑг</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>ХүлÑÑн авагдÑан хаÑг</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>ЯвуулÑан хаÑг</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>ѲѳрлүүгÑÑ Ñ…Ð¸Ð¹ÑÑн тѳлбѳр</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>ОлборлогдÑон</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(алга байна)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>ГүйлгÑÑний байдал. Энд хулганыг авчирч баталгаажуулалтын тоог харна уу.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>ГүйлгÑÑг хүлÑÑн авÑан огноо ба цаг.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>ГүйлгÑÑний тѳрѳл</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>БаланÑÐ°Ð°Ñ Ð°Ð²Ð°Ð³Ð´Ñан болон нÑмÑгдÑÑн Ñ…ÑмжÑÑ.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Бүгд</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Ѳнѳѳдѳр</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Ð­Ð½Ñ Ð´Ð¾Ð»Ð¾Ð¾ хоног</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Ð­Ð½Ñ Ñар</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>ѲнгѳрÑѳн Ñар</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Ð­Ð½Ñ Ð¶Ð¸Ð»</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>ХүлÑÑн авÑан хаÑг</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>ЯвуулÑан хаÑг</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>ѲѳрлүүгÑÑ</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>ОлборлогдÑон</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>БуÑад</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Хайлт хийхийн тулд хаÑг ÑÑвÑл шошгыг оруул</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Хамгийн бага Ñ…ÑмжÑÑ</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>ХаÑгийг Ñанах</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Шошгыг Ñанах</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Ð¥ÑмжÑÑг Ñанах</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Шошгыг ѳѳрчлѳх</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>Баталгаажлаа</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Огноо</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тѳрѳл</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Шошго</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ХаÑг</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>Тодорхойлолт</translation>
- </message>
- <message>
- <source>to</source>
- <translation>-рүү/руу</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Ямар ч түрүйвч ачааллагдÑангүй.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Ð—Ð¾Ð¾Ñ Ñвуулах</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;ЭкÑпортдлох</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>СонгогдÑон таб дÑÑрхи дата-г ÑкÑпортлох</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1034,16 +513,12 @@
<translation>Түрүйвчийн Ñонголтууд:</translation>
</message>
<message>
- <source>Loading addresses...</source>
- <translation>ХаÑгуудыг ачааллаж байна...</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>wallet.dat-ыг ачааллахад алдаа гарлаа: Түрүйвч ÑвдÑÑ€ÑÑн байна</translation>
+ <source>Information</source>
+ <translation>ÐœÑдÑÑллÑл</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>wallet.dat-ыг ачааллахад алдаа гарлаа</translation>
+ <source>Loading addresses...</source>
+ <translation>ХаÑгуудыг ачааллаж байна...</translation>
</message>
<message>
<source>Invalid -proxy address: '%s'</source>
diff --git a/src/qt/locale/bitcoin_ms_MY.ts b/src/qt/locale/bitcoin_ms_MY.ts
index 8f6676e484..acfb38e418 100644
--- a/src/qt/locale/bitcoin_ms_MY.ts
+++ b/src/qt/locale/bitcoin_ms_MY.ts
@@ -18,8 +18,13 @@
<translation>&amp;Salin</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Salin Alamat</translation>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Padam alamat semasa yang dipilih dari senaraiyang dipilih dari senarai</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>
+Alihkan fail data ke dalam tab semasa</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -29,30 +34,7 @@
<source>&amp;Delete</source>
<translation>&amp;Padam</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Pilih alamat untuk menghantar syiling</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Pilih alamat untuk menerima syiling</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Pilih</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fail yang dipisahkan dengan koma</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Address</source>
- <translation>Alamat</translation>
- </message>
- </context>
+</context>
<context>
<name>AskPassphraseDialog</name>
</context>
@@ -67,9 +49,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
</context>
<context>
@@ -82,7 +61,7 @@
<source>&amp;Address</source>
<translation>Alamat</translation>
</message>
- </context>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -102,18 +81,12 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -122,14 +95,11 @@
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Alamat</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Salin Alamat</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- </context>
-<context>
<name>SendCoinsDialog</name>
<message>
<source>Balance:</source>
@@ -152,42 +122,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fail yang dipisahkan dengan koma</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Alamat</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Eksport</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts
index 554ac21a02..4538fd6e1e 100644
--- a/src/qt/locale/bitcoin_nb.ts
+++ b/src/qt/locale/bitcoin_nb.ts
@@ -26,10 +26,6 @@
<translation>&amp;Lukk</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopier Adresse</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Slett den valgte adressen fra listen.</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Slett</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Velg adressen å sende mynter til</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Velg adressen til å motta mynter med</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Velg</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Utsendingsadresser</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Mottaksadresser</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>Dette er dine Bitcoin-adresser for å sende betalinger. Alltid sjekk beløp og mottakeradresse før sending av mynter.</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>Dette er dine Bitcoin-adresser for å sende betalinger. Det er anbefalt å bruk en ny mottaksadresse for hver transaksjon.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopier &amp;Merkelapp</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Rediger</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Ekporter Adresseliste</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommaseparert fil (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Eksportering feilet</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Det oppstod en feil under lagring av adresselisten til %1. Vennligst prøv på nytt.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Merkelapp</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen merkelapp)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Gjenta ny adgangsfrase</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Krypter lommebok</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Denne operasjonen krever adgangsfrasen til lommeboken for å låse den opp.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>LÃ¥s opp lommebok</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Denne operasjonen krever adgangsfrasen til lommeboken for å dekryptere den.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dekrypter lommebok</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Endre adgangsfrase</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Bekreft kryptering av lommebok</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>Advarsel: Hvis du krypterer lommeboken og mister adgangsfrasen, så vil du &lt;b&gt;MISTE ALLE DINE BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Advarsel: Caps Lock er på!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Lommebok kryptert</translation>
- </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>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>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>
- <translation>Kryptering av lommebok feilet</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Kryptering av lommebok feilet på grunn av en intern feil. Din lommebok ble ikke kryptert.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>De angitte adgangsfrasene er ulike.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Opplåsing av lommebok feilet</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Adgangsfrasen angitt for dekryptering av lommeboken var feil.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Dekryptering av lommebok feilet</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Adgangsfrase for lommebok endret.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -270,6 +111,10 @@
<translation>Avslutt applikasjonen</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation> &amp;Om %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Om &amp;Qt</translation>
</message>
@@ -306,14 +151,6 @@
<translation>Ã…pne &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core-klient</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importere blokker...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindekserer blokker på harddisk...</translation>
</message>
@@ -358,10 +195,6 @@
<translation>&amp;Motta</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Vis informasjon om Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Vis / Skjul</translation>
</message>
@@ -398,22 +231,10 @@
<translation>Verktøylinje for faner</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Forespør betalinger (genererer QR-koder og bitcoin: URIer)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
@@ -429,10 +250,6 @@
<source>&amp;Command-line options</source>
<translation>&amp;Kommandolinjevalg</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Vis Bitcoin Core hjelpemeldingen for å få en liste med mulige kommandolinjevalg</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n aktiv forbindelse til Bitcoin-nettverket</numerusform><numerusform>%n aktive forbindelser til Bitcoin-nettverket</numerusform></translation>
@@ -545,13 +362,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Nettverksvarsel</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -629,150 +439,6 @@
<source>Priority</source>
<translation>Prioritet</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopier adresse</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopier merkelapp</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopier beløp</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopier transaksjons-ID</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>LÃ¥s ubrukte</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>LÃ¥s opp ubrukte</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopier mengde</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopier gebyr</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopier totalt</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopier bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopier prioritet</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopier støv</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopier veksel</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>høyest</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>høyere</translation>
- </message>
- <message>
- <source>high</source>
- <translation>høy</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medium-høy</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>medium</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>lav-medium</translation>
- </message>
- <message>
- <source>low</source>
- <translation>lav</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>lavere</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>lavest</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 låst)</translation>
- </message>
- <message>
- <source>none</source>
- <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>
- <message>
- <source>yes</source>
- <translation>ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation>nei</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Kan variere +/- 1 byte per input.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transaksjoner med høyere prioritet har mer sannsynlighet for å bli inkludert i en blokk.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen merkelapp)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>veksel fra %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(veksel)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -796,38 +462,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresse</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Ny mottaksadresse</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Ny utsendingsadresse</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Rediger mottaksadresse</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Rediger utsendingsadresse</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Den oppgitte adressen "%1" er allerede i adresseboken.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Den angitte adressed "%1" er ikke en gyldig Bitcoin-adresse.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Kunne ikke låse opp lommeboken.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Generering av ny nøkkel feilet.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -855,10 +489,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>versjon</translation>
</message>
@@ -867,10 +497,6 @@
<translation> (%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Om Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Kommandolinjevalg</translation>
</message>
@@ -882,24 +508,36 @@
<source>command-line options</source>
<translation>kommandolinjevalg</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Velkommen</translation>
+ <source>UI Options:</source>
+ <translation>Grensesnittvalg:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Velg datakatalog for oppstart (default: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Sett språk, for eksempel "nb_NO" (default: system-«locale»)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Begynn minimert</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Velkommen til Bitcoin Core.</translation>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Sett SSL-rootsertifikat for betalingshenvendelser (default: -system-)</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>Siden dette er første gang programmet starter, kan du nå velge hvor Bitcoin Core skal lagre sine data.</translation>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Vis velkomstbilde ved oppstart (default: %u)</translation>
</message>
+ </context>
+<context>
+ <name>Intro</name>
<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 vil laste ned og lagre en kopi av Bitcoin sin blokkjede. Minst %1GB av data vil bli lagret i denne mappen, og det vil vokse over tid. Lommeboken vil også bli lagret i denne mappen.</translation>
+ <source>Welcome</source>
+ <translation>Velkommen</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -910,10 +548,6 @@
<translation>Bruk en egendefinert datamappe:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Feil: Den oppgitte datamappen "%1" kan ikke opprettes.</translation>
</message>
@@ -948,10 +582,6 @@
<source>Select payment request file</source>
<translation>Velg fil for betalingsetterspørring</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Velg fil for betalingsetterspørring å åpne</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -992,10 +622,6 @@
<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>
@@ -1020,14 +646,6 @@
<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>
@@ -1256,97 +874,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI-håndtering</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Ugyldig betalingsadresse %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Betalingsetterspørring avvist</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Nettverk for betalingsetterspørring er ikke i overensstemmelse med klientnettverket.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Betalingsetterspørringen er ikke initialisert.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Forespurt betalingsmengde på %1 er for liten (betraktet som støv).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Betalingsetterspørringsfeil</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Kan ikke starte Bitcoin: klikk-og-betal håndterer</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Hentelenke for betalingsetterspørring er ugyldig: %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 kan ikke fortolkes! Dette kan være forårsaket av en ugyldig Bitcoin-adresse eller feilformede URI-parametre.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Filhåndtering for betalingsetterspørring</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <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>Error communicating with %1: %2</source>
- <translation>Feil i kommunikasjonen med %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Betaingsetterspørrelse kan ikke fortolkes!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>DÃ¥rlig svar fra server %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Betaling erkjent</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Nettverksforespørsel feil</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1401,31 +928,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Lagre Bilde...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopier Bilde</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Lagre QR-kode</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG-bilde (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Klientnavn</translation>
- </message>
- <message>
<source>N/A</source>
<translation>-</translation>
</message>
@@ -1446,10 +950,6 @@
<translation>Generelt</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Bruker OpenSSL versjon</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Bruker BerkeleyDB versjon</translation>
</message>
@@ -1478,8 +978,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>Minnepool</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Nåværende antall transaksjoner</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Minnebruk</translation>
</message>
<message>
<source>Received</source>
@@ -1598,10 +1106,6 @@
<translation>Ut:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Byggedato</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Loggfil for feilsøk</translation>
</message>
@@ -1638,10 +1142,6 @@
<translation>Fjern &amp;Utestengning av Node</translation>
</message>
<message>
- <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>
<translation>Bruk opp og ned pil for å navigere historikken, og &lt;b&gt;Ctrl-L&lt;/b&gt; for å tømme skjermen.</translation>
</message>
@@ -1768,18 +1268,6 @@
<source>Remove</source>
<translation>Fjern</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopier merkelapp</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopier melding</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopier beløp</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1799,73 +1287,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Lagre Bilde...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Etterspør betaling til %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Betalingsinformasjon</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Beløp</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Merkelapp</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Melding</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Resultat URI for lang, prøv å redusere teksten for merkelapp / melding.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Feil ved koding av URI til QR-kode.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Merkelapp</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Melding</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Beløp</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen merkelapp)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(ingen melding)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(intet beløp)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1986,14 +1407,6 @@
<translation>rask</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <translation>Send uten transaksjonsgebyr hvis mulig</translation>
- </message>
- <message>
- <source>(confirmation may take longer)</source>
- <translation>(bekreftelse kan ta lengre tid)</translation>
- </message>
- <message>
<source>Send to multiple recipients at once</source>
<translation>Send til flere enn en mottaker</translation>
</message>
@@ -2025,118 +1438,6 @@
<source>S&amp;end</source>
<translation>S&amp;end</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Bekreft sending av bitcoins</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 til %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopier mengde</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopier beløp</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopier gebyr</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopier fra gebyr</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopier bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopier prioritet</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopier veksel</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>Totalt Beløp %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>eller</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Beløpet overstiger saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Totalbeløpet overstiger saldo etter at %1 transaksjonsgebyr er lagt til.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Opprettelse av transaksjon feilet!</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>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 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>
- <source>Pay only the required fee of %1</source>
- <translation>Betal kun påkrevd gebyr på %1</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>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>
- <translation>Advarsel: Ugyldig Bitcoin-adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen merkelapp)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Advarsel: Ukjent adresse for veksel</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopier støv</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Er du sikker på at du vil sende?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>lagt til som transaksjonsgebyr</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2149,10 +1450,6 @@
<translation>Betal &amp;Til:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Skriv inn en merkelapp for denne adressen for å legge den til i din adressebok</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Merkelapp:</translation>
</message>
@@ -2224,10 +1521,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core lukker...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Slå ikke av datamaskinen før dette vinduet forsvinner.</translation>
</message>
@@ -2318,70 +1611,10 @@
<source>Reset all verify message fields</source>
<translation>Tilbakestill alle felter for meldingsverifikasjon</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Klikk "Signer Melding" for å generere signatur</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Angitt adresse er ugyldig.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Vennligst sjekk adressen og prøv igjen.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Angitt adresse refererer ikke til en nøkkel.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Opplåsing av lommebok ble avbrutt.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Privat nøkkel for den angitte adressen er ikke tilgjengelig.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Signering av melding feilet.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Melding signert.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Signaturen kunne ikke dekodes.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Vennligst sjekk signaturen og prøv igjen.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Signaturen passer ikke til meldingen.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Verifikasjon av melding feilet.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Melding verifisert.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Bitcoin Core utviklerne</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnett]</translation>
</message>
@@ -2394,422 +1627,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Ã…pen til %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>konflikt</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/frakoblet</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/ubekreftet</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 bekreftelser</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, kringkast gjennom %n node</numerusform><numerusform>, kringkast gjennom %n noder</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Kilde</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generert</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Fra</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Til</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>egen adresse</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>kun observerbar</translation>
- </message>
- <message>
- <source>label</source>
- <translation>merkelapp</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Kredit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>blir moden om %n blokk</numerusform><numerusform>blir moden om %n blokker</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>ikke akseptert</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debet</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Total debet</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Total kredit</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Transaksjonsgebyr</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Nettobeløp</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Melding</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Kommentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transaksjons-ID</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Forhandler</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>Genererte bitcoins må modnes %1 blokker før de kan brukes. Da du genererte denne blokken ble den kringkastet på nettverket for å bli lagt til i kjeden av blokker. Hvis den ikke kommer med i kjeden vil den endre seg til "ikke akseptert" og pengene vil ikke kunne brukes. Dette vil noen ganger skje hvis en annen node genererer en blokk noen sekunder i tid fra din egen.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Informasjon for feilsøk</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transaksjon</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Inndata</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Beløp</translation>
- </message>
- <message>
- <source>true</source>
- <translation>sann</translation>
- </message>
- <message>
- <source>false</source>
- <translation>usann</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, har ikke blitt kringkastet med hell enda</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Ã…pen for %n blokk til</numerusform><numerusform>Ã…pen for %n blokker til</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>ukjent</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transaksjonsdetaljer</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Her vises en detaljert beskrivelse av transaksjonen</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Type</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Ã…pen for %n blokk til</numerusform><numerusform>Ã…pen for %n blokker til</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Ã…pen til %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Bekreftet (%1 bekreftelser)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Denne blokken har ikke blitt mottatt av noen andre noder og vil sannsynligvis ikke bli akseptert!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generert men ikke akseptert</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Frakoblet</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Merkelapp</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Ubekreftet</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Bekrefter (%1 av %2 anbefalte bekreftelser)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Konflikt</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Mottatt med</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Mottatt fra</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Sendt til</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Betaling til deg selv</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Utvunnet</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>kun observerbar</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>-</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Transaksjonsstatus. Hold muspekeren over dette feltet for å se antall bekreftelser.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Dato og tid for da transaksjonen ble mottat.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Type transaksjon.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Hvorvidt en kun observerbar adresse er involvert i denne transaksjonen.</translation>
- </message>
- <message>
- <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>
- <translation>Beløp fjernet eller lagt til saldo.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Alle</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>I dag</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Denne uken</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Denne måneden</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Forrige måned</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Dette året</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Intervall...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Mottatt med</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Sendt til</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Til deg selv</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Utvunnet</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Andre</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Skriv inn adresse eller merkelapp for søk</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimumsbeløp</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopier adresse</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopier merkelapp</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopier beløp</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopier transaksjons-ID</translation>
- </message>
- <message>
- <source>Copy raw transaction</source>
- <translation>Kopier råtransaksjon</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Rediger merkelapp</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Vis transaksjonsdetaljer</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Eksporter Transaksjonshistorikk</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Kun observer</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Ekport Feilet</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>En feil oppstod ved lagring av transaksjonshistorikken til %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Ekport Fullført</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Transaksjonshistorikken ble lagret til %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommaseparert fil (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Bekreftet</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dato</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Type</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Merkelapp</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Intervall:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>til</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2817,55 +1641,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Ingen lommebok har blitt lastet.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Send Bitcoins</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Eksporter</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Eksporter data fra nåværende fane til fil</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Sikkerhetskopier Lommebok</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Lommebokdata (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Sikkerhetskopiering Feilet</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>En feil oppstod ved lagring av lommebok til %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Lommeboken ble lagret til %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Sikkerhetskopiering Fullført</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2892,14 +1667,6 @@
<translation>Hvis &lt;category&gt; ikke er oppgitt eller hvis &lt;category&gt; = 1, ta ut all informasjon for feilsøking.</translation>
</message>
<message>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
- <translation>Maksimalt samlede gebyrer (i %s) til å bruke i en enkelt lommeboktransaksjon; settes dette for lavt kan store transaksjoner kanskje avbrytes (standardverdi: %s)</translation>
- </message>
- <message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
- <translation>Vennligst undersøk at din datamaskin har riktig dato og klokkeslett! Hvis klokken er stilt feil vil ikke Bitcoin Core fungere riktig.</translation>
- </message>
- <message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation>Beskjæringsmodus er konfigurert under minimum på %d MiB. Vennligst bruk et høyere nummer.</translation>
</message>
@@ -2920,6 +1687,10 @@
<translation>Feil: En fatal intern feil oppstod, se debug.log for detaljer</translation>
</message>
<message>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Gebyr (i %s/kB) for å legge til i transaksjoner du sender (standardverdi: %s)</translation>
+ </message>
+ <message>
<source>Pruning blockstore...</source>
<translation>Beskjærer blokklageret...</translation>
</message>
@@ -2936,6 +1707,10 @@
<translation>Ta imot tilkoblinger fra utsiden (standardverdi: 1 hvis uten -proxy eller -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</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>
@@ -2964,22 +1739,10 @@
<translation>Dette er en forhåndssluppet testversjon - bruk på egen risiko - ikke for bruk til blokkutvinning eller bedriftsapplikasjoner</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Ute av stand til å binde til %s på denne datamaskinen. Bitcoin Core kjører sannsynligvis allerede.</translation>
- </message>
- <message>
<source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>Bruk UPnP for lytteport (standardverdi: 1 ved lytting og uten -proxy)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ADVARSEL: unormalt høyt antall blokker generert, %d blokker mottatt de siste %d timene (%d forventet)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ADVARSEL: kontroller nettverkstilkoblingen, mottok %d blokker i de siste %d timene (%d forventet)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Advarsel: Nettverket ser ikke ut til å være enig! Noen minere ser ut til å ha problemer.</translation>
</message>
@@ -2988,10 +1751,6 @@
<translation>Advarsel: Vi ser ikke ut til å være enige med våre noder! Du må oppgradere, eller andre noder må oppgradere.</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>Advarsel: wallet.dat korrupt, data reddet! Original wallet.dat lagret som wallet.{timestamp}.bak i %s; hvis din saldo eller dine transaksjoner ikke er korrekte bør du gjenopprette fra en backup.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Hvitelist noder som kobler til fra den oppgitte nettmasken eller IP-adressen. Kan oppgis flere ganger.</translation>
</message>
@@ -3152,14 +1911,6 @@
<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>
- <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>Tillat JSON-RPC-tilkoblinger fra angitt kilde. Gyldig for &lt;ip&gt; er en enkelt IP (f. eks. 1.2.3.4), et nettverk/nettmaske (f. eks. 1.2.3.4/255.255.255.0) eller et nettverk/CIDR (f. eks. 1.2.3.4/24). Dette alternativet kan angis flere ganger</translation>
</message>
@@ -3172,10 +1923,6 @@
<translation>Bind til gitt adresse for å lytte for JSON-RPC-tilkoblinger. Bruk [host]:port notasjon for IPv6. Dette alternativet kan angis flere ganger (standardverdi: bind til alle grensesnitt)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Ute av stand til å låse datamappen %s. Bitcoin Core kjører sannsynligvis allerede.</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>
@@ -3220,10 +1967,6 @@
<translation>Sett maksimum størrelse for transaksjoner med høy prioritet / lavt gebyr, i bytes (standardverdi: %d)</translation>
</message>
<message>
- <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
- <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>
@@ -3248,38 +1991,14 @@
<translation>Godta offentlige REST forespørsler (standardverdi: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Aktiverer beste kjede...</translation>
- </message>
- <message>
- <source>Always relay transactions received from whitelisted peers (default: %d)</source>
- <translation>Alltid videresend transaksjoner mottatt fra hvitlistede noder (standardverdi: %d)</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>Forsøk å berge private nøkler fra en korrupt wallet.dat ved oppstart</translation>
- </message>
- <message>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation>Automatisk opprette Tor skjult tjeneste (standardverdi: %d)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Kan ikke løse -whitebind-adresse: '%s'</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Koble til via SOCKS5-proxy</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i utviklerne av Bitcoin Core</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>
@@ -3292,22 +2011,6 @@
<translation>Informasjon</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ugyldig mengde for -mintxfee=&lt;beløp&gt;: '%s'</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Ugyldig beløp for -paytxfee=&lt;amount&gt;: '%s' (må være minst %s)</translation>
</message>
@@ -3332,14 +2035,6 @@
<translation>Innstillinger for RPC-server:</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>Receive and display P2P network alerts (default: %u)</source>
- <translation>Motta og vis P2P nettverksvarsler (standardvalg: %u)</translation>
- </message>
- <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation>Reduserer -maxconnections fra %d til %d, pga. systembegrensninger.</translation>
</message>
@@ -3412,10 +2107,6 @@
<translation>Brukernavn for JSON-RPC forbindelser</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Lommeboken måtte skrives på nytt: start Bitcoin Core på nytt for å fullføre</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Advarsel</translation>
</message>
@@ -3432,10 +2123,6 @@
<translation>Valg for ZeroMQ-meldinger:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat korrupt, bergning feilet</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Passord for JSON-RPC forbindelser</translation>
</message>
@@ -3444,10 +2131,6 @@
<translation>Utfør kommando når beste blokk endrer seg (%s i kommandoen erstattes med blokkens hash)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Denne hjelpemeldingen</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Tillat oppslag i DNS for -addnode, -seednode og -connect</translation>
</message>
@@ -3456,10 +2139,6 @@
<translation>Laster adresser...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Feil ved lasting av wallet.dat: Lommeboken er skadet</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 = behold metadata for transaksjon som f. eks. kontoeier og informasjon om betalingsanmodning, 2 = dropp metadata for transaksjon)</translation>
</message>
@@ -3476,8 +2155,8 @@
<translation>Ikke hold transaksjoner i minnet lenger enn &lt;n&gt; timer (standard: %u)</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Feil ved lesing av wallet.dat! Alle nøkler lest riktig, men transaksjonsdataene eller oppføringer i adresseboken mangler kanskje eller er feil.</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Gebyrer (i %s/Kb) mindre enn dette anses som null gebyr for laging av transaksjoner (standardverdi: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3496,6 +2175,10 @@
<translation>Ta ut feilsøkingsinformasjon (standardverdi: %u, bruk av &lt;category&gt; er valgfritt)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Støtte filtrering av blokker og transaksjoner med bloomfiltre (standardverdi: %u)</translation>
+ </message>
+ <message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<translation>Total lengde av nettverks-versionstreng (%i) er over maks lengde (%i). Reduser tallet eller størrelsen av uacomments.</translation>
</message>
@@ -3512,6 +2195,10 @@
<translation>Bruk separate SOCKS5 proxyer for å nå noder via Tor skjulte tjenester (standardverdi: %s)</translation>
</message>
<message>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Brukernavn og hashet passord for JSON-RPC tilkoblinger. Feltet &lt;userpw&gt; kommer i formatet: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Et Python-skript er inkludert i share/rpcuser. Dette alternativet kan angis flere ganger</translation>
+ </message>
+ <message>
<source>(default: %s)</source>
<translation>(standardverdi: %s)</translation>
</message>
@@ -3520,14 +2207,6 @@
<translation>Alltid søk etter nodeadresser via DNS-oppslag (standardverdi: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Feil ved lasting av wallet.dat</translation>
- </message>
- <message>
- <source>Generate coins (default: %u)</source>
- <translation>Generer mynter (standardverdi: %u)</translation>
- </message>
- <message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
<translation>Hvor mange blokker skal sjekkes ved oppstart (standardverdi: %u, 0 = alle)</translation>
</message>
@@ -3612,18 +2291,6 @@
<translation>Ukjent nettverk angitt i -onlynet '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Kunne ikke slå opp -bind adresse: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Kunne ikke slå opp -externalip adresse: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ugyldig beløp for -paytxfee=&lt;beløp&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Utilstrekkelige midler</translation>
</message>
diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts
index be2ec9ac4f..781c5a8fd6 100644
--- a/src/qt/locale/bitcoin_nl.ts
+++ b/src/qt/locale/bitcoin_nl.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation>Maak een nieuw adres</translation>
+ <translation>Maak een nieuw adres aan</translation>
</message>
<message>
<source>&amp;New</source>
@@ -26,10 +26,6 @@
<translation>S&amp;luiten</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopiëer Adres</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Verwijder het geselecteerde adres van de lijst</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Verwijder</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Kies het adres om munten naar te versturen</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Kies het adres om munten op te ontvangen</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>K&amp;iezen</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Verstuur adressen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <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 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>
- <translation>Dit zijn uw Bitcoin-adressen waarmee u kunt betalen. We raden u aan om een nieuw ontvangstadres voor elke transactie te gebruiken.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopiëer &amp;Label</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Bewerk</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exporteer adreslijst</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommagescheiden bestand (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Export Mislukt</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Een fout is opgetreden tijdens het opslaan van deze adreslijst naar %1. Probeer het nogmaals.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(geen label)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,98 +60,14 @@
<source>Repeat new passphrase</source>
<translation>Herhaal nieuw wachtwoord</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Versleutel portemonnee</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Deze operatie vereist uw portemonneewachtwoord om de portemonnee te openen.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Open portemonnee</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Deze operatie vereist uw portemonneewachtwoord om de portemonnee te ontsleutelen</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Ontsleutel portemonnee</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Wijzig wachtwoord</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Bevestig versleuteling van de portemonnee</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>Waarschuwing: Als u uw portemonnee versleutelt en uw wachtwoord vergeet, zult u &lt;b&gt;AL UW BITCOINS VERLIEZEN&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Waarschuwing: De Caps-Lock-toets staat aan!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Portemonnee versleuteld</translation>
- </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>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>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>
- <translation>Portemonneeversleuteling mislukt</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Portemonneeversleuteling mislukt door een interne fout. Uw portemonnee is niet versleuteld.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>De opgegeven wachtwoorden komen niet overeen</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Portemonnee openen mislukt</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Het opgegeven wachtwoord voor de portemonnee-ontsleuteling is niet correct.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Portemonnee-ontsleuteling mislukt</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Portemonneewachtwoord is met succes gewijzigd.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
<message>
+ <source>IP/Netmask</source>
+ <translation>IP/Netmasker</translation>
+ </message>
+ <message>
<source>Banned Until</source>
<translation>Geband tot</translation>
</message>
@@ -255,17 +100,25 @@
</message>
<message>
<source>Browse transaction history</source>
- <translation>Blader door transactieverleden</translation>
+ <translation>Blader door transactiegescheidenis</translation>
</message>
<message>
<source>E&amp;xit</source>
- <translation>&amp;Afsluiten</translation>
+ <translation>A&amp;fsluiten</translation>
</message>
<message>
<source>Quit application</source>
<translation>Programma afsluiten</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Over %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Toon informatie over %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Over &amp;Qt</translation>
</message>
@@ -275,7 +128,11 @@
</message>
<message>
<source>&amp;Options...</source>
- <translation>O&amp;pties...</translation>
+ <translation>&amp;Opties...</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation>Wijzig configuratieopties voor %1</translation>
</message>
<message>
<source>&amp;Encrypt Wallet...</source>
@@ -291,25 +148,17 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>V&amp;erstuur adressen...</translation>
+ <translation>&amp;Verstuuradressen...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>O&amp;ntvang adressen...</translation>
+ <translation>&amp;Ontvang adressen...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
<translation>Open &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Kern applicatie</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Blokken aan het importeren vanaf harde schijf...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Bezig met herindexeren van blokken op harde schijf...</translation>
</message>
@@ -347,17 +196,13 @@
</message>
<message>
<source>&amp;Send</source>
- <translation>&amp;Versturen</translation>
+ <translation>&amp;Verstuur</translation>
</message>
<message>
<source>&amp;Receive</source>
<translation>&amp;Ontvangen</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Toon informatie over bitcoin kern</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Toon / Verberg</translation>
</message>
@@ -394,24 +239,12 @@
<translation>Tab-werkbalk</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Kern</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation>Vraag betaling aan (genereert QR codes en bitcoin: URIs)</translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Over Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Wijzig configuratieopties voor Bitcoin Core</translation>
+ <translation>Vraag betaling aan (genereert QR-codes en bitcoin: URI's)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation>Toon de lijst met gebruikt verzend adressen en labels</translation>
+ <translation>Toon de lijst met gebruikte verstuuradressen en -labels</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
@@ -423,15 +256,19 @@
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>&amp;Commandoregel-opties</translation>
- </message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Toon het Bitcoin Core hulpbericht om een lijst te krijgen met mogelijke Bitcoin commandoregelopties</translation>
+ <translation>&amp;Opdrachtregelopties</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n actieve connectie naar Bitcoin netwerk</numerusform><numerusform>%n actieve connecties naar Bitcoin netwerk</numerusform></translation>
+ <translation><numerusform>%n actieve verbinding met Bitcoinnetwerk</numerusform><numerusform>%n actieve verbindingen met Bitcoinnetwerk</numerusform></translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Bezig met indexeren van blokken op harde schijf...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Bezig met verwerken van blokken op harde schijf...</translation>
</message>
<message>
<source>No block source available...</source>
@@ -439,11 +276,11 @@
</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>
+ <translation><numerusform>%n blok aan transactiegeschiedenis verwerkt.</numerusform><numerusform>%n blokken aan transactiegeschiedenis verwerkt.</numerusform></translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
- <translation><numerusform>%n uur</numerusform><numerusform>%n uur</numerusform></translation>
+ <translation><numerusform>%n uur</numerusform><numerusform>%n uren</numerusform></translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
@@ -459,7 +296,7 @@
</message>
<message numerus="yes">
<source>%n year(s)</source>
- <translation><numerusform>%n jaar</numerusform><numerusform>%n jaar</numerusform></translation>
+ <translation><numerusform>%n jaar</numerusform><numerusform>%n jaren</numerusform></translation>
</message>
<message>
<source>%1 behind</source>
@@ -490,6 +327,14 @@
<translation>Bijgewerkt</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Toon het %1 hulpbericht om een lijst te krijgen met mogelijke Bitcoin commandoregelopties</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 client</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Aan het bijwerken...</translation>
</message>
@@ -525,7 +370,7 @@
</message>
<message>
<source>Sent transaction</source>
- <translation>Verzonden transactie</translation>
+ <translation>Verstuurde transactie</translation>
</message>
<message>
<source>Incoming transaction</source>
@@ -541,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Netwerkwaarschuwing</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -571,7 +409,7 @@
</message>
<message>
<source>Fee:</source>
- <translation>Vergoeding:</translation>
+ <translation>Transactiekosten:</translation>
</message>
<message>
<source>Dust:</source>
@@ -579,7 +417,7 @@
</message>
<message>
<source>After Fee:</source>
- <translation>Na vergoeding:</translation>
+ <translation>Naheffing:</translation>
</message>
<message>
<source>Change:</source>
@@ -625,150 +463,6 @@
<source>Priority</source>
<translation>Prioriteit</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopieer adres</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopieer label</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopieer bedrag</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopieer transactie-ID</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Blokeer ongebruikte</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Deblokkeer ongebruikte</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopieer aantal</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopieer vergoeding</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopieer na vergoeding</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopieer bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopieer prioriteit</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopieër stof</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopieer wisselgeld</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>hoogste</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>hoger</translation>
- </message>
- <message>
- <source>high</source>
- <translation>hoog</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>gemiddeld hoog</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>gemiddeld</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>laag gemiddeld</translation>
- </message>
- <message>
- <source>low</source>
- <translation>laag</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>lager</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>laagste</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 geblokeerd)</translation>
- </message>
- <message>
- <source>none</source>
- <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>
- <message>
- <source>yes</source>
- <translation>ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation>nee</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Kan +/- byte per invoer variëren.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transacties met een hogere prioriteit zullen eerder in een block gezet worden.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(geen label)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>wijzig van %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(wijzig)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -786,44 +480,12 @@
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation>Het adres dat bij dit adres item hoort. Dit kan alleen bewerkt worden voor verstuur adressen.</translation>
+ <translation>Het adres dat bij dit adresitem hoort. Dit kan alleen bewerkt worden voor verstuuradressen.</translation>
</message>
<message>
<source>&amp;Address</source>
<translation>&amp;Adres</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nieuw ontvangstadres</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nieuw adres om naar te verzenden</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Bewerk ontvangstadres</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Bewerk adres om naar te verzenden</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Het opgegeven adres "%1" bestaat al in uw adresboek.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Het opgegeven adres "%1" is een ongeldig Bitcoinadres</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Kon de portemonnee niet openen.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Genereren nieuwe sleutel mislukt.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -841,7 +503,7 @@
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation>Communicatiepad bestaat al, en is geen folder.</translation>
+ <translation>Communicatiepad bestaat al, en is geen map.</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -851,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Kern</translation>
- </message>
- <message>
<source>version</source>
<translation>versie</translation>
</message>
@@ -863,12 +521,12 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Over Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>Over %1</translation>
</message>
<message>
<source>Command-line options</source>
- <translation>Commandoregel-opties</translation>
+ <translation>Opdrachtregelopties</translation>
</message>
<message>
<source>Usage:</source>
@@ -876,7 +534,35 @@
</message>
<message>
<source>command-line options</source>
- <translation>commandoregel-opties</translation>
+ <translation>opdrachtregelopties</translation>
+ </message>
+ <message>
+ <source>UI Options:</source>
+ <translation>UI-opties:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Kies gegevensmap bij opstarten (standaard: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Stel taal in, bijvoorbeeld "nl_NL" (standaard: systeemlocale)</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-rootcertificaat voor betalingsverzoeken (standaard: -systeem-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Toon opstartscherm bij opstarten (standaard: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Reset alle wijzigingen aan instellingen gedaan in de GUI</translation>
</message>
</context>
<context>
@@ -886,16 +572,16 @@
<translation>Welkom</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Welkom bij Bitcoin Core</translation>
+ <source>Welcome to %1.</source>
+ <translation>Welkom bij %1.</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>Omdat dit de eerste keer is dat het programma gestart is, kunt u nu kiezen waar Bitcoin Core de data moet opslaan.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Omdat dit de eerste keer is dat het programma gestart is, kunt u nu kiezen waar %1 de data moet opslaan.</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 zal een kopie van de Bitcoin blokketen downloaden en opslaan. Tenminste %1 GB aan data wordt opgeslagen in deze map en het zal groeien in de tijd. De portemonnee wordt ook in deze map opgeslagen.</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 zal een kopie van de Bitcoin blokketen downloaden en opslaan. Tenminste %2 GB aan data wordt opgeslagen in deze map en het zal groeien in de tijd. De portemonnee wordt ook in deze map opgeslagen.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -906,10 +592,6 @@
<translation>Gebruik een persoonlijke gegevensmap:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Kern</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Fout: De gespecificeerde directory "%1" kan niet worden gecreëerd.</translation>
</message>
@@ -919,7 +601,7 @@
</message>
<message numerus="yes">
<source>%n GB of free space available</source>
- <translation><numerusform>%n GB aan vrije oplsagruimte beschikbaar</numerusform><numerusform>%n GB aan vrije oplsagruimte beschikbaar</numerusform></translation>
+ <translation><numerusform>%n GB aan vrije opslagruimte beschikbaar</numerusform><numerusform>%n GB aan vrije opslagruimte beschikbaar</numerusform></translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
@@ -944,10 +626,6 @@
<source>Select payment request file</source>
<translation>Selecteer betalingsverzoek bestand</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Selecteer betalingsverzoek bestand om te openen</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -960,8 +638,16 @@
<translation>&amp;Algemeen</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Start %1 automatisch na inloggen in het systeem.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Start %1 bij het inloggen op het systeem</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
- <translation>Grootte van de &amp;database cache</translation>
+ <translation>Grootte van de &amp;databasecache</translation>
</message>
<message>
<source>MB</source>
@@ -988,12 +674,8 @@
<translation>Minimaliseren in plaats van de applicatie af te sluiten wanneer het venster is afgesloten. Als deze optie is ingeschakeld, zal de toepassing pas worden afgesloten na het selecteren van Exit in het menu.</translation>
</message>
<message>
- <source>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>
+ <translation>URL's van derden (bijvoorbeeld block explorer) die in de transacties tab verschijnen als contextmenuelementen. %s in de URL is vervangen door transactiehash. Verscheidene URL's zijn gescheiden door een verticale streep |. </translation>
</message>
<message>
<source>Third party transaction URLs</source>
@@ -1001,7 +683,7 @@
</message>
<message>
<source>Active command-line options that override above options:</source>
- <translation>Actieve commandoregelopties die bovenstaande opties overschrijven:</translation>
+ <translation>Actieve opdrachtregelopties die bovenstaande opties overschrijven:</translation>
</message>
<message>
<source>Reset all client options to default.</source>
@@ -1016,14 +698,6 @@
<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>
@@ -1049,7 +723,7 @@
</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>Open de Bitcoin-poort automatisch op de router. Dit werkt alleen als de router UPnP ondersteunt en het aanstaat.</translation>
+ <translation>Open de Bitcoinpoort automatisch op de router. Dit werkt alleen als de router UPnP ondersteunt en het aanstaat.</translation>
</message>
<message>
<source>Map port using &amp;UPnP</source>
@@ -1057,7 +731,7 @@
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
- <translation>Verbind met het Bitcoin netwerk via een SOCKS5 proxy.</translation>
+ <translation>Verbind met het Bitcoinnetwerk via een SOCKS5 proxy.</translation>
</message>
<message>
<source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
@@ -1076,6 +750,14 @@
<translation>Poort van de proxy (bijv. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Gebruikt om peers te bereiken via:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Vertoningen, als de opgegeven standaard SOCKS5-proxy is gebruikt om peers te benaderen via dit type netwerk.</translation>
+ </message>
+ <message>
<source>IPv4</source>
<translation>IPv4</translation>
</message>
@@ -1088,12 +770,28 @@
<translation>Tor</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Maak verbinding met Bitcoinnetwerk door een aparte SOCKS5-proxy voor verborgen diensten van Tor.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Gebruikt aparte SOCKS5-proxy om peers te bereiken via verborgen diensten van Tor:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Scherm</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Verberg het icoon van de systeembalk.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Verberg systeembalk icoon</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
- <translation>Laat alleen een systeemvak-icoon zien wanneer het venster geminimaliseerd is</translation>
+ <translation>Laat alleen een systeemvakicoon zien wanneer het venster geminimaliseerd is</translation>
</message>
<message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
@@ -1101,7 +799,7 @@
</message>
<message>
<source>M&amp;inimize on close</source>
- <translation>Minimaliseer bij sluiten van het &amp;venster</translation>
+ <translation>M&amp;inimaliseer bij sluiten van het venster</translation>
</message>
<message>
<source>&amp;Display</source>
@@ -1112,12 +810,16 @@
<translation>Taal &amp;Gebruikersinterface:</translation>
</message>
<message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation>De taal van de gebruikersinterface kan hier ingesteld worden. Deze instelling zal pas van kracht worden nadat %1 herstart wordt.</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Eenheid om bedrag in te tonen:</translation>
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation>Kies de standaard onderverdelingseenheid om weer te geven in uw programma, en voor het versturen van munten</translation>
+ <translation>Kies de standaardonderverdelingseenheid om weer te geven in uw programma, en voor het versturen van munten</translation>
</message>
<message>
<source>Whether to show coin control features or not.</source>
@@ -1129,7 +831,7 @@
</message>
<message>
<source>&amp;Cancel</source>
- <translation>Ann&amp;uleren</translation>
+ <translation>&amp;Annuleren</translation>
</message>
<message>
<source>default</source>
@@ -1168,7 +870,7 @@
</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>De weergegeven informatie kan verouderd zijn. Uw portemonnee synchroniseert automaticsh met het Bitcoinnetwerk nadat een verbinding is gelegd, maar dit proces is nog niet voltooid.</translation>
+ <translation>De weergegeven informatie kan verouderd zijn. Uw portemonnee synchroniseert automatisch met het Bitcoinnetwerk nadat een verbinding is gelegd, maar dit proces is nog niet voltooid.</translation>
</message>
<message>
<source>Watch-only:</source>
@@ -1236,97 +938,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI-behandeling</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Ongeldig betalingsadres %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Betalingsverzoek geweigerd</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Betalingsaanvraagnetwerk komt niet overeen met klantennetwerk.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Betalingsaanvraag is niet geïnitialiseerd.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Het gevraagde betalingsbedrag van %1 is te weinig (beschouwd als stof).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Fout bij betalingsverzoek</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Kan bitcoin niet starten: click-to-pay handler</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>URL om betalingsverzoek te verkrijgen is ongeldig: %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 kan niet verwerkt worden! Dit kan het gevolg zijn van een ongeldig Bitcoin adres of misvormde URI parameters.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Betalingsverzoek bestandsafhandeling</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Betalingsverzoek-bestand kan niet gelezen of verwerkt worden! Dit kan veroorzaakt worden door een ongeldig betalingsverzoek-bestand.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Betalingsverzoek verlopen.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>Niet-geverifieerde betalingsverzoeken naar aangepaste betaling scripts worden niet ondersteund.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Ongeldig betalingsverzoek.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <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>Error communicating with %1: %2</source>
- <translation>Fout bij communiceren met %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Betalingsverzoek kan niet juist worden ontleed of verwerkt!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Ongeldige respons van server %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Betaling bevestigd</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Netwerkfout bij verzoek</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1334,7 +945,7 @@
</message>
<message>
<source>Node/Service</source>
- <translation>Node/Service</translation>
+ <translation>Node/Dienst</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1349,11 +960,11 @@
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
- <translation>Voer een Bitcoin-adres in (bijv. %1)</translation>
+ <translation>Voer een Bitcoinadres in (bijv. %1)</translation>
</message>
<message>
<source>%1 d</source>
- <translation>%1d</translation>
+ <translation>%1 d</translation>
</message>
<message>
<source>%1 h</source>
@@ -1365,7 +976,7 @@
</message>
<message>
<source>%1 s</source>
- <translation>%1s</translation>
+ <translation>%1 s</translation>
</message>
<message>
<source>None</source>
@@ -1381,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Afbeelding opslaan...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Afbeelding kopiëren</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Sla QR-code op</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG afbeelding (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Clientnaam</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N.v.t.</translation>
</message>
@@ -1426,14 +1014,14 @@
<translation>Algemeen</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Gebruikt OpenSSL versie</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Gebruikt BerkeleyDB versie</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Data map</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Opstarttijd</translation>
</message>
@@ -1458,8 +1046,16 @@
<translation>Huidig aantal blokken</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>Open het Bitcoin Core debug logbestand van de huidige gegevens directory. Dit kan enkele seconden duren voor grote logbestanden.</translation>
+ <source>Memory Pool</source>
+ <translation>Geheugenpoel</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Huidig aantal transacties</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Geheugengebruik</translation>
</message>
<message>
<source>Received</source>
@@ -1474,10 +1070,18 @@
<translation>&amp;Peers</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>Gebande peers</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>Selecteer een peer om gedetailleerde informatie te bekijken.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Toegestaan</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Directie</translation>
</message>
@@ -1486,6 +1090,10 @@
<translation>Versie</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Start Blok</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation>Gesynchroniseerde headers</translation>
</message>
@@ -1498,8 +1106,20 @@
<translation>User Agent</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Open het %1 debug-logbestand van de huidige datamap. Dit kan een aantal seconden duren voor grote logbestanden.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Verklein lettergrootte</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Vergroot lettergrootte</translation>
+ </message>
+ <message>
<source>Services</source>
- <translation>Services</translation>
+ <translation>Diensten</translation>
</message>
<message>
<source>Ban Score</source>
@@ -1526,6 +1146,14 @@
<translation>De tijdsduur van een op het moment openstaande ping.</translation>
</message>
<message>
+ <source>Ping Wait</source>
+ <translation>Pingwachttijd</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation>Tijdcompensatie</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Tijd laatste blok</translation>
</message>
@@ -1551,25 +1179,29 @@
</message>
<message>
<source>In:</source>
- <translation>In;</translation>
+ <translation>In:</translation>
</message>
<message>
<source>Out:</source>
<translation>Uit:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Bouwdatum</translation>
- </message>
- <message>
<source>Debug log file</source>
- <translation>Debug-logbestand</translation>
+ <translation>Debuglogbestand</translation>
</message>
<message>
<source>Clear console</source>
<translation>Maak console leeg</translation>
</message>
<message>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Verbreek Verbinding Node</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Ban Node voor</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation>1 &amp;uur</translation>
</message>
@@ -1586,8 +1218,12 @@
<translation>1 &amp;jaar</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Welkom op de Bitcoin Core RPC console.</translation>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Maak Ban Ongedaan voor Node</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Welkom bij de %1 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>
@@ -1595,7 +1231,7 @@
</message>
<message>
<source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
- <translation>Typ &lt;b&gt;help&lt;/b&gt; voor een overzicht van de beschikbare commando's.</translation>
+ <translation>Typ &lt;b&gt;help&lt;/b&gt; voor een overzicht van de beschikbare opdrachten.</translation>
</message>
<message>
<source>%1 B</source>
@@ -1614,6 +1250,10 @@
<translation>%1 Gb</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(node id: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>via %1</translation>
</message>
@@ -1666,7 +1306,7 @@
</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>Een optioneel bericht om bij te voegen aan het betalingsverzoek, dewelke zal getoond worden wanneer het verzoek is geopend. Opermerking: Het bericht zal niet worden verzonden met de betaling over het Bitcoin netwerk.</translation>
+ <translation>Een optioneel bericht om bij te voegen aan het betalingsverzoek, welke zal getoond worden wanneer het verzoek is geopend. Opmerking: Het bericht zal niet worden verzonden met de betaling over het Bitcoinnetwerk.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
@@ -1712,18 +1352,6 @@
<source>Remove</source>
<translation>Verwijder</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopieer label</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopieer bericht</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopieer bedrag</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1743,79 +1371,12 @@
<source>&amp;Save Image...</source>
<translation>&amp;Sla afbeelding op...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Betalingsverzoek tot %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Betalingsinformatie</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Bedrag</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Bericht</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Resulterende URI te lang, probeer de tekst korter te maken voor het label/bericht.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Fout tijdens encoderen URI in QR-code</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Bericht</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Bedrag</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(geen label)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(geen bericht)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(geen bedrag)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
- <translation>Verstuur munten</translation>
+ <translation>Verstuurde munten</translation>
</message>
<message>
<source>Coin Control Features</source>
@@ -1851,11 +1412,11 @@
</message>
<message>
<source>Fee:</source>
- <translation>Vergoeding:</translation>
+ <translation>Kosten:</translation>
</message>
<message>
<source>After Fee:</source>
- <translation>Na vergoeding:</translation>
+ <translation>Naheffing:</translation>
</message>
<message>
<source>Change:</source>
@@ -1863,7 +1424,7 @@
</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>Als dit is geactiveerd, maar het wisselgeldadres is leeg of ongeldig, dan wordt het wisselgeld verzonden naar een nieuw gegenereerd adres.</translation>
+ <translation>Als dit is geactiveerd, maar het wisselgeldadres is leeg of ongeldig, dan wordt het wisselgeld verstuurd naar een nieuw gegenereerd adres.</translation>
</message>
<message>
<source>Custom change address</source>
@@ -1879,7 +1440,7 @@
</message>
<message>
<source>collapse fee-settings</source>
- <translation>Transactiekosteninstellingen verbergen</translation>
+ <translation>verberg kosteninstellingen</translation>
</message>
<message>
<source>per kilobyte</source>
@@ -1915,7 +1476,7 @@
</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>
+ <translation>(Slimme transactiekosten is nog niet geïnitialiseerd. Dit duurt meestal een paar blokken...)</translation>
</message>
<message>
<source>Confirmation time:</source>
@@ -1930,16 +1491,8 @@
<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>
- <message>
<source>Send to multiple recipients at once</source>
- <translation>Verstuur aan verschillende ontvangers ineens</translation>
+ <translation>Verstuur in een keer aan verschillende ontvangers</translation>
</message>
<message>
<source>Add &amp;Recipient</source>
@@ -1967,124 +1520,20 @@
</message>
<message>
<source>S&amp;end</source>
- <translation>&amp;Verstuur</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation>Bevestig versturen munten</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 tot %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopieer aantal</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopieer bedrag</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopieer vergoeding</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopieer na vergoeding</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopieer bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopieer prioriteit</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopieer wijziging</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>Totaalbedrag %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>of</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Bedrag is hoger dan uw huidige saldo</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Totaal overschrijdt uw huidige saldo wanneer de %1 transactiekosten worden meegerekend</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Transactie creatie niet gelukt!</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>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>Payment request expired.</source>
- <translation>Betalingsverzoek verlopen.</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>Het adres van de ontvanger is niet geldig. Gelieve opnieuw te controleren..</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation>Dubbel adres gevonden: adressen mogen maar één keer worden gebruikt worden.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Waarschuwing: Ongeldig Bitcoin adres</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(geen label)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Waarschuwing: Onbekend wisselgeldadres</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopieër stof</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Weet u zeker dat u wilt verzenden?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>toegevoegd als transactiekosten</translation>
+ <translation>V&amp;erstuur</translation>
</message>
</context>
<context>
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation>Bedra&amp;g:</translation>
+ <translation>B&amp;edrag:</translation>
</message>
<message>
<source>Pay &amp;To:</source>
<translation>Betaal &amp;Aan:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Vul een label in voor dit adres om het toe te voegen aan uw adresboek</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Label:</translation>
</message>
@@ -2098,7 +1547,7 @@
</message>
<message>
<source>The Bitcoin address to send the payment to</source>
- <translation>Het Bitcoin adres om betaling aan te voldoen</translation>
+ <translation>Het Bitcoinadres om betaling aan te versturen</translation>
</message>
<message>
<source>Alt+A</source>
@@ -2118,11 +1567,11 @@
</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>De vergoeding zal worden afgetrokken van het bedrag dat verzonden wordt. De ontvangers zullen minder bitcoins ontvangen dan ingevoerd is in het hoeveelheids veld. Als er meerdere ontvangers geselecteerd zijn, dan wordt de vergoeding gelijk verdeeld.</translation>
+ <translation>De transactiekosten zal worden afgetrokken van het bedrag dat verstuurd wordt. De ontvangers zullen minder bitcoins ontvangen dan ingevoerd is in het hoeveelheidsveld. Als er meerdere ontvangers geselecteerd zijn, dan worden de transactiekosten gelijk verdeeld.</translation>
</message>
<message>
<source>S&amp;ubtract fee from amount</source>
- <translation>Trek de vergoeding af van het bedrag.</translation>
+ <translation>Trek de transactiekosten a&amp;f van het bedrag.</translation>
</message>
<message>
<source>Message:</source>
@@ -2142,7 +1591,7 @@
</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>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>
+ <translation>Een bericht dat werd toegevoegd aan de bitcoin: URI welke wordt opgeslagen met de transactie ter referentie. Opmerking: Dit bericht zal niet worden verzonden over het Bitcoinnetwerk.</translation>
</message>
<message>
<source>Pay To:</source>
@@ -2156,8 +1605,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core is aan het afsluiten...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 is aan het afsluiten...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2168,19 +1617,19 @@
<name>SignVerifyMessageDialog</name>
<message>
<source>Signatures - Sign / Verify a Message</source>
- <translation>Handtekeningen - Onderteken een bericht / Verifiëer een handtekening</translation>
+ <translation>Handtekeningen – Onderteken een bericht / Verifiëer een handtekening</translation>
</message>
<message>
<source>&amp;Sign Message</source>
- <translation>O&amp;nderteken Bericht</translation>
+ <translation>&amp;Onderteken Bericht</translation>
</message>
<message>
<source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>U kunt berichten/overeenkomsten ondertekenen met uw adres om te bewijzen dat u Bitcoins kunt versturen. Wees voorzichtig met het ondertekenen van iets vaags of willekeurigs, omdat phishing-aanvallen u kunnen proberen te misleiden tot het ondertekenen van overeenkomsten om uw identiteit aan hen toe te vertrouwen. Onderteken alleen volledig gedetailleerde verklaringen voordat u akkoord gaat.</translation>
+ <translation>U kunt berichten/overeenkomsten ondertekenen met uw adres om te bewijzen dat u Bitcoins kunt versturen. Wees voorzichtig met het ondertekenen van iets vaags of willekeurigs, omdat phishingaanvallen u kunnen proberen te misleiden tot het ondertekenen van overeenkomsten om uw identiteit aan hen toe te vertrouwen. Onderteken alleen volledig gedetailleerde verklaringen voordat u akkoord gaat.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
- <translation>Het Bitcoin adres om bericht mee te ondertekenen</translation>
+ <translation>Het Bitcoinadres om bericht mee te ondertekenen</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -2236,7 +1685,7 @@
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
- <translation>Het Bitcoin adres waarmee het bericht ondertekend is</translation>
+ <translation>Het Bitcoinadres waarmee het bericht ondertekend is</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
@@ -2250,70 +1699,10 @@
<source>Reset all verify message fields</source>
<translation>Verwijder alles in de invulvelden</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Klik "Onderteken Bericht" om de handtekening te genereren</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Het opgegeven adres is ongeldig.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Controleer s.v.p. het adres en probeer het opnieuw.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Het opgegeven adres verwijst niet naar een sleutel.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Portemonnee-ontsleuteling is geannuleerd</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Geheime sleutel voor het ingevoerde adres is niet beschikbaar.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Ondertekenen van het bericht is mislukt.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Bericht ondertekend.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>De handtekening kon niet worden gedecodeerd.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Controleer s.v.p. de handtekening en probeer het opnieuw.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>De handtekening hoort niet bij het bericht.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Berichtverificatie mislukt.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Bericht correct geverifiëerd.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Kern</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>De Bitcoin Core ontwikkelaars</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnetwerk]</translation>
</message>
@@ -2326,634 +1715,356 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Openen totdat %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>conflicterend</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/onbevestigd</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 bevestigingen</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, uitgezonden naar %n node</numerusform><numerusform>, uitgezonden naar %n nodes</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Bron</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Gegenereerd</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Van</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Aan</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>eigen adres</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>alleen-bekijkbaar</translation>
- </message>
- <message>
- <source>label</source>
- <translation>label</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Credit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>komt tot wasdom na %n nieuw blok</numerusform><numerusform>komt tot wasdom na %n nieuwe blokken</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>niet geaccepteerd</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debet</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Totaal debit</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Totaal credit</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Transactiekosten</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Netto bedrag</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Bericht</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Opmerking</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transactie-ID:</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Handelaar</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>Gegenereerde munten moeten %1 blokken rijpen voordat ze kunnen worden besteed. Toen dit blok gegenereerd werd, werd het uitgezonden naar het netwerk om aan de blokketen toegevoegd te worden. Als het niet lukt om in de keten toegevoegd te worden, zal de status te veranderen naar "niet geaccepteerd" en het zal deze niet besteedbaar zijn. Dit kan soms gebeuren als een ander knooppunt een blok genereert binnen een paar seconden na die van u.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Debug-informatie</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transactie</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Inputs</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Bedrag</translation>
- </message>
- <message>
- <source>true</source>
- <translation>waar</translation>
- </message>
- <message>
- <source>false</source>
- <translation>onwaar</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, is nog niet met succes uitgezonden</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Open voor nog %n blok</numerusform><numerusform>Open voor nog %n blokken</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>onbekend</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transactiedetails</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Dit venster laat een uitgebreide beschrijving van de transactie zien</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Type</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>immatuur (%1 bevestigingen, zal beschikbaar zijn na %2)</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Open voor nog %n blok</numerusform><numerusform>Open voor nog %n blokken</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Open tot %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Bevestigd (%1 bevestigingen)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Dit blok is niet ontvangen bij andere nodes en zal waarschijnlijk niet worden geaccepteerd!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Gegenereerd maar niet geaccepteerd</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Niet verbonden</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Onbevestigd</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Bevestigen (%1 van %2 aanbevolen bevestigingen)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Conflicterend</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ontvangen met</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Ontvangen van</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Verzonden aan</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Betaling aan uzelf</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Gedolven</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>alleen-bekijkbaar</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(nvt)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Transactiestatus. Houd de muiscursor boven dit veld om het aantal bevestigingen te laten zien.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Datum en tijd waarop deze transactie is ontvangen.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Type transactie.</translation>
- </message>
- <message>
- <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>
+ <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Amount removed from or added to balance.</source>
- <translation>Bedrag verwijderd van of toegevoegd aan saldo</translation>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Eenheid om bedragen uit te drukken. Klik om een andere eenheid te selecteren.</translation>
</message>
</context>
<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Alles</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Vandaag</translation>
- </message>
+ <name>bitcoin-core</name>
<message>
- <source>This week</source>
- <translation>Deze week</translation>
+ <source>Options:</source>
+ <translation>Opties:</translation>
</message>
<message>
- <source>This month</source>
- <translation>Deze maand</translation>
+ <source>Specify data directory</source>
+ <translation>Stel datamap in</translation>
</message>
<message>
- <source>Last month</source>
- <translation>Vorige maand</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Verbind naar een node om adressen van anderen op te halen, en verbreek vervolgens de verbinding</translation>
</message>
<message>
- <source>This year</source>
- <translation>Dit jaar</translation>
+ <source>Specify your own public address</source>
+ <translation>Specificeer uw eigen publieke adres</translation>
</message>
<message>
- <source>Range...</source>
- <translation>Bereik...</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Aanvaard opdrachtregel- en JSON-RPC-opdrachten</translation>
</message>
<message>
- <source>Received with</source>
- <translation>Ontvangen met</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Als er geen &lt;categorie&gt; is opgegeven of als de &lt;categorie&gt; 1 is, laat dan alle debugginginformatie zien.</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Verzonden aan</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>Snoeien is geconfigureerd on het minimum van %d MiB. Gebruik a.u.b. een hoger aantal.</translation>
</message>
<message>
- <source>To yourself</source>
- <translation>Aan uzelf</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Snoei: laatste portemoneesynchronisatie gaat verder dan de gesnoeide data. U moet -reindex gebruiken (download opnieuw de gehele blokketen voor een weggesnoeide node)</translation>
</message>
<message>
- <source>Mined</source>
- <translation>Gedolven</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>Beperk benodigde opslag door snoeien (verwijderen) van oude blokken. Deze modus is niet-compatibele met -txindex en -rescan. Waarschuwing: Terugzetten van deze instellingen vereist opnieuw downloaden van gehele de blokketen. (standaard:0 = uitzetten snoeimodus, &gt;%u = doelgrootte in MiB voor blokbestanden)</translation>
</message>
<message>
- <source>Other</source>
- <translation>Anders</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Herscannen is niet mogelijk in de snoeimodus. U moet -reindex gebruiken dat de hele blokketen opnieuw zal downloaden.</translation>
</message>
<message>
- <source>Enter address or label to search</source>
- <translation>Vul adres of label in om te zoeken</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Fout: er is een fout opgetreden, zie debug.log voor details</translation>
</message>
<message>
- <source>Min amount</source>
- <translation>Min. bedrag</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Transactiekosten (in %s/kB) toevoegen aan transacties die u doet (standaard: %s)</translation>
</message>
<message>
- <source>Copy address</source>
- <translation>Kopieer adres</translation>
+ <source>Pruning blockstore...</source>
+ <translation>Snoei blokopslag...</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Kopieer label</translation>
+ <source>Run in the background as a daemon and accept commands</source>
+ <translation>Draai in de achtergrond als daemon en aanvaard opdrachten</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Kopieer bedrag</translation>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Niet mogelijk ok HTTP-server te starten. Zie debuglogboek voor details.</translation>
</message>
<message>
- <source>Copy transaction ID</source>
- <translation>Kopieer transactie-ID</translation>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <translation>Accepteer verbindingen van buitenaf (standaard: 1 als geen -proxy of -connect is opgegeven)</translation>
</message>
<message>
- <source>Copy raw transaction</source>
- <translation>Kopieer </translation>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
</message>
<message>
- <source>Edit label</source>
- <translation>Bewerk label</translation>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee is zeer hoog ingesteld! Dit zijn de transactie kosten die u mogelijk betaald wanneer de schattingen niet beschikbaar zijn.</translation>
</message>
<message>
- <source>Show transaction details</source>
- <translation>Toon transactiedetails</translation>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>Een transactietarief (in %s/kB) dat gebruikt wordt als de transactiekosten schatting niet genoeg data heeft. (normaal: %s)</translation>
</message>
<message>
- <source>Export Transaction History</source>
- <translation>Exporteer Transactieverleden</translation>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Accepteer doorgestuurde transacties ontvangen van goedgekeurde peers, ook wanneer je zelf geen transacties doorstuurt (standaard: %d)</translation>
</message>
<message>
- <source>Watch-only</source>
- <translation>Alleen-bekijkbaar</translation>
+ <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>Exporting Failed</source>
- <translation>Export Mislukt</translation>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>Kan geen lock verkrijgen op gegevensmap %s. %s draait waarschijnlijk al.</translation>
</message>
<message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Er is een fout opgetreden bij het opslaan van het transactieverleden naar %1.</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 blokketen door -rescan tijdens het opstarten</translation>
</message>
<message>
- <source>Exporting Successful</source>
- <translation>Export Succesvol</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-softwarelicentie, zie het bijgevoegde bestand COPYING of &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Het transactieverleden was succesvol bewaard in %1.</translation>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>Waarschuwing: Fout bij het lezen van %s! Alle sleutels zijn in goede orde uitgelezen, maar transactiedata of adresboeklemma's zouden kunnen ontbreken of fouten bevatten.</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommagescheiden bestand (*.csv)</translation>
+ <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
+ <translation>Voer opdracht uit zodra een portemonneetransactie verandert (%s in cmd wordt vervangen door TxID)</translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>Bevestigd</translation>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Forceer het doorsturen van transacties van goedgekeurde peers, zelfs wanneer deze niet voldoen aan de lokale doorstuur regels (standaard: %d)</translation>
</message>
<message>
- <source>Date</source>
- <translation>Datum</translation>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>Maximum toegestane peer tijd compensatie. Lokaal perspectief van tijd mag worden beinvloed door peers die met deze hoeveelheid voor of achter lopen. (standaard: %u seconden)</translation>
</message>
<message>
- <source>Type</source>
- <translation>Type</translation>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Maximum totale transactiekosten (in %s) om te gebruiken in een enkele portemoneetransactie; als dit te laag is ingesteld kunnen grote transacties worden verhinderd (standaard: %s)</translation>
</message>
<message>
- <source>Label</source>
- <translation>Label</translation>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s 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 %s niet goed werken.</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adres</translation>
+ <source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
+ <translation>Kies het aantal scriptverificatie processen (%u tot %d, 0 = auto, &lt;0 = laat dit aantal kernen vrij, standaard: %d)</translation>
</message>
<message>
- <source>ID</source>
- <translation>ID</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>De blokdatabase bevat een blok dat lijkt uit de toekomst te komen. Dit kan gebeuren omdat de datum en tijd van uw computer niet goed staat. Herbouw de blokdatabase pas nadat u de datum en tijd van uw computer correct heeft ingesteld.</translation>
</message>
<message>
- <source>Range:</source>
- <translation>Bereik:</translation>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation>Dit is een prerelease testversie – gebruik op eigen risico! Gebruik deze niet voor het delven van munten of handelsdoeleinden</translation>
</message>
<message>
- <source>to</source>
- <translation>naar</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Gebruik UPnP om de luisterende poort te mappen (standaard: 1 als er geluisterd worden en geen -proxy is meegegeven)</translation>
</message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation>Eenheid om bedragen uit te drukken. Klik om een andere eenheid te selecteren.</translation>
+ <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
+ <translation>Waarschuwing: Het lijkt erop dat het netwerk geen consensus kan vinden! Sommige delvers lijken problemen te ondervinden.</translation>
</message>
-</context>
-<context>
- <name>WalletFrame</name>
<message>
- <source>No wallet has been loaded.</source>
- <translation>Portemonnee werd niet geladen.</translation>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation>Waarschuwing: Het lijkt erop dat we geen consensus kunnen vinden met onze peers! Mogelijk dient u te upgraden, of andere nodes moeten wellicht upgraden.</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>Verstuur munten</translation>
+ <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>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Exporteer</translation>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>Om -txindex te kunnen veranderen dient u de database opnieuw te bouwen met gebruik van -reindex-chainstate.</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exporteer de data in de huidige tab naar een bestand</translation>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool moet tenminste %d MB zijn</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Portemonnee backuppen</translation>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;categorie&gt; kan zijn:</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Portemonnee-data (*.dat)</translation>
+ <source>Append comment to the user agent string</source>
+ <translation>Voeg commentaar toe aan de user agent string</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Backup Mislukt</translation>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Probeer privésleutels te herstellen van een corrupte wallet bij opstarten</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Er is een fout opgetreden bij het wegschrijven van de portemonnee-data naar %1.</translation>
+ <source>Block creation options:</source>
+ <translation>Blokcreatie-opties:</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>De portemonneedata is succesvol opgeslagen in %1.</translation>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>Kan -%s adres niet herleiden: '%s'</translation>
</message>
<message>
- <source>Backup Successful</source>
- <translation>Backup Succesvol</translation>
+ <source>Change index out of range</source>
+ <translation>Wijzigingsindex buiten bereik</translation>
</message>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Opties:</translation>
+ <source>Connect only to the specified node(s)</source>
+ <translation>Verbind alleen naar de gespecificeerde node(s)</translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>Stel datamap in</translation>
+ <source>Connection options:</source>
+ <translation>Verbindingsopties:</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Verbind naar een node om adressen van anderen op te halen, en verbreek vervolgens de verbinding</translation>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Auteursrecht (C) %i-%i</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Specificeer uw eigen publieke adres</translation>
+ <source>Corrupted block database detected</source>
+ <translation>Corrupte blokkendatabase gedetecteerd</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Aanvaard commandoregel- en JSON-RPC-commando's</translation>
+ <source>Debugging/Testing options:</source>
+ <translation>Foutopsporing/Testopties:</translation>
</message>
<message>
- <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
- <translation>Als er geen &lt;category&gt; is opgegeven of als de &lt;category&gt; 1 is, laat dan alle debugging informatie zien.</translation>
+ <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>
<message>
- <source>Error: A fatal internal error occurred, see debug.log for details</source>
- <translation>Fout: er is een fout opgetreden, zie debug.log voor details</translation>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation>Wilt u de blokkendatabase nu herbouwen?</translation>
</message>
<message>
- <source>Run in the background as a daemon and accept commands</source>
- <translation>Draai in de achtergrond als daemon en aanvaard commando's</translation>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Sta toe om hashblok te publiceren in &lt;adres&gt;</translation>
</message>
<message>
- <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>Accepteer verbindingen van buitenaf (standaard: 1 als geen -proxy of -connect is opgegeven)</translation>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Stat toe om hashtransactie te publiceren in &lt;adres&gt;</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>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Sta toe rauw blok te publiceren in &lt;adres&gt;</translation>
</message>
<message>
- <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>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Sta toe ruwe transacties te publiceren in &lt;adres&gt;</translation>
</message>
<message>
- <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>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>Transactie vervanging inschakelen in het geheugen (standaard: %u)</translation>
</message>
<message>
- <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
- <translation>Voer opdracht uit zodra een portemonneetransactie verandert (%s in cmd wordt vervangen door 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>Kies het aantal script verificatie processen (%u tot %d, 0 = auto, &lt;0 = laat dit aantal kernen vrij, standaard: %d)</translation>
+ <source>Error initializing block database</source>
+ <translation>Fout bij intialisatie blokkendatabase</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>Dit is een pre-release testversie - gebruik op eigen risico! Gebruik deze niet voor het delven van munten of handelsdoeleinden</translation>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation>Probleem met initializeren van de database-omgeving %s!</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Niet in staat om %s te verbinden op deze computer. Bitcoin Core draait waarschijnlijk al.</translation>
+ <source>Error loading %s</source>
+ <translation>Fout bij het laden van %s</translation>
</message>
<message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>WAARSCHUWING: controleer uw netwerkverbinding, %d blokken ontvangen in de laatste %d uren (%d verwacht)</translation>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Fout bij het laden van %s: Portomonnee corrupt</translation>
</message>
<message>
- <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>Waarschuwing: Het lijkt erop dat het netwerk geen consensus kan vinden! Sommige delvers lijken problemen te ondervinden.</translation>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Fout bij laden %s: Portemonnee vereist een nieuwere versie van %s</translation>
</message>
<message>
- <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation>Waarschuwing: Het lijkt erop dat we geen consensus kunnen vinden met onze peers! Mogelijk dient u te upgraden, of andere nodes moeten wellicht upgraden.</translation>
+ <source>Error loading block database</source>
+ <translation>Fout bij het laden van blokkendatabase</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>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>
+ <source>Error opening block database</source>
+ <translation>Fout bij openen blokkendatabase</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>
+ <source>Error: Disk space is low!</source>
+ <translation>Fout: Weinig vrije diskruimte!</translation>
</message>
<message>
- <source>&lt;category&gt; can be:</source>
- <translation>&lt;category&gt; kan zijn:</translation>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <translation>Mislukt om op welke poort dan ook te luisteren. Gebruik -listen=0 as u dit wilt.</translation>
</message>
<message>
- <source>Block creation options:</source>
- <translation>Blokcreatie-opties:</translation>
+ <source>Importing...</source>
+ <translation>Importeren...</translation>
</message>
<message>
- <source>Connect only to the specified node(s)</source>
- <translation>Verbind alleen naar de gespecificeerde node(s)</translation>
+ <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <translation>Incorrect of geen genesisblok gevonden. Verkeerde datamap voor het netwerk?</translation>
</message>
<message>
- <source>Connection options:</source>
- <translation>Verbindingsopties:</translation>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>Initialisatie sanity check mislukt. %s is aan het afsluiten.</translation>
</message>
<message>
- <source>Corrupted block database detected</source>
- <translation>Corrupte blokkendatabase gedetecteerd</translation>
+ <source>Invalid -onion address: '%s'</source>
+ <translation>Ongeldig -onion adres '%s'</translation>
</message>
<message>
- <source>Debugging/Testing options:</source>
- <translation>Foutopsporing/Testopties:</translation>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Ongeldig bedrag voor -%s=&lt;bedrag&gt;: '%s'</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>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Ongeldig bedrag voor -fallbackfee=&lt;bedrag&gt;: '%s'</translation>
</message>
<message>
- <source>Do you want to rebuild the block database now?</source>
- <translation>Wilt u de blokkendatabase nu herbouwen?</translation>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>De transactiegeheugenpool moet onder de &lt;n&gt; megabytes blijven (standaard: %u)</translation>
</message>
<message>
- <source>Error initializing block database</source>
- <translation>Fout bij intialisatie blokkendatabase</translation>
+ <source>Loading banlist...</source>
+ <translation>Verbanningslijst aan het laden...</translation>
</message>
<message>
- <source>Error initializing wallet database environment %s!</source>
- <translation>Probleem met initializeren van de database-omgeving %s!</translation>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Locatie van de auth cookie (standaard: data dir)</translation>
</message>
<message>
- <source>Error loading block database</source>
- <translation>Fout bij het laden van blokkendatabase</translation>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Minimum aantal bytes dat er per sigop in een transactie gerelayed en gemined worden (standaard: %u)</translation>
</message>
<message>
- <source>Error opening block database</source>
- <translation>Fout bij openen blokkendatabase</translation>
+ <source>Not enough file descriptors available.</source>
+ <translation>Niet genoeg file descriptors beschikbaar.</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Fout: Weinig vrije diskruimte!</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>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation>Mislukt om op welke poort dan ook te luisteren. Gebruik -listen=0 as u dit wilt.</translation>
+ <source>Print this help message and exit</source>
+ <translation>Print dit helpbericht en sluit af</translation>
</message>
<message>
- <source>Importing...</source>
- <translation>Importeren...</translation>
+ <source>Print version and exit</source>
+ <translation>Laat versie zien en sluit af</translation>
</message>
<message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation>Incorrect of geen genesis-blok gevonden. Verkeerde datamap voor het netwerk?</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Snoeien kan niet worden geconfigureerd met een negatieve waarde.</translation>
</message>
<message>
- <source>Invalid -onion address: '%s'</source>
- <translation>Ongeldig -onion adres '%s'</translation>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Snoeimodus is niet-compatibel met -txindex</translation>
</message>
<message>
- <source>Not enough file descriptors available.</source>
- <translation>Niet genoeg file descriptors beschikbaar.</translation>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>Herbouw ketenstaat en block index met behulp van de blk*.dat bestanden op de hardeschijf</translation>
</message>
<message>
- <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>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>Herbouw ketenstaat vanuit de huidige geindexeerde blokken</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2968,10 +2079,30 @@
<translation>Specificeer het portemonnee bestand (vanuit de gegevensmap)</translation>
</message>
<message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>Niet in staat om %s te verbinden op deze computer. %s draait waarschijnlijk al.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Niet-ondersteund argument -benchmark genegeerd, gebruik -debug=bench.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Niet-ondersteund argument -debugnet genegeerd, gebruik -debug=net</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Niet-ondersteund argument -tor gevonden, gebruik -onion.</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: %u)</source>
<translation>Gebruik UPnP om de luisterende poort te mappen (standaard: %u)</translation>
</message>
<message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>User Agentcommentaar (%s) bevat onveilige karakters.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Blokken aan het controleren...</translation>
</message>
@@ -2984,16 +2115,16 @@
<translation>Portemonnee %s bevindt zich buiten de gegevensmap %s</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>Portemonnee instellingen:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Portomonee debugging/testing opties:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Waarschuwing: Deze versie is verouderd; upgraden verplicht!</translation>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>Portemonnee moest herschreven worden: Herstart %s om te voltooien</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Om -txindex te kunnen veranderen dient u de database opnieuw te bouwen met gebruik van -reindex.</translation>
+ <source>Wallet options:</source>
+ <translation>Portemonnee instellingen:</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>
@@ -3008,49 +2139,52 @@
<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>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Ontdek eigen IP-adressen (standaard: 1 voor luisteren en geen -externalip of -proxy)</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>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>
+ <translation>Voer opdracht uit zodra een waarschuwing is ontvangen of wanneer we een erg lange fork detecteren (%s in opdracht wordt vervangen door bericht)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Transactiekosten (in %s/kB) kleiner dan dit worden beschouw dat geen transactiekosten in rekening worden gebracht voor doorgeven, mijnen en transactiecreatie (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>
+ <translation>Als paytxfee niet is ingesteld, voeg voldoende transactiekosten toe zodat transacties starten met bevestigingen binnen in n blokken (standaard: %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>
+ <translation>ongeldig bedrag voor -maxtxfee=&lt;bedrag&gt;: '%s' (moet ten minste de minimale doorgeeftransactiekosten 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>
+ <translation>Maximale grootte va n de gegevens in gegevensdragertransacties die we doorgeven en mijnen (standaard: %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>
+ <translation>Query voor peeradressen via DNS- lookup , als laag op adressen (standaard: 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>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Gebruik willekeurige inloggegevens voor elke proxyverbinding. Dit maakt streamislatie voor Tor mogelijk (standaard: %u)</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>
+ <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>The transaction amount is too small to send after the fee has been deducted</source>
- <translation>Het transactiebedrag is te klein om te versturen nadat de vergoeding in mindering is gebracht</translation>
+ <translation>Het transactiebedrag is te klein om te versturen nadat de transactiekosten in mindering zijn gebracht</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>
@@ -3058,7 +2192,11 @@
</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>
+ <translation>Goedgekeurde peers kunnen niet ge-DoS-banned worden en hun transacties worden altijd doorgegeven, zelfs als ze reeds in de mempool aanwezig zijn, nuttig voor bijv. een 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>U moet de database herbouwen met -reindex om terug te gaan naar de ongesnoeide modus. Dit zal de gehele blokkketen opnieuw downloaden.</translation>
</message>
<message>
<source>(default: %u)</source>
@@ -3066,51 +2204,27 @@
</message>
<message>
<source>Accept public REST requests (default: %u)</source>
- <translation>Accepteer publieke REST-requests (standaard: %u)</translation>
+ <translation>Accepteer publieke REST-verzoeken (standaard: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Beste reeks activeren...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Kan -whitebind adres niet herleiden: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Creëer automatisch verborgen dienst van Tor (standaard:%d)</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>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>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>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Importeer blokken van externe blk000??.dat-bestand bij opstarten</translation>
</message>
<message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ongeldig bedrag voor -mintxfee=&lt;bedrag&gt;: '%s'</translation>
+ <source>Information</source>
+ <translation>Informatie</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3130,19 +2244,27 @@
</message>
<message>
<source>Node relay options:</source>
- <translation>Node relay opties:</translation>
+ <translation>Nodedoorgeefopties:</translation>
</message>
<message>
<source>RPC server options:</source>
<translation>RPC server opties:</translation>
</message>
<message>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Verminder -maxconnections van %d naar %d, vanwege systeembeperkingen.</translation>
+ </message>
+ <message>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Herscan de blokketen voor missende portemonneetransacties bij opstarten</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
- <translation>Stuur trace/debug-info naar de console in plaats van het debug.log bestand</translation>
+ <translation>Verzend 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>
+ <translation>Indien mogelijk, verstuur zonder transactiekosten (standaard: %u)</translation>
</message>
<message>
<source>Show all debugging options (usage: --help -help-debug)</source>
@@ -3158,13 +2280,21 @@
</message>
<message>
<source>The transaction amount is too small to pay the fee</source>
- <translation>Het transactiebedrag is te klein om de vergoeding te betalen</translation>
+ <translation>Het transactiebedrag is te klein om transactiekosten in rekening te brengen</translation>
</message>
<message>
<source>This is experimental software.</source>
<translation>Dit is experimentele software.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Tor bepaalt poortwachtwoord (standaard: empty)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Tor bepaalt welke poort te gebruiken als luisteren naar onion wordt gebruikt (standaard: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Transactiebedrag te klein</translation>
</message>
@@ -3174,7 +2304,7 @@
</message>
<message>
<source>Transaction too large for fee policy</source>
- <translation>De transactie is te groot voor het toeslagenbeleid</translation>
+ <translation>De transactie is te groot voor het transactiekostenbeleid</translation>
</message>
<message>
<source>Transaction too large</source>
@@ -3185,24 +2315,32 @@
<translation>Niet in staat om aan %s te binden op deze computer (bind gaf error %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Gebruikersnaam voor JSON-RPC-verbindingen</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Upgrade portemonee naar laatste formaat bij opstarten</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>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Gebruikersnaam voor JSON-RPC-verbindingen</translation>
</message>
<message>
<source>Warning</source>
<translation>Waarschuwing</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Waarschuwing: onbekende nieuwe regels geactiveerd (versionbit %i)</translation>
+ </message>
+ <message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Om in alleen een blokmodus te opereren (standaard: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Bezig met het zappen van alle transacties van de portemonnee...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrupt, veiligstellen mislukt</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>ZeroMQ notificatieopties:</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3210,11 +2348,7 @@
</message>
<message>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
- <translation>Voer commando uit zodra het beste blok verandert (%s in cmd wordt vervangen door blockhash)</translation>
- </message>
- <message>
- <source>This help message</source>
- <translation>Dit helpbericht</translation>
+ <translation>Voer opdracht uit zodra het beste blok verandert (%s in cmd wordt vervangen door blokhash)</translation>
</message>
<message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
@@ -3225,14 +2359,26 @@
<translation>Adressen aan het laden...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee staat zeer hoog! Transactiekosten van de grootte kunnen worden gebruikt in een enkele transactie.</translation>
+ </message>
+ <message>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee staat zeer hoog! Dit is de transactiekosten die u betaalt als u een transactie doet.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Bewaar transactie niet langer dan &lt;n&gt; uren in de geheugenpool (standaard: %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Transactiekosten (in %s/kB) kleiner dan dit worden beschouwd dat geen transactiekosten in rekening worden gebracht voor transactiecreatie (standaard: %s)</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>
@@ -3246,23 +2392,51 @@
</message>
<message>
<source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
- <translation>Output extra debugginginformatie (standaard: %u, het leveren van &lt;category&gt; is optioneel)</translation>
+ <translation>Output extra debugginginformatie (standaard: %u, het leveren van &lt;categorie&gt; is optioneel)</translation>
+ </message>
+ <message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Ondersteun filtering van blokken en transacties met bloomfilters (standaard: %u)</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>Totale lengte van netwerkversiestring (%i) overschrijdt maximale lengte (%i). Verminder het aantal of grootte van uacomments.</translation>
+ </message>
+ <message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Pogingen om uitgaand verkeer onder een bepaald doel te houden (in MiB per 24u), 0 = geen limiet (standaard: %d)</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Niet-ondersteund argument -socks gevonden. Instellen van SOCKS-versie is niet meer mogelijk, alleen SOCKS5-proxies worden ondersteund.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Niet ondersteund argument -whitelistalwaysrelay genegeerd, gebruik -whitelistrelay en/of -whitelistforcerelay.</translation>
</message>
<message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
- <translation>Gebruik een aparte SOCKS5 proxy om 'Tor hidden services' te bereiken (standaard: %s)</translation>
+ <translation>Gebruik een aparte SOCKS5 proxy om verborgen diensten van Tor te bereiken (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>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Gebruikersnaam en gehasht wachtwoord voor JSON-RPC-verbindingen. De velden &lt;userpw&gt; is in het formaat: &lt;GEBRUIKERSNAAM&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Een kanoniek Pythonscript is inbegrepen in de share/rpcuser. Deze optie kan meerdere keren worden meegegeven</translation>
+ </message>
+ <message>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Waarschuwing: Onbekende blok versies worden gemined! Er zijn mogelijk onbekende regels in werking getreden</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Fout bij laden wallet.dat</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Waarschuwing: portomonee bestand is corrupt, data is veiliggesteld! Originele %s is opgeslagen als %s in %s; als uw balans of transacties incorrect zijn dient u een backup terug te zetten.</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Genereer munten (standaard: %u)</translation>
+ <source>(default: %s)</source>
+ <translation>(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>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3278,7 +2452,7 @@
</message>
<message>
<source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
- <translation>Luister naar JSON-RPC-verbindingen op poort &lt;port&gt; (standaard: %u of testnet: %u)</translation>
+ <translation>Luister naar JSON-RPC-verbindingen op &lt;poort&gt; (standaard: %u of testnet: %u)</translation>
</message>
<message>
<source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
@@ -3298,7 +2472,7 @@
</message>
<message>
<source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
- <translation>Maximum per-connectie zendbuffer, &lt;n&gt;*1000 bytes (standaard: %u)</translation>
+ <translation>Maximum per-connectie verstuurbuffer, &lt;n&gt;*1000 bytes (standaard: %u)</translation>
</message>
<message>
<source>Prepend debug output with timestamp (default: %u)</source>
@@ -3306,15 +2480,15 @@
</message>
<message>
<source>Relay and mine data carrier transactions (default: %u)</source>
- <translation>Gegevensdrager transacties relay en de mijnen (default: %u)</translation>
+ <translation>Geef gegevensdragertransacties door en mijn ze ook (standaard: %u)</translation>
</message>
<message>
<source>Relay non-P2SH multisig (default: %u)</source>
- <translation>Relay non-P2SH multisig (default: %u)</translation>
+ <translation>Geef non-P2SH multisig door (standaard: %u)</translation>
</message>
<message>
<source>Set key pool size to &lt;n&gt; (default: %u)</source>
- <translation>Stel sleutelpoelgrootte in op &lt;&amp;&gt; (standaard: %u)</translation>
+ <translation>Stel sleutelpoelgrootte in op &lt;n&gt; (standaard: %u)</translation>
</message>
<message>
<source>Set minimum block size in bytes (default: %u)</source>
@@ -3326,7 +2500,7 @@
</message>
<message>
<source>Specify configuration file (default: %s)</source>
- <translation>Specificeer configuratie bestand (standaard: %s)</translation>
+ <translation>Specificeer configuratiebestand (standaard: %s)</translation>
</message>
<message>
<source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
@@ -3338,7 +2512,7 @@
</message>
<message>
<source>Spend unconfirmed change when sending transactions (default: %u)</source>
- <translation>Besteed onbevestigd wisselgeld bij het versturen van transacties (standaard: %u)</translation>
+ <translation>Besteed onbevestigd wisselgeld bij het doen van transacties (standaard: %u)</translation>
</message>
<message>
<source>Threshold for disconnecting misbehaving peers (default: %u)</source>
@@ -3349,18 +2523,6 @@
<translation>Onbekend netwerk gespecificeerd in -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Kan -bind adres niet herleiden: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Kan -externlip adres niet herleiden: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ongeldig bedrag voor -paytxfee=&lt;bedrag&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Ontoereikend saldo</translation>
</message>
@@ -3386,7 +2548,7 @@
</message>
<message>
<source>Rescanning...</source>
- <translation>Blokketen aan het doorzoeken...</translation>
+ <translation>Blokketen aan het herscannen...</translation>
</message>
<message>
<source>Done loading</source>
diff --git a/src/qt/locale/bitcoin_pam.ts b/src/qt/locale/bitcoin_pam.ts
index ec99a1f572..5351543338 100644
--- a/src/qt/locale/bitcoin_pam.ts
+++ b/src/qt/locale/bitcoin_pam.ts
@@ -26,10 +26,6 @@
<translation>I&amp;sara</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopyan ing address</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Ilako ya ing kasalungsungan makapiling address keng listahan</translation>
</message>
@@ -37,61 +33,6 @@
<source>&amp;Delete</source>
<translation>&amp;Ilako</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Pilinan ing address a magpadalang coins kang</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Pilinan ing address a tumanggap coins a atin</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>P&amp;ilinan</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Address king pamag-Send</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Address king pamag-Tanggap</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Reni reng kekang Bitcoin address king pamagpadalang kabayaran. Lawan mulang masalese reng alaga ampo ing address na ning tumanggap bayu ka magpadalang barya.</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>Reni reng kekang Bitcoin addresses keng pamananggap bayad. Rerekomenda mi na gumamit kang bayung address keng balang transaksiyon.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopyan ing &amp;Label</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Alilan</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(alang label)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -111,82 +52,6 @@
<source>Repeat new passphrase</source>
<translation>Pasibayuan ya ing bayung passphrase</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>I-encrypt ye ing wallet</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ing operasyun a ini kailangan ne ing kekayung wallet passphrase, ban a-unlock ya ing wallet</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Unlock ya ing wallet</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ing operasyun a ini kailangan ne ing kekang wallet passphrase ban a-decrypt ne ing wallet.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>I-decrypt ya ing wallet</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Alilan ya ing passphrase</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Kumpirman ya ing wallet encryption</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>Kapabaluan: Istung in-encrypt me ing kekang wallet at meala ya ing passphrase na, ma-&lt;b&gt;ALA NO NGAN RING KEKANG BITCOINS&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Siguradu na kang buri meng i-encrypt ing kekang wallet?</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>Mayalaga: Reng milabas a backups a gewa mu gamit ing wallet file mu dapat lamung mialilan bayung gawang encrypted wallet file. Para keng seguridad , reng milabas a backups dareng ali maka encrypt a wallet file ma-ala nala istung inumpisan mu nalang gamitan reng bayu, at me encrypt a wallet. </translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Kapabaluan: Makabuklat ya ing Caps Lock key!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Me-encrypt ne ing wallet</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Memali ya ing pamag-encrypt king wallet </translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Memali ya ing encryption uli na ning ausan dang internal error. E ya me-encrypt ing wallet yu.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>E la mitutugma ring mibieng passphrase</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Memali ya ing pamag-unlock king wallet </translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>E ya istu ing passphrase a pepalub da para king wallet decryption</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Me-mali ya ing pamag-decrypt king wallet</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Mi-alilan ne ing passphrase na ning wallet.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -250,6 +115,10 @@
<translation>&amp;Alilan ing Passphrase...</translation>
</message>
<message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Address king pamag-Tanggap</translation>
+ </message>
+ <message>
<source>Send coins to a Bitcoin address</source>
<translation>Magpadalang barya king Bitcoin address</translation>
</message>
@@ -306,8 +175,8 @@
<translation>Gamit para king Tabs</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Kapilubluban ning Bitcoin</translation>
+ <source>&amp;Command-line options</source>
+ <translation>Pipamilian command-line</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -355,14 +224,11 @@
</message>
</context>
<context>
- <name>ClientModel</name>
+ <name>CoinControlDialog</name>
<message>
- <source>Network Alert</source>
- <translation>Alertu ning Network</translation>
+ <source>Amount:</source>
+ <translation>Alaga:</translation>
</message>
-</context>
-<context>
- <name>CoinControlDialog</name>
<message>
<source>Amount</source>
<translation>Alaga</translation>
@@ -375,22 +241,6 @@
<source>Confirmed</source>
<translation>Me-kumpirma</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopyan ing address</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopyan ing label</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopyan ing alaga</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(alang label)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -406,38 +256,6 @@
<source>&amp;Address</source>
<translation>&amp;Address</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Bayung address king pamagtanggap</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Bayung address king pamagpadala</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Alilan ya ing address king pamagpadala</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Alilan ya ing address king pamagpadala</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Ing pepalub yung address "%1" ati na yu king aklat dareng address</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Ing pepalub yung address "%1" ali ya katanggap-tanggap a Bitcoin address.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ali ya bisang mag-unlock ing wallet</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Memali ya ing pamangaua king key</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -445,10 +263,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Kapilubluban ning Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>bersion</translation>
</message>
@@ -464,7 +278,7 @@
<source>command-line options</source>
<translation>pipamilian command-line</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -472,10 +286,6 @@
<translation>Malaus ka</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Kapilubluban ning Bitcoin</translation>
- </message>
- <message>
<source>Error</source>
<translation>Mali</translation>
</message>
@@ -602,9 +412,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -619,15 +426,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Lagyu ning kliente</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -640,8 +440,8 @@
<translation>&amp;Impormasion</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Gagamit bersion na ning OpenSSL</translation>
+ <source>Debug window</source>
+ <translation>I-Debug ing awang</translation>
</message>
<message>
<source>Startup time</source>
@@ -680,10 +480,6 @@
<translation>Kabuuan:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Kaaldauan ning pamaglalang</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Debug log file</translation>
</message>
@@ -706,62 +502,31 @@
<source>&amp;Label:</source>
<translation>&amp;Label:</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopyan ing label</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopyan ing alaga</translation>
- </message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Alaga</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensayi</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Kopyan ing address</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Kaaldauan</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
+ <name>SendCoinsDialog</name>
<message>
- <source>Message</source>
- <translation>Mensayi</translation>
+ <source>Send Coins</source>
+ <translation>Magpadalang Barya</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Alaga</translation>
+ <source>Insufficient funds!</source>
+ <translation>Kulang a pondo</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(alang label)</translation>
+ <source>Amount:</source>
+ <translation>Alaga:</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation>Magpadalang Barya</translation>
+ <source>Transaction Fee:</source>
+ <translation>Bayad king Transaksion:</translation>
</message>
<message>
<source>Send to multiple recipients at once</source>
@@ -787,31 +552,7 @@
<source>S&amp;end</source>
<translation>Ipadala</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Kumpirman ing pamagpadalang barya</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopyan ing alaga</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Ing alaga mipasobra ya king kekang balanse.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Ing kabuuan mipasobra ya king kekang balanse istung inabe ya ing %1 a bayad king transaksion </translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(alang label)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -823,10 +564,6 @@
<translation>Ibayad &amp;kang:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Magpalub kang label para king address a ini ban a-iabe me king aklat dareng address</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Label:</translation>
</message>
@@ -842,6 +579,14 @@
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
+ <message>
+ <source>Message:</source>
+ <translation>Mensayi:</translation>
+ </message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Ibayad kang:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -912,66 +657,10 @@
<source>Reset all verify message fields</source>
<translation>Ibalik king dati reng ngan fields na ning pamag beripikang mensayi</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>I-click ing "Pirman ing Mensayi" ban agawa ya ing metung a pirma</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Ing milub a address e ya katanggap-tanggap.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Maliaring pakilawe pasibayu ing address at pasibayuan ya iti.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Ing milub a address ali ya mag-refer king metung a key.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Me-kansela ya ing pamag-unlock king wallet.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Ing private key para king milub a address, ala ya.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Me-mali ya ing pamag-pirma king mensayi .</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Me-pirman ne ing mensayi.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Ing pirma ali ya bisang ma-decode.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Maliaring pakilawe pasibayu ing pirma kaibat pasibayuan ya iti.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Ing pirma ali ya makatugma king message digest.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Me-mali ya ing pamag-beripika king mensayi.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Me-beripika ne ing mensayi.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Kapilubluban ning Bitcoin</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -980,330 +669,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Makabuklat anggang %1</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/ali me-kumpirma</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 kumpirmasion</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Kabilian</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Kaaldauan</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Pikuanan</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Megawa</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Menibat</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Para kang</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>sariling address</translation>
- </message>
- <message>
- <source>label</source>
- <translation>label</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Credit</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>ali metanggap</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debit</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Bayad king Transaksion</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Alaga dareng eganagana</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensayi</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Komentu</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Impormasion ning Debug</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transaksion</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Alaga</translation>
- </message>
- <message>
- <source>true</source>
- <translation>tutu</translation>
- </message>
- <message>
- <source>false</source>
- <translation>e tutu</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, eya matagumpeng mibalita</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>e miya balu</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalye ning Transaksion</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Ining pane a ini magpakit yang detalyadung description ning transaksion</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Kaaldauan</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Klase</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Makabuklat anggang %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Me-kumpirma(%1 kumpirmasion)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ing block a ini ali de atanggap deng aliwa pang nodes ania ali ya magsilbing tanggapan</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Atanggap menibat kang</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Mipadala kang</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Kabayaran keka</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Me-mina</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Status ning Transaksion: Itapat me babo na ning field a ini ban ipakit dala reng bilang dareng me-kumpirma na</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Aldo at oras nung kapilan me tanggap ya ing transaksion</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Klase ning transaksion</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Alagang milako o miragdag king balanse.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Eganagana</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Aldo iti</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Paruminggung iti</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Bulan a iti</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Milabas a bulan</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Banuang iti</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Angganan...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Atanggap kayabe ning</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Mipadala kang</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Keng sarili mu</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Me-mina</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Aliwa</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Magpalub kang address o label para pantunan</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Pekaditak a alaga</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopyan ing address</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopyan ing label</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopyan ing alaga</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Alilan ing label</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Ipakit ing detalye ning transaksion</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Comma separated file (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Me-kumpirma</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Kaaldauan</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Klase</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Label</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Angga:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>para kang</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Magpadalang Barya</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -1334,6 +709,10 @@
<translation>Tumanggap koneksion menibat king kilwal (default: 1 if no -proxy or -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Kapilubluban ning Bitcoin</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Pipamilian king pamag-gawang block:</translation>
</message>
@@ -1394,10 +773,6 @@
<translation>I-execute ing command istung mialilan ya ing best block (%s in cmd is replaced by block hash)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Ining saup a mensayi</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Payagan ing pamaglawe DNS para king -addnode, -seednode and -connect</translation>
</message>
@@ -1406,14 +781,6 @@
<translation>Lo-load da ne ing address...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Me-mali ya ing pamag-load king wallet.dat: Me-corrupt ya ing wallet</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Me-mali ya ing pamag-load king wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Ali katanggap-tanggap a -proxy addresss: '%s'</translation>
</message>
@@ -1422,18 +789,6 @@
<translation>E kilalang network ing mepili king -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Eya me-resolve ing -bind address: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Eya me-resolve ing -externalip address: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Eya maliari ing alaga keng -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Kulang a pondo</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts
index a351552b63..09f748b83c 100644
--- a/src/qt/locale/bitcoin_pl.ts
+++ b/src/qt/locale/bitcoin_pl.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation>Kliknij prawy przycisk aby edytować adres lub etykietę</translation>
+ <translation>Kliknij prawy przycisk myszy, aby edytować adres lub etykietę</translation>
</message>
<message>
<source>Create a new address</source>
@@ -26,10 +26,6 @@
<translation>Z&amp;amknij</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopiuj adres</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Usuń zaznaczony adres z listy</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Usuń</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <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, na który chcesz otrzymać monety</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>W&amp;ybierz</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Adres wysyłania</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Adres odbiorczy</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>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, 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>
- <translation>Kopiuj &amp;EtykietÄ™</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Modyfikuj</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Eksportuj listÄ™ adresowÄ…</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>CSV (rozdzielany przecinkami)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Błąd przy próbie eksportu</translation>
- </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>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etykieta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(brak etykiety)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,100 +60,12 @@
<source>Repeat new passphrase</source>
<translation>Powtórz nowe hasło</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Zaszyfruj portfel</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ta operacja wymaga hasła do portfela ażeby odblokować portfel.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Odblokuj portfel</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ta operacja wymaga hasła do portfela ażeby odszyfrować portfel.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Odszyfruj portfel</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Zmień hasło</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Potwierdź szyfrowanie portfela</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>Uwaga: Jeśli zaszyfrujesz swój portfel i zgubisz hasło to &lt;b&gt;STRACISZ WSZYSTKIE SWOJE BITCOIN'Y&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Jesteś pewien, że chcesz zaszyfrować swój portfel?</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>Program Bitcoin Core 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>
- </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>WAŻNE: Wszystkie wykonane wcześniej kopie pliku portfela powinny być zamienione na nowe, szyfrowane pliki. Z powodów bezpieczeństwa, poprzednie kopie nieszyfrowanych plików portfela staną się bezużyteczne jak tylko zaczniesz korzystać z nowego, szyfrowanego portfela.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Uwaga: Klawisz Caps Lock jest włączony!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Portfel zaszyfrowany</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Podaj stare i nowe hasło do portfela.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Szyfrowanie portfela nie powiodło się</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Szyfrowanie portfela nie powiodło się z powodu wewnętrznego błędu. Twój portfel nie został zaszyfrowany.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Podane hasła nie są takie same.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Odblokowanie portfela nie powiodło się</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Wprowadzone hasło do odszyfrowania portfela jest niepoprawne.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Odszyfrowanie portfela nie powiodło się</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Hasło portfela zostało pomyślnie zmienione.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
<message>
<source>IP/Netmask</source>
- <translation>IP/Maska Sieci</translation>
+ <translation>IP / maska podsieci</translation>
</message>
<message>
<source>Banned Until</source>
@@ -270,6 +111,14 @@
<translation>Zamknij program</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;O %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Pokaż informacje o %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>O &amp;Qt</translation>
</message>
@@ -282,6 +131,10 @@
<translation>&amp;Opcje...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Zmień opcje konfiguracji dla %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>Zaszyfruj Portf&amp;el</translation>
</message>
@@ -306,20 +159,12 @@
<translation>Otwórz URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Rdzeń klienta Bitcoin</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importowanie bloków z dysku...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Ponowne indeksowanie bloków na dysku...</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation>Wyślij monety na adres Bitcoin</translation>
+ <translation>Wyślij monety na adres bitcoinowy</translation>
</message>
<message>
<source>Backup wallet to another location</source>
@@ -358,10 +203,6 @@
<translation>Odbie&amp;rz</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Pokaż informacje o Rdzeniu Bitcoin</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Pokaż / Ukryj</translation>
</message>
@@ -371,7 +212,7 @@
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation>Szyfruj klucze prywatne, które są w Twoim portfelu</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>
@@ -379,7 +220,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 podanym adresem Bitcoin.</translation>
+ <translation>Zweryfikuj wiadomość, aby upewnić się, że została podpisana podanym adresem bitcoinowym.</translation>
</message>
<message>
<source>&amp;File</source>
@@ -398,20 +239,8 @@
<translation>Pasek zakładek</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Rdzeń Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation>Żądaj płatności (generuje kod QR oraz bitcoin URI)</translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;O Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Zmień opcje konfiguracji dla Bitcoin Core</translation>
+ <translation>Żądaj płatności (generuje kod QR oraz bitcoinowe URI)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -429,15 +258,19 @@
<source>&amp;Command-line options</source>
<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 aktywnych połączeń do sieci Bitcoin</numerusform><numerusform>%n aktywnych połączeń do sieci Bitcoin</numerusform><numerusform>%n aktywnych połączeń do sieci Bitcoin</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Indeksowanie bloków na dysku...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Przetwarzanie blocks on disk...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Brak dostępnych źródeł bloków...</translation>
</message>
@@ -450,6 +283,10 @@
<translation><numerusform>%n godzin</numerusform><numerusform>%n godzin</numerusform><numerusform>%n godzin</numerusform></translation>
</message>
<message numerus="yes">
+ <source>%n day(s)</source>
+ <translation><numerusform>dzień</numerusform><numerusform>%n dni</numerusform><numerusform>%n dni</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>%n tygodni</numerusform><numerusform>%n tygodni</numerusform><numerusform>%n tygodni</numerusform></translation>
</message>
@@ -463,7 +300,7 @@
</message>
<message>
<source>%1 behind</source>
- <translation>%1 wstecz</translation>
+ <translation>%1 za</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -490,8 +327,16 @@
<translation>Aktualny</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Pokaż pomoc %1 aby zobaczyć listę wszystkich opcji lnii poleceń.</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 klient</translation>
+ </message>
+ <message>
<source>Catching up...</source>
- <translation>SynchronizujÄ™ siÄ™...</translation>
+ <translation>Trwa synchronizacja…</translation>
</message>
<message>
<source>Date: %1
@@ -541,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Komunikat Sieci</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -625,150 +463,6 @@
<source>Priority</source>
<translation>Priorytet</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopiuj adres</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiuj etykietÄ™</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiuj kwotÄ™</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Skopiuj ID transakcji</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Zablokuj niewydane</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Odblokuj niewydane</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Skopiuj ilość</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Skopiuj opłatę</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Skopiuj ilość po opłacie</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Skopiuj ilość bajtów</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <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>
- <message>
- <source>highest</source>
- <translation>najwyższa</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>wyższa</translation>
- </message>
- <message>
- <source>high</source>
- <translation>wysoka</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>średnio wysoki</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>średnia</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>średnio niski</translation>
- </message>
- <message>
- <source>low</source>
- <translation>niski</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>niższy</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>najniższy</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 zablokowane)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>żaden</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Ta etykieta staje się czerwona, kiedy transakcja jest większa niż 1000 bajtów.</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>
- </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>
- <message>
- <source>no</source>
- <translation>nie</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Waha się +/- 1 bajt na wejście.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transakcje o wyższym priorytecie zwykle szybciej zostają dołączone do bloku.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(brak etykiety)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>reszta z %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(reszta)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -792,38 +486,6 @@
<source>&amp;Address</source>
<translation>&amp;Adres</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nowy adres otrzymywania</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nowy adres wysyłania</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Zmień adres odbioru</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Zmień adres wysyłania</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Wprowadzony adres "%1" już istnieje w książce adresowej.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Wprowadzony adres "%1" nie jest poprawnym adresem Bitcoin.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Nie można było odblokować portfela.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Tworzenie nowego klucza nie powiodło się.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -851,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Rdzeń Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>wersja</translation>
</message>
@@ -863,8 +521,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>O Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>Informacje o %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -878,6 +536,34 @@
<source>command-line options</source>
<translation>opcje konsoli</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>Opcje interfejsu</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Katalog danych używany podczas uruchamiania programu (domyślny: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Wybierz język, na przykład «de_DE» (domyślnie: język systemowy)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Uruchom zminimalizowany</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>Show splash screen on startup (default: %u)</source>
+ <translation>Wyświetl okno powitalne podczas uruchamiania (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Zresetuj wszystkie ustawienia zmienione w GUI</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -886,16 +572,16 @@
<translation>Witaj</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Witam w Bitcoin Core</translation>
+ <source>Welcome to %1.</source>
+ <translation>Witaj w %1.</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>Ponieważ jest to pierwsze uruchomienie programu, możesz wybrać gdzie Bitcoin Core będzie przechowywał swoje dane.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Ponieważ jest to pierwsze uruchomienie programu, możesz wybrać gdzie %1 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 ilość danych będzie rosła. Portfel będzie przechowywany w tym samym katalogu.</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 pobierze i będzie przechowywał kopię łańcucha bloków Bitcoin. W wybranym katalogu zostanie zapisanych %2GB danych, a z czasem ta ilość będzie rosła. Portfel będzie przechowywany w tym samym katalogu.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -906,12 +592,8 @@
<translation>Użyj wybranego folderu dla danych</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Rdzeń Bitcoin</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
- <translation>Błąd: Określony folder danych "%1" nie mógł zostać utworzony.</translation>
+ <translation>Błąd: podany folder danych «%1» nie mógł zostać utworzony.</translation>
</message>
<message>
<source>Error</source>
@@ -944,10 +626,6 @@
<source>Select payment request file</source>
<translation>Otwórz żądanie zapłaty z pliku</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Wybierz plik żądania zapłaty do otwarcia</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -960,6 +638,14 @@
<translation>Główne</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Automatycznie uruchom %1 po zalogowaniu do systemu.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>Uruchamiaj %1 wraz z zalogowaniem do &amp;systemu</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>Wielkość bufora bazy &amp;danych</translation>
</message>
@@ -988,10 +674,6 @@
<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>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>Można tu ustawić język interfejsu uzytkownika. Żeby ustawienie przyniosło skutek trzeba uruchomić ponownie 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>Zewnętrzne URL podglądu transakcji (np. eksplorator bloków), które będą wyświetlały się w menu kontekstowym, w zakładce transakcji. %s będzie zamieniany w adresie na hash transakcji. Oddziel wiele adresów pionową kreską |.</translation>
</message>
@@ -1009,21 +691,13 @@
</message>
<message>
<source>&amp;Reset Options</source>
- <translation>Z&amp;resetuj Ustawienia</translation>
+ <translation>Z&amp;resetuj ustawienia</translation>
</message>
<message>
<source>&amp;Network</source>
<translation>&amp;Sieć</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Automatycznie uruchamia Bitcoin po zalogowaniu do systemu.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>Uruchamiaj Bitcoin wraz z zalogowaniem do &amp;systemu</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>
@@ -1065,7 +739,7 @@
</message>
<message>
<source>Proxy &amp;IP:</source>
- <translation>Proxy &amp;IP: </translation>
+ <translation>&amp;IP proxy: </translation>
</message>
<message>
<source>&amp;Port:</source>
@@ -1076,6 +750,14 @@
<translation>Port proxy (np. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Użyto do połączenia z peerami przy pomocy:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Pokazuje, czy wspierane domyślnie proxy SOCKS5 jest używane do łączenia się z peerami w tej sieci</translation>
+ </message>
+ <message>
<source>IPv4</source>
<translation>IPv4</translation>
</message>
@@ -1088,16 +770,32 @@
<translation>Tor</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Połącz się z siecią Bitcoin przy pomocy oddzielnego SOCKS5 proxy dla sieci TOR</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Użyj oddzielnego proxy SOCKS5 aby osiągnąć węzły w ukrytych usługach Tor:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Okno</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>Ukryj ikonÄ™ z zasobnika systemowego.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Ukryj ikonÄ™ zasobnika</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Pokazuj tylko ikonÄ™ przy zegarku po zminimalizowaniu okna.</translation>
</message>
<message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation>&amp;Minimalizuj do paska przy zegarku zamiast do paska zadań</translation>
+ <translation>&amp;Minimalizuj do zasobnika systemowego zamiast do paska zadań</translation>
</message>
<message>
<source>M&amp;inimize on close</source>
@@ -1109,7 +807,11 @@
</message>
<message>
<source>User Interface &amp;language:</source>
- <translation>Język &amp;Użytkownika:</translation>
+ <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 %1.</source>
+ <translation>Można tu ustawić język interfejsu uzytkownika. Ustawienie przyniesie skutek po ponownym uruchomieniu %1.</translation>
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
@@ -1204,7 +906,7 @@
</message>
<message>
<source>Total:</source>
- <translation>Wynosi ogółem:</translation>
+ <translation>Ogółem:</translation>
</message>
<message>
<source>Your current total balance</source>
@@ -1236,97 +938,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Obsługa URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <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>
- <message>
- <source>Payment request error</source>
- <translation>Błąd żądania płatności</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <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>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>URI nie może zostać przetworzony! Może to być spowodowane nieprawidłowym adresem Bitcoin lub uszkodzonymi parametrami URI.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Przechwytywanie plików żądania płatności</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Plików żądania płatności nie może zostać odczytany. Mogło to być spowodowane nieprawidłowym plikiem żądania płatności.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Żądanie płatności upłynęło.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>Niezweryfikowane żądania płatności do własnych skryptów płatności są niewspierane.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Nieprawidłowe żądanie płatności</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>Zwrot z %1</translation>
- </message>
- <message>
- <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
- <translation>Żądanie płatności %1 jest zbyt duże (%2 bajtów, dozwolone %3 bajtów).</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>BÅ‚Ä…d komunikacji z %1 : %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Żądanie płatności nie może zostać przetworzone.</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Błędna odpowiedź z serwera %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Płatność potwierdzona</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Błąd żądania sieci</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1349,7 +960,7 @@
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
- <translation>Wprowadź adres Bitcoin (np. %1)</translation>
+ <translation>Wprowadź adres bitcoinowy (np. %1)</translation>
</message>
<message>
<source>%1 d</source>
@@ -1381,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Zapisz obraz...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopiuj obraz</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Zapisz Kod QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Obraz PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nazwa klienta</translation>
- </message>
- <message>
<source>N/A</source>
<translation>NIEDOSTĘPNE</translation>
</message>
@@ -1426,14 +1014,14 @@
<translation>Ogólne</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Używana wersja OpenSSL</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Używana wersja BerkeleyDB </translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Katalog danych</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Czas uruchomienia</translation>
</message>
@@ -1458,8 +1046,16 @@
<translation>Aktualna liczba bloków</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>Otwórz plik logowania debugowania Bitcoin Core z obecnego katalogu z danymi. Może to potrwać kilka sekund przy większych plikach.</translation>
+ <source>Memory Pool</source>
+ <translation>Memory Pool (obszar pamięci)</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Obecna liczba transakcji</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Zużycie pamięci</translation>
</message>
<message>
<source>Received</source>
@@ -1482,6 +1078,10 @@
<translation>Wybierz węzeł żeby zobaczyć szczegóły.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Biała lista</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Kierunek</translation>
</message>
@@ -1490,10 +1090,34 @@
<translation>Wersja</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Blok startowy</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Zsynchronizowane nagłówki</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Zsynchronizowane bloki</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Aplikacja kliencka</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Otwórz plik dziennika debugowania %1 z obecnego katalogu z danymi. Może to potrwać kilka sekund przy większych plikach.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Zmniejsz rozmiar czcionki</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Zwiększ rozmiar czcionki</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Usługi</translation>
</message>
@@ -1518,6 +1142,10 @@
<translation>Czas odpowiedzi</translation>
</message>
<message>
+ <source>Ping Wait</source>
+ <translation>Czas odpowiedzi</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Przesunięcie czasu</translation>
</message>
@@ -1554,10 +1182,6 @@
<translation>Wyjście:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Data kompilacji</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Plik logowania debugowania</translation>
</message>
@@ -1566,16 +1190,36 @@
<translation>Wyczyść konsolę</translation>
</message>
<message>
+ <source>&amp;Disconnect Node</source>
+ <translation>Odłącz Nod</translation>
+ </message>
+ <message>
<source>Ban Node for</source>
<translation>Blokuj węzeł na okres</translation>
</message>
<message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;godzina</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;dzień</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;tydzień</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;rok</translation>
+ </message>
+ <message>
<source>&amp;Unban Node</source>
<translation>Odblokuj węzeł</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Witaj w konsoli Bitcoin Core RPC.</translation>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Witaj w konsoli %1 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>
@@ -1602,6 +1246,10 @@
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(id węzła: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>przez %1</translation>
</message>
@@ -1649,6 +1297,10 @@
<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>R&amp;euse an existing receiving address (not recommended)</source>
+ <translation>U&amp;żyj ponownie istniejącego adresu odbiorczego (niepolecane)</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>Opcjonalna wiadomość do dołączenia do żądania płatności, która będzie wyświetlana, gdy żądanie zostanie otwarte. Uwaga: wiadomość ta nie zostanie wysłana wraz z płatnością w sieci Bitcoin.</translation>
</message>
@@ -1696,18 +1348,6 @@
<source>Remove</source>
<translation>Usuń</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopiuj etykietÄ™</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopiuj wiadomość</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiuj kwotÄ™</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1727,73 +1367,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Zapisz obraz...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Zażądaj płatności do %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informacje o płatności</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kwota</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etykieta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Wiadomość</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Wynikowy URI jest zbyt długi, spróbuj zmniejszyć tekst etykiety / wiadomości</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>BÅ‚Ä…d kodowania URI w Kodzie QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etykieta</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Wiadomość</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kwota</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(brak etykiety)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(brak wiadomości)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(brak kwoty)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1914,14 +1487,6 @@
<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>
<translation>Wyślij do wielu odbiorców na raz</translation>
</message>
@@ -1953,114 +1518,6 @@
<source>S&amp;end</source>
<translation>Wy&amp;syłka</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Potwierdź wysyłanie monet</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 do %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Skopiuj ilość</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiuj kwotÄ™</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Skopiuj opłatę</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Skopiuj ilość po opłacie</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Skopiuj ilość bajtów</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Skopiuj priorytet</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Skopiuj resztÄ™</translation>
- </message>
- <message>
- <source>or</source>
- <translation>lub</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Kwota przekracza twoje saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Suma przekracza twoje saldo, gdy doliczymy %1 prowizji transakcyjnej.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Utworzenie transakcji nie powiodło się!</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>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>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Opłata wyższa niż %1 jest uważana za szalenie wysoką.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Żądanie płatności upłynęło.</translation>
- </message>
- <message>
- <source>Pay only the required fee of %1</source>
- <translation>Zapłać tylko wymaganą opłatę %1</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>Przybliżony czas zatwierdzenia: %n bloków.</numerusform><numerusform>Przybliżony czas zatwierdzenia: %n bloków.</numerusform><numerusform>Przybliżony czas zatwierdzenia: %n bloków.</numerusform></translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>Adres odbiorcy jest nieprawidłowy, proszę sprawić ponownie.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation>Znaleziono powtórzony adres, można wysłać tylko raz na każdy adres podczas jednej operacji wysyłania.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Ostrzeżenie: nieprawidłowy adres Bitcoin</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(brak etykiety)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <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>
- <translation>Czy na pewno chcesz wysłać?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>dodano jako opłata transakcyjna</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2073,10 +1530,6 @@
<translation>Zapłać &amp;dla:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Wprowadź etykietę dla tego adresu by dodać go do książki adresowej</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etykieta:</translation>
</message>
@@ -2148,8 +1601,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core siÄ™ zamyka...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 siÄ™ zamyka...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2223,6 +1676,11 @@
<translation>&amp;Zweryfikuj wiadomość</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation>Wpisz adres, wiadomość oraz sygnaturę (podpis) odbiorcy (upewnij się, że dokładnie skopiujesz wszystkie zakończenia linii, spacje, tabulacje itp.). Uważaj by nie dodać więcej do podpisu niż do samej podpisywanej wiadomości by uniknąć ataku man-in-the-middle.
+Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadawca posiada klucz do adresu, natomiast nie potwierdza to, że poprawne wysłanie jakiejkolwiek transakcji! </translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation>Adres Bitcoin, którym została podpisana wiadomość</translation>
</message>
@@ -2238,70 +1696,10 @@
<source>Reset all verify message fields</source>
<translation>Resetuje wszystkie pola weryfikacji wiadomości</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Kliknij "Podpisz Wiadomość" żeby uzyskać podpis</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Podany adres jest nieprawidłowy.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Proszę sprawdzić adres i spróbować ponownie.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Wprowadzony adres nie odnosi siÄ™ do klucza.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Odblokowanie portfela zostało anulowane.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <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>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Wiadomość podpisana.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Podpis nie może zostać zdekodowany.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Sprawdź podpis i spróbuj ponownie.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Podpis nie odpowiada skrótowi wiadomości.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Weryfikacja wiadomości nie powiodła się.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Wiadomość zweryfikowana.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Rdzeń Bitcoin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Deweloperzy Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2314,418 +1712,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <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>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/niezatwierdzone</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 potwierdzeń</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, przekazywany przez %n węzłów</numerusform><numerusform>, przekazywany przez %n węzłów</numerusform><numerusform>, przekazywany przez %n węzłów</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Źródło</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Wygenerowano</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Od</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Do</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>własny adres</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>tylko-obserwowany</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etykieta</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Przypisy</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>potwierdzona przy %n blokach 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>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debet</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Razem wychodzÄ…cych</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Razem przychodzÄ…cych</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Opłata transakcyjna</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Kwota netto</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Wiadomość</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Komentarz</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID transakcji</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Kupiec</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>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>
- <translation>Informacje debugowania</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transakcja</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Wejścia</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Kwota</translation>
- </message>
- <message>
- <source>true</source>
- <translation>prawda</translation>
- </message>
- <message>
- <source>false</source>
- <translation>fałsz</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, nie został jeszcze pomyślnie rozesłany</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Otwórz dla %n następnych bloków</numerusform><numerusform>Otwórz dla %n następnych bloków</numerusform><numerusform>Otwórz dla %n następnych bloków</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>nieznany</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Szczegóły transakcji</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Ten panel pokazuje szczegółowy opis transakcji</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>Niedojrzała (%1 potwierdzeń, będzie dostępna po %2)</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Otwórz dla %n następnych bloków</numerusform><numerusform>Otwórz dla %n następnych bloków</numerusform><numerusform>Otwórz dla %n następnych bloków</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Otwórz do %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Zatwierdzony (%1 potwierdzeń)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ten blok nie został odebrany przez jakikolwiek inny węzeł i prawdopodobnie nie zostanie zaakceptowany!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Wygenerowano ale nie zaakceptowano</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etykieta</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Niepotwierdzone:</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Odebrano od</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Wysłano do</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Płatność do siebie</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Wydobyto</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>tylko-obserwowany</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(brak)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Status transakcji. Najedź na pole, aby zobaczyć liczbę potwierdzeń.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Data i czas odebrania transakcji.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Rodzaj transakcji.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Czy adres tylko-obserwowany jest lub nie użyty w tej transakcji.</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation>Zdefiniowana przez użytkownika intencja/cel transakcji.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Kwota usunięta z lub dodana do konta.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Wszystko</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Dzisiaj</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>W tym tygodniu</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>W tym miesiÄ…cu</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>W zeszłym miesiącu</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>W tym roku</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Zakres...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Otrzymane przez</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Wysłano do</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Do siebie</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Wydobyto</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Inne</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Wprowadź adres albo etykietę żeby wyszukać</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Min suma</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopiuj adres</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiuj etykietÄ™</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiuj kwotÄ™</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Skopiuj ID transakcji</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Zmień etykietę</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Pokaż szczegóły transakcji</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Eksport historii transakcji</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Tylko obserwowany</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Błąd przy próbie eksportu</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Wystąpił błąd przy próbie zapisu historii transakcji do %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Eksport powiódł się</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Historia transakcji została zapisana do %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>CSV (rozdzielany przecinkami)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Potwierdzony</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etykieta</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Zakres:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>do</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2733,55 +1726,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Nie załadowano żadnego portfela.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Wyślij monety</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Eksportuj</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Eksportuj dane z aktywnej karty do pliku</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Kopia Zapasowa Portfela</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Dane Portfela (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Nie udało się wykonać kopii zapasowej</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Wystąpił błąd przy próbie zapisu pliku portfela do %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Plik portfela został zapisany do %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Wykonano KopiÄ™ ZapasowÄ…</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2804,10 +1748,22 @@
<translation>Akceptuj linię poleceń oraz polecenia JSON-RPC</translation>
</message>
<message>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Jeżeli &lt;category&gt; nie zostanie określona lub &lt;category&gt; = 1, wyświetl wszystkie informacje debugowania.</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>Przycinanie skonfigurowano poniżej minimalnych %d MiB. Proszę użyć wyższej liczby.</translation>
+ </message>
+ <message>
<source>Error: A fatal internal error occurred, see debug.log for details</source>
<translation>Błąd: Wystąpił fatalny błąd wewnętrzny, sprawdź szczegóły w debug.log</translation>
</message>
<message>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Prowizja (w %s/kB) dodawana do wysyłanych transakcji (domyślnie: %s)</translation>
+ </message>
+ <message>
<source>Pruning blockstore...</source>
<translation>Przycinanie zapisu bloków...</translation>
</message>
@@ -2816,14 +1772,34 @@
<translation>Uruchom w tle jako daemon i przyjmuj polecenia</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Uruchomienie serwera HTTP nie powiodło się. Zobacz dziennik debugowania, aby uzyskać więcej szczegółów.</translation>
+ </message>
+ <message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Akceptuj połączenia z zewnątrz (domyślnie: 1 jeśli nie ustawiono -proxy lub -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Rdzeń Bitcoina</translation>
+ </message>
+ <message>
+ <source>The %s developers</source>
+ <translation>Deweloperzy %s</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee ma ustawioną bardzo dużą wartość! Jest to prowizja za transakcje, którą możesz zapłacić gdy oszacowanie opłaty jest niemożliwe.</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 i nasłuchuj na nim. Użyj formatu [host]:port dla IPv6</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>Nie można uzyskać blokady na katalogu z danymi %s. %s najprawdopodobniej jest już uruchomiony.</translation>
+ </message>
+ <message>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation>Usuwa wszystkie transakcje w portfelu i tylko odtwarza te części z łańcucha bloków poprzez -rescan przy starcie</translation>
</message>
@@ -2832,28 +1808,32 @@
<translation>Rozprowadzane na licencji MIT, zobacz dołączony plik COPYING lub &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>Błąd odczytu %s! Wszystkie klucze zostały odczytane poprawnie, ale może brakować danych transakcji lub wpisów w książce adresowej, lub mogą one być nieprawidłowe.</translation>
+ </message>
+ <message>
<source>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>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Wymuś przekazywanie transakcji od osób z białej listy, nawet jeśli narusza to lokalną politykę przekazywania (default: %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>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>Proszę sprawdzić czy data i czas na Twoim komputerze są poprawne! Jeżeli ustawienia zegara będą złe, %s nie będzie działał prawidłowo.</translation>
</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>
+ <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>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>UWAGA: nienaturalnie duża liczba wygenerowanych bloków, %d bloków otrzymano w ostatnich %d godzinach (%d oczekiwanych)</translation>
+ <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>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>UWAGA: sprawdź swoje połączenie sieciowe, %d bloków otrzymano w ostatnich %d godzinach (%d oczekiwanych)</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Użyj UPnP do mapowania portu nasłuchu (domyślnie: 1 gdy nasłuchuje i brak -proxy)</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
@@ -2864,18 +1844,30 @@
<translation>Uwaga: Wygląda na to, że nie ma pełnej zgodności z naszymi peerami! Możliwe, że potrzebujesz aktualizacji bądź inne węzły jej potrzebują</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>Ostrzeżenie: Odtworzono dane z uszkodzonego pliku wallet.dat! Oryginalny wallet.dat został zapisany jako wallet.{timestamp}.bak w %s; jeśli twoje saldo lub transakcje są niepoprawne powinieneś odtworzyć kopię zapasową.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Dodawaj do białej listy węzły łączące się z podanej maski sieciowej lub adresu IP. Może być określona kilka razy.</translation>
</message>
<message>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>Musisz przebudować bazę używając -reindex-chainstate aby zmienić -txindex</translation>
+ </message>
+ <message>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s uszkodzony, odtworzenie się nie powiodło</translation>
+ </message>
+ <message>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool musi być przynajmniej %d MB</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 on startup</source>
+ <translation>Próbuj odzyskać klucze prywatne z uszkodzonego portfela podczas uruchamiania.</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Opcje tworzenia bloku:</translation>
</message>
@@ -2888,6 +1880,10 @@
<translation>Opcje połączenia:</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Prawa autorskie (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>Wykryto uszkodzoną bazę bloków</translation>
</message>
@@ -2904,6 +1900,10 @@
<translation>Czy chcesz teraz przebudować bazę bloków?</translation>
</message>
<message>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Włącz wyświetlanie hasha bloku w &lt;address&gt;</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Błąd inicjowania bazy danych bloków</translation>
</message>
@@ -2912,6 +1912,18 @@
<translation>Błąd inicjowania środowiska bazy portfela %s!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>BÅ‚Ä…d Å‚adowania %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>BÅ‚Ä…d Å‚adowania %s: Uszkodzony portfel</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>BÅ‚Ä…d Å‚adowania %s: Portfel wymaga nowszej wersji %s</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>Błąd ładowania bazy bloków</translation>
</message>
@@ -2936,10 +1948,26 @@
<translation>Nieprawidłowy lub brak bloku genezy. Błędny folder_danych dla sieci?</translation>
</message>
<message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>Wstępna kontrola poprawności nie powiodła się. %s wyłącza się.</translation>
+ </message>
+ <message>
<source>Invalid -onion address: '%s'</source>
<translation>Nieprawidłowy adres -onion: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Nieprawidłowa kwota dla -%s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Nieprawidłowa kwota dla -fallbackfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Utrzymuj obszar pamięci dla transakcji poniżej &lt;n&gt; MB (default: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>Brak wystarczającej liczby deskryptorów plików. </translation>
</message>
@@ -2948,6 +1976,14 @@
<translation>ÅÄ…cz z wÄ™zÅ‚ami tylko w sieci &lt;net&gt; (ipv4, piv6 lub onion)</translation>
</message>
<message>
+ <source>Print this help message and exit</source>
+ <translation>Wyświetl ten tekst pomocy i wyjdź</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>Wyświetl wersję i wyjdź</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>Przycinanie nie może być skonfigurowane z negatywną wartością.</translation>
</message>
@@ -2956,6 +1992,14 @@
<translation>Tryb ograniczony jest niekompatybilny z -txindex.</translation>
</message>
<message>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>Odbuduj stan lańcucha i indeks bloków z obecnych na dysku plików blk*.dat</translation>
+ </message>
+ <message>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>Odbuduj stan łańcucha z aktualnie zindeksowanych bloków</translation>
+ </message>
+ <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Ustaw wielkość pamięci podręcznej w megabajtach (%d do %d, domyślnie: %d)</translation>
</message>
@@ -2968,10 +2012,30 @@
<translation>Określ plik portfela (w obrębie folderu danych)</translation>
</message>
<message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>Nie można przywiązać do %s na tym komputerze. %s prawdopodobnie jest już uruchomiony.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Niewspierany argument -benchmark zignorowany, użyj -debug=bench.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Niewspierany argument -debugnet zignorowany, użyj -debug=net.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Znaleziono nieprawidłowy argument -tor, użyj -onion.</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>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>Komentarz User Agent (%s) zawiera niebezpieczne znaki.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Weryfikacja bloków...</translation>
</message>
@@ -2984,16 +2048,16 @@
<translation>Portfel %s znajduje siÄ™ poza folderem danych %s</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>Opcje portfela:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Opcje debugowania/testowania portfela:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Uwaga: Ta wersja jest przestarzała, wymagana jest aktualizacja!</translation>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>Portfel wymaga przepisania: zrestartuj %s aby ukończyć</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Musisz przebudować bazę używając parametru -reindex aby zmienić -txindex</translation>
+ <source>Wallet options:</source>
+ <translation>Opcje portfela:</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>
@@ -3008,10 +2072,6 @@
<translation>Powiąż się z podanym adresem, aby nasłuchiwać połączenia JSON-RPC. Użyj notacji [host]:port dla IPv6. Ta opcja może być określona kilka razy (domyślnie: powiąż ze wszystkimi interfejsami)</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>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Twórz nowe pliki z domyślnymi dla systemu uprawnieniami, zamiast umask 077 (skuteczne tylko przy wyłączonej funkcjonalności portfela)</translation>
</message>
@@ -3048,10 +2108,6 @@
<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>The transaction amount is too small to send after the fee has been deducted</source>
<translation>Zbyt niska kwota transakcji do wysłania po odjęciu opłaty</translation>
</message>
@@ -3072,48 +2128,24 @@
<translation>Akceptuj publiczne żądania REST (domyślnie: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Aktywuje najlepszy łańcuch</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Nie można rozwiązać adresu -whitebind: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Stwórz automatycznie ukrytą usługę Tora (domyślnie: %d)</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>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>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Importuj bloki z zewnętrznego pliku blk000??.dat podczas uruchamiania programu</translation>
</message>
<message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nieprawidłowa kwota dla -mintxfee=&lt;amount&gt;: '%s'</translation>
+ <source>Information</source>
+ <translation>Informacja</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3128,6 +2160,10 @@
<translation>Przechowuj w pamięci maksymalnie &lt;n&gt; transakcji nie możliwych do połączenia (domyślnie: %u)</translation>
</message>
<message>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation>Musisz określić port z -whitebind: '%s'</translation>
+ </message>
+ <message>
<source>Node relay options:</source>
<translation>Opcje przekaźnikowe węzła:</translation>
</message>
@@ -3136,12 +2172,12 @@
<translation>Opcje serwera RPC:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>Odbuduj indeks łańcucha bloków z obecnych plików blk000??.dat podczas ponownego uruchomienia</translation>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Zmniejszanie -maxconnections z %d do %d z powodu ograniczeń systemu.</translation>
</message>
<message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Odbieranie i wyświetlanie alertów sieci P2P (domyślnie: %u)</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Przeskanuj podczas ładowania programu łańcuch bloków w poszukiwaniu zaginionych transakcji portfela</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
@@ -3172,6 +2208,10 @@
<translation>To oprogramowanie eksperymentalne.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Hasło zabezpieczające portu kontrolnego Tora (domyślnie: puste)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Zbyt niska kwota transakcji </translation>
</message>
@@ -3192,12 +2232,12 @@
<translation>Nie można przywiązać do %s na tym komputerze (bind zwrócił błąd %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Nazwa użytkownika dla połączeń JSON-RPC</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Zaktualizuj portfel do najnowszego formatu podczas Å‚adowania programu</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Portfel wymaga przepisania: zrestartuj Bitcoina aby ukończyć</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Nazwa użytkownika dla połączeń JSON-RPC</translation>
</message>
<message>
<source>Warning</source>
@@ -3208,8 +2248,8 @@
<translation>Usuwam wszystkie transakcje z portfela...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat uszkodzony, odtworzenie się nie powiodło</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>Opcje powiadomień ZeroMQ:</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3220,10 +2260,6 @@
<translation>Wykonaj polecenie kiedy najlepszy blok ulegnie zmianie (%s w komendzie zastanie zastÄ…pione przez hash bloku)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Ta wiadomość pomocy</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Zezwól -addnode, -seednode i -connect na łączenie się z serwerem DNS</translation>
</message>
@@ -3232,14 +2268,26 @@
<translation>Wczytywanie adresów...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee ma ustawioną badzo dużą wartość! Tak wysokie opłaty mogą być zapłacone w jednej transakcji.</translation>
+ </message>
+ <message>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee ma ustawioną bardzo dużą wartość! Jest to prowizja za transakcje, którą płacisz, gdy wysyłasz monety.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Nie trzymaj w pamięci transakcji starszych niż &lt;n&gt; godz. (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Opłaty (w %s/Kb) mniejsze niż ta będą traktowane jako bez opłaty przy tworzeniu transakcji (domyślnie: %s)</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>
@@ -3256,10 +2304,34 @@
<translation>Wypuść informacje debugowania (domyślnie: %u, podanie &lt;category&gt; jest opcjonalne)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Wspieraj filtrowanie bloków i transakcji używając Filtrów Blooma (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>Całkowita długość łańcucha wersji (%i) przekracza maksymalną dopuszczalną długość (%i). Zmniejsz ilość lub rozmiar parametru uacomment.</translation>
+ </message>
+ <message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Próbuje utrzymać ruch wychodzący poniżej zadanego (w MiB na 24h), 0 = bez limitu (domyślnie: %d)</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Znaleziono niewspierany argument -socks. Wybieranie wersji SOCKS nie jest już możliwe, wsparcie programu obejmuje tylko proxy SOCKS5</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Niewspierany argument -whitelistalwaysrelay zignorowany, użyj -whitelistrelay i/lub -whitelistforcerelay.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Użyj oddzielnego prozy SOCKS5 aby osiągnąć węzły w ukrytych usługach Tor (domyślnie: %s)</translation>
</message>
<message>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Ostrzeżenie: Odtworzono dane z uszkodzonego pliku portfela! Oryginalny %s został zapisany jako %s w %s; jeśli twoje saldo lub transakcje są niepoprawne powinieneś odtworzyć kopię zapasową.</translation>
+ </message>
+ <message>
<source>(default: %s)</source>
<translation>(domyślnie: %s)</translation>
</message>
@@ -3268,14 +2340,6 @@
<translation>Zawsze wypytuj o adresy węzłów poprzez podejrzenie DNS (domyślnie: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>BÅ‚Ä…d Å‚adowania wallet.dat</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>
@@ -3360,18 +2424,6 @@
<translation>Nieznana sieć w -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Nie można uzyskać adresu -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Nie można uzyskać adresu -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Nieprawidłowa kwota dla -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Niewystarczające środki</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt_BR.ts b/src/qt/locale/bitcoin_pt_BR.ts
index bb6de064d4..ee48c67341 100644
--- a/src/qt/locale/bitcoin_pt_BR.ts
+++ b/src/qt/locale/bitcoin_pt_BR.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<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>
+ <translation>Clique com o botão direito para editar o endereço ou rótulo</translation>
</message>
<message>
<source>Create a new address</source>
@@ -26,10 +26,6 @@
<translation>&amp;Fechar</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiar Endereço</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Excluir os endereços selecionados da lista</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Excluir</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Escolha o endereço para enviar moedas</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Escolha o endereço para receber moedas</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>Escol&amp;ha</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Endereços para envios</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <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>
- <translation>Esses são seus endereços Bitcoin para enviar pagamentos. Confira sempre a quantia e o destinatário antes de enviar moedas.</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>Estes são os seus endereços Bitcoin para receber pagamentos. Recomenda-se a utilização de um novo endereço de recebimento para cada transação.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copiar &amp;Rótulo</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editar</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportar lista de endereços</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Arquivo separado por vírgulas (*. csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportação Falhou</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Ocorreu um erro ao tentar salvar a lista de endereço em %1.. Por favor tente novamente.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Rótulo</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Endereço</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Sem rótulo)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Repita a nova frase de segurança</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Criptografar carteira</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Esta operação precisa de sua frase de segurança para desbloquear a carteira.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquear carteira</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Esta operação precisa de sua frase de segurança para descriptografar a carteira.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Descriptografar carteira</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Alterar frase de segurança</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 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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Atenção: A tecla Caps Lock está ligada!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Carteira criptografada</translation>
- </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 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>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>
- <translation>A criptografia da carteira falhou</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>A criptografia da carteira falhou devido a um erro interno. Sua carteira não estava criptografada.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>A frase de segurança fornecida não confere.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>O desbloqueio da carteira falhou</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>A frase de segurança digitada para a descriptografia da carteira estava incorreta.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>A descriptografia da carteira falhou</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>A frase de segurança da carteira foi alterada com êxito.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -270,6 +111,14 @@
<translation>Sair da aplicação</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;About %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Mostrar informações sobre %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Sobre &amp;Qt</translation>
</message>
@@ -282,6 +131,10 @@
<translation>&amp;Opções...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Modificar opções de configuração para o %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>&amp;Criptografar Carteira...</translation>
</message>
@@ -306,14 +159,6 @@
<translation>Abrir &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Cliente Bitcoin</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importando blocos do disco...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Reindexando blocos no disco...</translation>
</message>
@@ -358,10 +203,6 @@
<translation>&amp;Receber</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Mostrar informações sobre Bitcoin</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Exibir/Ocultar</translation>
</message>
@@ -387,7 +228,7 @@
</message>
<message>
<source>&amp;Settings</source>
- <translation>&amp;definições</translation>
+ <translation>&amp;Definições</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -398,22 +239,10 @@
<translation>Barra de ferramentas</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Solicitações de pagamentos (gera códigos QR e bitcoin: URIs)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
<translation>Mostrar a lista de endereços de envio e rótulos usados</translation>
</message>
@@ -429,19 +258,27 @@
<source>&amp;Command-line options</source>
<translation>Opções de linha de &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 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>
<translation><numerusform>%n conexão ativa na rede Bitcoin</numerusform><numerusform>%n conexões ativas na rede Bitcoin</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Indexando blocos no disco...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Processando blocos no disco...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Nenhum servidor disponível...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>%n bloco processado do histórico de transações.</numerusform><numerusform>%n blocos processados do histórico de transações.</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n hora</numerusform><numerusform>%n horas</numerusform></translation>
</message>
@@ -490,6 +327,14 @@
<translation>Atualizado</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Mostrar a mensagem de ajuda do %1 para obter uma lista com possíveis opções de linha de comando Bitcoin</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>cliente %1</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Recuperando o atraso ...</translation>
</message>
@@ -541,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta da Rede</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -625,150 +463,6 @@
<source>Priority</source>
<translation>Prioridade</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar endereço</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar rótulo</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar quantia</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID da transação</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Travar não gasto</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Destravar não gasto</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar quantidade</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar taxa</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia pós-taxa</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia prioridade</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copiar poeira</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia alteração</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>mais alta possível</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>muito alta</translation>
- </message>
- <message>
- <source>high</source>
- <translation>alta</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>média-alta</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>média</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>média-baixa</translation>
- </message>
- <message>
- <source>low</source>
- <translation>baixa</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>muito baixa</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>a mais baixa possível</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 travado)</translation>
- </message>
- <message>
- <source>none</source>
- <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>
- <message>
- <source>yes</source>
- <translation>sim</translation>
- </message>
- <message>
- <source>no</source>
- <translation>não</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Pode variar +/- 1 byte por entrada.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transações de alta prioridade são mais propensas a serem incluídas em um bloco.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Sem rótulo)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>troco de %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(troco)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -792,38 +486,6 @@
<source>&amp;Address</source>
<translation>&amp;Endereço</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Novo endereço de recebimento</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Novo endereço de envio</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editar endereço de recebimento</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editar endereço de envio</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>O endereço digitado "%1" já se encontra no catálogo de endereços.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>O endereço digitado "%1" não é um endereço Bitcoin válido.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Não foi possível desbloquear a carteira.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>A geração de nova chave falhou.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -851,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>versão</translation>
</message>
@@ -863,8 +521,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Sobre o Bitcoin</translation>
+ <source>About %1</source>
+ <translation>Sobre %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -878,6 +536,34 @@
<source>command-line options</source>
<translation>opções da linha de comando</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>Opções de Interface:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Escolher diretório de dados na inicialização (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Definir idioma, por exemplo "de_DE" (padrão: idioma do sistema)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Iniciar minimizado</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Definir certificados de root SSL para requisições de pagamento (padrão: -sistema-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Exibir tela de abertura na inicialização (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Resetar todas as configuraçãoes do GUI</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -886,16 +572,16 @@
<translation>Bem-vindo</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Bem vindo ao Bitcoin.</translation>
+ <source>Welcome to %1.</source>
+ <translation>Bem vindo ao %1</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 vai guardar os dados.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Como essa é a primeira vez que o programa é executado, você pode escolher onde %1 armazenará seus 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>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>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>O %1 irá baixar e armazenar uma cópia do block chain do Bitcoin. Pelo menos %2GB de dados serão armazenados neste diretório, e ele crescerá ao longo do tempo. A carteira também será armazenada neste diretório.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -906,10 +592,6 @@
<translation>Use um diretório de dados personalizado:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Erro: Diretório de dados "%1" não pode ser criado.</translation>
</message>
@@ -944,10 +626,6 @@
<source>Select payment request file</source>
<translation>Selecione o arquivo de cobrança</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Selecione o arquivo de cobrança para ser aberto</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -960,6 +638,14 @@
<translation>Principal</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Executar o %1 automaticamente ao iniciar o sistema.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>$Iniciar %1 ao fazer login no sistema</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>Tamanho do banco de &amp;dados do cache</translation>
</message>
@@ -988,10 +674,6 @@
<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>
@@ -1001,7 +683,7 @@
</message>
<message>
<source>Active command-line options that override above options:</source>
- <translation>Ativa as opções de linha de comando que sobrescreve as opções acima:</translation>
+ <translation>Opções de linha de comando ativas que sobrescreve as opções acima:</translation>
</message>
<message>
<source>Reset all client options to default.</source>
@@ -1016,14 +698,6 @@
<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>
@@ -1080,6 +754,10 @@
<translation>Usado para alcançar participantes via:</translation>
</message>
<message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Exibe, caso o proxy padrão SOCKS5 fornecido seja usado para se conectar a peers através deste tipo de rede.</translation>
+ </message>
+ <message>
<source>IPv4</source>
<translation>IPv4</translation>
</message>
@@ -1104,6 +782,14 @@
<translation>&amp;Janela</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Ocultar o ícone da bandeja do sistema.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Ocultar ícone de bandeja</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Mostrar apenas um ícone na bandeja ao minimizar a janela.</translation>
</message>
@@ -1124,6 +810,10 @@
<translation>&amp;Linguagem da interface:</translation>
</message>
<message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation>O idioma de interface do usuário pode ser definido aqui. Essa configuração terá efeito após reiniciar o %1</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unidade usada para mostrar quantidades:</translation>
</message>
@@ -1149,7 +839,7 @@
</message>
<message>
<source>none</source>
- <translation>nenhum</translation>
+ <translation>Nenhum</translation>
</message>
<message>
<source>Confirm options reset</source>
@@ -1248,97 +938,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Manipulação de URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Endereço de pagamento inválido %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Solicitação de pagamento rejeitada</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Rede de pedido de pagamento não corresponde rede do cliente.</translation>
- </message>
- <message>
- <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>
- <translation>Valor do pagamento solicitado de %1 é muito pequeno (Considerado poeira).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Erro no pedido de pagamento</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Não foi possível iniciar bitcoin: manipulador clique-para-pagar</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>URL de cobrança é inválida: %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 pode ser analisado ! Isto pode ser causado por um endereço Bitcoin inválido ou parâmetros URI informados incorretamente.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Manipulação de arquivo de cobrança</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Arquivo de pedido de pagamento não pode ser lido ! Isto pode ser causado por uma requisição de pagamento inválida.</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>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>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pagamento reconhecido</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Erro de solicitação de rede</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1393,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Salvar imagem</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copiar Imagem</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Salvar código QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG Imagem (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nome do cliente</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
@@ -1438,14 +1014,14 @@
<translation>Geral</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Versão do OpenSSL</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Versão do BerkeleyDB</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Datadir</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Horário de inicialização</translation>
</message>
@@ -1470,8 +1046,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>Pool de Memória</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Número atual de transações</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Uso de memória</translation>
</message>
<message>
<source>Received</source>
@@ -1522,6 +1106,18 @@
<translation>User Agent</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Abrir o arquivo de log de depuração do %1 localizado no diretório atual de dados. Isso pode levar alguns segundos para arquivos de log grandes.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Diminuir o tamanho da fonte</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Aumentar o tamanho da fonte</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Serviços</translation>
</message>
@@ -1590,10 +1186,6 @@
<translation>Saída:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Data do 'build'</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Arquivo de log de Depuração</translation>
</message>
@@ -1630,8 +1222,8 @@
<translation>&amp;Desbanir nó</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Bem vindo ao console de RPC do Bitcoin.</translation>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Bem-vindo ao console RPC do %1</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>
@@ -1760,18 +1352,6 @@
<source>Remove</source>
<translation>Remover</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copiar rótulo</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copiar mensagem</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar quantia</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1791,73 +1371,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Salvar Imagem...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Requisitar pagamento para %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informação de pagamento</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Endereço</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Quantidade</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Rótulo</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensagem</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI resultante muito longa. Tente reduzir o texto do rótulo ou da mensagem.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Erro ao codigicar o URI em código QR</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Rótulo</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensagem</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Quantidade</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Sem rótulo)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(sem mensagem)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(sem quantia especificada)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1927,7 +1440,7 @@
</message>
<message>
<source>collapse fee-settings</source>
- <translation>colapso Taxa de definições</translation>
+ <translation>Ocultar painel</translation>
</message>
<message>
<source>per kilobyte</source>
@@ -1978,14 +1491,6 @@
<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>
@@ -2017,118 +1522,6 @@
<source>S&amp;end</source>
<translation>Enviar</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirmar envio de moedas</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 para %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar quantidade</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar quantia</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar taxa</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copia pós-taxa</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copia prioridade</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copia alteração</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>Quantia Total %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ou</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>A quantidade excede seu saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>O total excede seu saldo quando uma taxa de transação de %1 é incluída.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>A criação de transação falhou!</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>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>
- <source>Pay only the required fee of %1</source>
- <translation>Pagar somente a taxa requerida de %1</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>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>
- <message>
- <source>(no label)</source>
- <translation>(Sem rótulo)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Atenção: endereço de troco desconhecido</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copiar poeira</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Tem certeza que quer enviar?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>Adicionado como taxa de transação</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2141,10 +1534,6 @@
<translation>Pagar &amp;Para:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Digite um rótulo para este endereço para adicioná-lo ao catálogo de endereços</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Rótulo:</translation>
</message>
@@ -2216,10 +1605,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin está sendo encerrado...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Não desligue o computador até que esta janela desapareça.</translation>
</message>
@@ -2292,7 +1677,7 @@
</message>
<message>
<source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
- <translation>Coloque o endereço do destinatário, a mensagem (certifique-se de copiar toda a mensagem, incluindo quebras de linha, espaços, tabulações, etc.) e a assinatura embaixo para verificar a mensagem. Cuidado para não ler mais da assinatura do que está assinado na mensagem, para evitar ser enganado pelo ataque man-in-the-middle. Note que isso somente prova a propriedade de um endereço, e não o remetende de qualquer transação.</translation>
+ <translation>Coloque o endereço do autor, a mensagem (certifique-se de copiar toda a mensagem, incluindo quebras de linha, espaços, tabulações, etc.) e a assinatura embaixo para verificar a mensagem. Cuidado para não ler mais da assinatura do que está assinado na mensagem, para evitar ser enganado pelo ataque man-in-the-middle. Note que isso somente prova a propriedade de um endereço, e não o remetende de qualquer transação.</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2310,70 +1695,10 @@
<source>Reset all verify message fields</source>
<translation>Limpar todos os campos de assinatura da mensagem</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Clique em "Assinar mensagem" para gerar a assinatura</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>O endereço fornecido é inválido.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Por favor, verifique o endereço e tente novamente.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>O endereço fornecido não se refere a uma chave.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Desbloqueamento da Carteira foi cancelado.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>A chave privada para o endereço fornecido não está disponível.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Assinatura da mensagem falhou.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mensagem assinada.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>A assinatura não pode ser decodificada.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Por favor, verifique a assinatura e tente novamente.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>A assinatura não corresponde ao "resumo da mensagem".</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Verificação da mensagem falhou.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mensagem verificada.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Programadores do Bitcoin</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2386,422 +1711,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Aberto até %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>em conflito</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/não confirmadas</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmações</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, difundir atráves de %n nó</numerusform><numerusform>, difundir atráves de %n nós</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Fonte</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Gerados</translation>
- </message>
- <message>
- <source>From</source>
- <translation>De</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Para</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>seu próprio endereço</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>monitorado</translation>
- </message>
- <message>
- <source>label</source>
- <translation>rótulo</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Crédito</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>matura em mais %n bloco</numerusform><numerusform>matura em mais %n blocos</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>não aceito</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Débito</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Débito total</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Credito total</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Taxa de transação</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Valor líquido</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensagem</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentário</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID da transação</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Mercador</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 à 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>
- <translation>Informação de depuração</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transação</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Entradas</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Quantidade</translation>
- </message>
- <message>
- <source>true</source>
- <translation>verdadeiro</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falso</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ainda não foi propagada na rede com sucesso.</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Abrir para mais %n bloco</numerusform><numerusform>Abrir para mais %n blocos</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>desconhecido</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalhes da transação</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Este painel mostra uma descrição detalhada da transação</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Abrir para mais %n bloco</numerusform><numerusform>Abrir para mais %n blocos</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Aberto até %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmado (%1 confirmações)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Este bloco não foi recebido por nenhum outro participante da rede e provavelmente não será aceito!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Gerado mas não aceito</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Rótulo</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Não confirmado</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Confirmando (%1 de %2 confirmações recomendadas)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Conflitou</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Recebido</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Recebido</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pagamento para você mesmo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minerado</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>monitorado</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Status da transação. Passe o mouse sobre este campo para mostrar o número de confirmações.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Data e hora em que a transação foi recebida.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipo de transação.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Mostrar ou não endereços Bitcoin na lista de transações.</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation>Intenção/Propósito definido pelo usuário para a transação</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Quantidade debitada ou creditada ao saldo.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Todos</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Hoje</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Esta semana</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Este mês</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Mês passado</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Este ano</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Intervalo...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Recebido</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Enviado</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Para você mesmo</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minerado</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Outro</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Procure um endereço ou rótulo</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Quantidade mínima</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copiar endereço</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar rótulo</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar quantia</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID da transação</translation>
- </message>
- <message>
- <source>Copy raw transaction</source>
- <translation>Copia os dados brutos da transação</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Editar rótulo</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Mostrar detalhes da transação</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Exportar Histórico de Transação</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Monitorado</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exportação Falhou</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Ocorreu um erro ao tentar salvar o histórico de transação em %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exportação feita com sucesso</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>O histórico de transação foi gravado com sucesso em %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Arquivo separado por vírgulas (*. csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmado</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tipo</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Rótulo</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Endereço</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Intervalo: </translation>
- </message>
- <message>
- <source>to</source>
- <translation>para</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2809,55 +1725,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Nenhuma carteira foi carregada.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Send Coins</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportar</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportar os dados na aba atual para um arquivo</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Fazer cópia de segurança da Carteira</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Dados da Carteira (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Cópia de segurança Falhou</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Ocorreu um erro ao tentar salvar os dados da carteira em %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Os dados da carteira foram salvos com sucesso em %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Backup feito com sucesso</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2884,14 +1751,18 @@
<translation>Se &lt;category&gt; não for suprida ou se &lt;category&gt; = 1, mostrar toda informação de depuração.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
- <translation>Por favor verifique se a data e horário estão corretos no seu computador! Se o seu relógio estiver incorreto, a Carteira Bitcoin não irá funcionar corretamente.</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>Corte configurado abaixo do nível mínimo de %d de MiB. Por favor use um número mais alto.</translation>
</message>
<message>
<source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
<translation>Corte: a ultima sincronização da carteira foi além do dado comprimido. Você precisa reindexar ( -reindex , faça o download de toda a blockchain novamente)</translation>
</message>
<message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>Reduza os requerimentos de armazenamento de dados (cortando) deletando blocos mais antigos. Esse modo é incompatível com -txindex e -rescan. Cuidado: Reverter essa configuração requer um novo download de toda a blockchain. (Padrão: 0 = desabilita o corte de blocos, &gt;%u = tamanho alvo em MiB para o uso de blocos cortados)</translation>
+ </message>
+ <message>
<source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
<translation>Rescans não são possíveis no modo de corte. Você precisa usar -reindex, que irá fazer o download de toda a blockchain novamente.</translation>
</message>
@@ -2920,10 +1791,30 @@
<translation>Aceitar conexões externas (padrão: 1 se opções -proxy ou -connect não estiverem presentes)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee está muito alta! Essa é a taxa de transação que você vai pagar quando a taxa estimada não estiver disponível.</translation>
+ </message>
+ <message>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>A variação da taxa (em %s/kB) que será usada quando não houver dados suficientes para se estimar a taxa (default: %s)</translation>
+ </message>
+ <message>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Aceita transações retransmitidas advindas de pares em lista branca, mesmo quando não estiver retransmitindo transações (padrão: %d)</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>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>Não foi possível obter exclusividade de escrita no endereço %s. O %s provavelmente já está sendo executado.</translation>
+ </message>
+ <message>
<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>
@@ -2932,10 +1823,38 @@
<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 loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>Erro ao carregar %s. Não é permitido habilitar HD em carteiras não-HD pre existentes.</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>Erro ao ler arquivo %s! Todas as chaves foram lidas corretamente, mas os dados de transação ou o livro de endereos podem estar faltando ou incorretos.</translation>
+ </message>
+ <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Executa um comando quando uma transação da carteira mudar (%s no comando será substituído por TxID)</translation>
</message>
<message>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Força a retransmissão de transações de pares da lista branca, mesmo quando violam a política local de retransmissão (default: %d)</translation>
+ </message>
+ <message>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>A mediana máxima permitida de peer time compensa o ajuste. Perspectiva local de horário pode ser influenciada por pares à frente ou atrás neste montante. (padrão: %u segundos)</translation>
+ </message>
+ <message>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Preço máximo total (in %s) aplicado a uma única transação de carteira ou transação crua; aplicar isto tão baixo pode abortar grandes transações (padrão: %s)</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>Por favor verifique que a data e o horário de seu computador estão corretos. Se o relógio de seu computador estiver incorreto, %s não funcionarão corretamente.</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>Por favor contribua se você entender que %s é útil. Visite %s para mais informações sobre o software.</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>Define o número de threads de verificação de script (%u a %d, 0 = automático, &lt;0 = número de cores deixados livres, padrão: %d)</translation>
</message>
@@ -2948,22 +1867,10 @@
<translation>Este pode ser um build de teste pré-lançamento - use por sua conta e risco - não use para mineração ou aplicações de comércio.</translation>
</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. Provavelmente o Bitcoin já está sendo executado.</translation>
- </message>
- <message>
<source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>Use UPnP para mapear a porta escutada (padrão: 1 quando escutando e sem -proxy)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>AVISO: números estranhamente altos de blocos gerados, %d blocos recebidos nas últimas %d horas (%d esperados)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>ATENÇÃO: verifique sua conexão %d blocos recebidos nas últimas %d horas (%d tempo estimado)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Atenção: A rede não parecem concordar plenamente! Alguns mineiros parecem estar enfrentando problemas.</translation>
</message>
@@ -2972,10 +1879,6 @@
<translation>Atenção: Nós não parecemos concordar plenamente com nossos colegas! Você pode precisar atualizar ou outros nós podem precisar atualizar.</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>Atenção: wallet.dat corrompido, dados recuperados! Arquivo wallet.dat original salvo como wallet.{timestamp}.bak em %s; se seu saldo ou transações estiverem incorretos, você deve restaurar o backup.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Lista Branca pares de ligação da máscara de rede dado ou o endereço IP . Pode ser especificado várias vezes.</translation>
</message>
@@ -2988,6 +1891,14 @@
<translation>&lt;category&gt; pode ser:</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>Adiciona comentário ao user-agent do navegador</translation>
+ </message>
+ <message>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Tentando recuperar a chape privada da carteira corrompida ao inicializar</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Opções de criação de blocos:</translation>
</message>
@@ -3032,6 +1943,10 @@
<translation>Abilitar a publicação dos dados brutos da transação em &lt;endereço&gt;</translation>
</message>
<message>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>Habilita substituição de transação em memória (padrão: %u)</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Erro ao inicializar banco de dados de blocos</translation>
</message>
@@ -3068,10 +1983,22 @@
<translation>Endereço -onion inválido: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Valor inválido para -fallbackfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
<translation>Mantenha a mempool de transações abaixo de &lt;n&gt; megabytes (padrão: %u)</translation>
</message>
<message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Localização do cookie de autenticação (padrão: diretório de dados)</translation>
+ </message>
+ <message>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Número mínimo de bytes por sigop em transações que transmitimos e mineramos (default: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>Decriptadores de arquivos disponíveis insuficientes.</translation>
</message>
@@ -3080,6 +2007,10 @@
<translation>Somente conectar a clientes na rede &lt;net&gt; (ipv4, ipv6 ou onion)</translation>
</message>
<message>
+ <source>Print version and exit</source>
+ <translation>Mostra a versão e sai</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>O modo Prune não pode ser configurado com um valor negativo.</translation>
</message>
@@ -3136,14 +2067,6 @@
<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 -reindex</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>
@@ -3156,10 +2079,6 @@
<translation>Conecte ao endereço dado para receber conecções JSON-RPC. Use a notação [destino]:porta para IPv6. Essa opção pode ser especificada várias vezes (padrão: conecte a todas as interfaces)</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 acesso exclusivo ao diretório de dados %s. Provavelmente Bitcoin já está sendo executado.</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Criar novos arquivos com permissões padrão do sistema, em vez de umask 077 (apenas efetivo com funcionalidade de carteira desabilitada)</translation>
</message>
@@ -3176,10 +2095,30 @@
<translation>Executa um comando quando um alerta relevante é recebido ou vemos uma longa segregação (%s em cmd é substituído pela mensagem)</translation>
</message>
<message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Comissões (em %s/kB) menores serão consideradas como zero para relaying, mineração e criação de transação (padrão %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>Se paytxfee não estiver definida, incluir comissão suficiente para que as transações comecem a ter confirmações em média dentro de N blocos (padrão %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>Valor inválido para -maxtxfee = &lt;valor&gt;: '%s'( precisa ser pelo menos a comissão mínima de %s para prevenir travamento de transações)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Tamanho máximo de dados em transações de dados de operadora (padrão %u)</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Buscar por endereços de peers via busca DNS, se estiver baixo em endereços (padrão: 1 a não ser que -connect)</translation>
</message>
<message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Gerar credenciais aleatórias para cada conexão por proxy. Isto habilita o isolamento de stream do Tor (padrão: %u)</translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Define o tamanho máximo de alta-prioridade por taxa baixa nas transações em bytes (padrão: %d)</translation>
</message>
@@ -3189,7 +2128,11 @@
</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>Esse produto inclui software desenvolvido pelo Open SSL Project para uso na OpenSSL Toolkit&lt;https://www.openssl.org/&gt; e software criptográfico escrito por Eric Young e software UPnP escrito por Thomas Bernard. </translation>
+ <translation>Esse produto inclui software desenvolvido pelo Open SSL Project para uso na OpenSSL Toolkit &lt;https://www.openssl.org&gt; e software criptográfico escrito por Eric Young e software UPnP escrito por Thomas Bernard. </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>Peers permitidos não podem ser banidos do DoS e suas transações sempre são transmitidas, até mesmo se eles já estão no pool de memória, útil, por exemplo, para um 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>
@@ -3200,44 +2143,28 @@
<translation>(padrão: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Ativando a melhor sequência...</translation>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Aceitar pedidos restantes públicas (padrão: %u)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Impossível resolver endereço -whitebind: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Criar automaticamente serviços ocultos do Tor (padrão: %d)</translation>
</message>
<message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connecte-se através de um proxy SOCKS5</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Desenvolvedores Bitcoin Core</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>Information</source>
- <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>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Importar blocos a partir de arquivo externo blk000??.dat durante a inicialização</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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Valor inválido para -mintxfee=&lt;amount&gt;: '%s'</translation>
+ <source>Information</source>
+ <translation>Informação</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3248,6 +2175,10 @@
<translation>Máscara de rede especificada em -whitelist: '%s' é inválida</translation>
</message>
<message>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>Manter ao máximo &lt;n&gt; transações inconectáveis na 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>
@@ -3260,8 +2191,12 @@
<translation>Opções do servidor RPC:</translation>
</message>
<message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Receba e mostre P2P alerta de rede (default: %u)</translation>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Reduzindo -maxconnections de %d para %d, devido a limitações do sistema</translation>
+ </message>
+ <message>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Re-escanear a block-chain por transações faltantes na carteira durante a inicialização</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
@@ -3292,6 +2227,14 @@
<translation>Este é um software experimental.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Senha da porta de controle do Tor (padrão: vazio)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Porta de controle a ser usada se o monitoramento onion estiver habilitado (padrão: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Quantidade da transação muito pequena.</translation>
</message>
@@ -3312,24 +2255,32 @@
<translation>Impossível se ligar a %s neste computador (bind retornou erro %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Nome de usuário para conexões JSON-RPC</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Atualizar a carteira para o último formato na inicialização</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Sua carteira precisou ser reescrita: favor reiniciar o Bitcoin para completar</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Nome de usuário para conexões JSON-RPC</translation>
</message>
<message>
<source>Warning</source>
<translation>Atenção</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Aviso: Novas regras estranhas foram ativadas (versionbit %i)</translation>
+ </message>
+ <message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Quando operar em modo de blocos somente (padrãp: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Aniquilando todas as transações da carteira...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrompido, recuperação falhou</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>Opções de notificação ZeroMQ:</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3340,10 +2291,6 @@
<translation>Executa um comando quando o melhor bloco mudar (%s no comando será substituído pelo hash do bloco)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Exibe esta mensagem de ajuda</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permitir consultas DNS para -addnode, -seednode e -connect</translation>
</message>
@@ -3352,24 +2299,80 @@
<translation>Carregando endereços...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Erro ao carregar wallet.dat: Carteira corrompida</translation>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = manter metadados tx e.g. informação do dono da conta e requisição de pagamente, 2 = descartar metadados tx)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(padrão: %s)</translation>
+ <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee é muito alto! Essa quantia poderia ser paga em uma única transação.</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Sempre pergunte pelo endereço de peer via pesquisa DNS (padrão: %u)</translation>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee é muito alto! Este é o valor da taxa de transação que você irá pagar se enviar a transação.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Não manter transações na mempool por mais que &lt;n&gt; horas (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Comissões (em %s/kB) menores serão consideradas como zero para criação de transação (padrão %s)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Quão completa a verificação de blocos do -checkblocks é (0-4, padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>Mantém um índice completo de transações, usado pela chamada rpc getrawtransaction (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>Número de segundos para impedir que peers mal comportados reconectem (padrão %u)</translation>
+ </message>
+ <message>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>Informação de saída de debug (padrão: %u, definir &lt;category&gt; é opcional)</translation>
+ </message>
+ <message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Suportar filtragem de blocos e transações com filtros bloom (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>O tamanho total da string de versão da rede (%i) excede o tamanho máximo (%i). Reduza o numero ou tamanho de uacomments.</translation>
+ </message>
+ <message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Tenta manter tráfego fora dos limites dentro do alvo especificado (em MiB por 24h), 0 = sem limite (padrão: %d)</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Argumento inválido -socks encontrado. Definir a versão do SOCKS não é mais possível, somente proxys SOCK5 são suportados.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Argumento não suportado -whitelistalwaysrelay foi ignorado, utilize -whitelistrelay e/ou -whitelistforcerelay.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Use um proxy SOCKS5 separado para alcançar participantes da rede via serviços ocultos Tor (padrão: %s)</translation>
+ </message>
+ <message>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Nome de usuário e senha hash para conexões JSON-RPC. O campo &lt;userpw&gt; vem com o formato: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Um script python canônico é incluído em share/rpcuser. Essa opção pode ser especificada múltiplas vezes.</translation>
+ </message>
+ <message>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Aviso: Versões de bloco desconhecidas sendo mineradas! É possível que regras estranhas estejam ativas</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Erro ao carregar wallet.dat</translation>
+ <source>(default: %s)</source>
+ <translation>(padrão: %s)</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Gerar moedas (padrão: %u)</translation>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Sempre pergunte pelo endereço de peer via pesquisa DNS (padrão: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3400,12 +2403,28 @@
<translation>Fazer a carteira transmitir transações</translation>
</message>
<message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Buffer máximo de recebimento por conexão, &lt;n&gt;*1000 bytes (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Buffer máximo de envio por conexão, &lt;n&gt;*1000 bytes (padrão: %u)</translation>
+ </message>
+ <message>
<source>Prepend debug output with timestamp (default: %u)</source>
- <translation>Adiciona timestamp como prefixo no debug (default: %u)</translation>
+ <translation>Adiciona timestamp como prefixo no debug (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Transações de dados de operadora (padrão: %u)</translation>
</message>
<message>
<source>Relay non-P2SH multisig (default: %u)</source>
- <translation>Retransmitir P2SH não multisig (default: %u)</translation>
+ <translation>Retransmitir P2SH não multisig (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>Defina o tamanho da chave para piscina&lt;n&gt; (padrão: %u)</translation>
</message>
<message>
<source>Set minimum block size in bytes (default: %u)</source>
@@ -3425,27 +2444,19 @@
</message>
<message>
<source>Specify pid file (default: %s)</source>
- <translation>Especificar aqrquivo pid (default: %s)</translation>
+ <translation>Especificar aqrquivo pid (padrão: %s)</translation>
</message>
<message>
<source>Spend unconfirmed change when sending transactions (default: %u)</source>
<translation>Gastar troco não confirmado quando enviar transações (padrão: %u)</translation>
</message>
<message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation>Rede desconhecida especificada em -onlynet: '%s'</translation>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>Limite para desconectar peers mal comportados (padrão: %u)</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Impossível encontrar o endereço -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Impossível encontrar endereço -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Quantidade inválida para -paytxfee=&lt;quantidade&gt;: '%s'</translation>
+ <source>Unknown network specified in -onlynet: '%s'</source>
+ <translation>Rede desconhecida especificada em -onlynet: '%s'</translation>
</message>
<message>
<source>Insufficient funds</source>
diff --git a/src/qt/locale/bitcoin_pt_PT.ts b/src/qt/locale/bitcoin_pt_PT.ts
index b5ede206dd..eed262e010 100644
--- a/src/qt/locale/bitcoin_pt_PT.ts
+++ b/src/qt/locale/bitcoin_pt_PT.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation>Clique á direita para editar endereço ou rótulo</translation>
+ <translation>Clique com o botão direito para editar o endereço ou rótulo</translation>
</message>
<message>
<source>Create a new address</source>
@@ -26,16 +26,12 @@
<translation>F&amp;echar</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiar Endereço</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
- <translation>Apagar o endereço selecionado da lista</translation>
+ <translation>Eliminar o endereço selecionado da lista</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>Exportar os dados no separador actual para um ficheiro</translation>
+ <translation>Exportar os dados no separador atual para um ficheiro</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -43,187 +39,40 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation>&amp;Eliminar\</translation>
- </message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Escolha o endereço para o qual pretende enviar moedas</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Escolha o endereço com o qual pretende receber moedas</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>Escol&amp;her</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Endereços de envio</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Endereços de depósito</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>Estes são os seus endereços Bitcoin para enviar pagamentos. Verifique sempre o valor e o endereço de envio antes de enviar moedas.</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>Estes são os seus endereços Bitcoin para receber pagamentos. É recomendado que utilize um endereço novo para cada transacção.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Copiar &amp;Rótulo</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editar</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportar Lista de Endereços</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Ficheiro separado por vírgulas (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>A Exportação Falhou</translation>
- </message>
- <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>
- <source>Label</source>
- <translation>Rótulo</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Endereço</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sem rótulo)</translation>
+ <translation>&amp;Eliminar</translation>
</message>
</context>
<context>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation>Diálogo de frase de segurança</translation>
+ <translation>Janela da frase de palavra-passe</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation>Insira a frase de segurança</translation>
+ <translation>Insira a frase de palavra-passe</translation>
</message>
<message>
<source>New passphrase</source>
- <translation>Nova frase de segurança</translation>
+ <translation>Nova frase de palavra-passe</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation>Repita a nova frase de segurança</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Encriptar carteira</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>A sua frase de segurança é necessária para desbloquear a carteira.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Desbloquear carteira</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>A sua frase de segurança é necessária para desencriptar a carteira.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Desencriptar carteira</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Alterar frase de segurança</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Confirmar encriptação 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 encriptar a carteira e perder a sua senha irá &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 a certeza que deseja encriptar a 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 cliente Bitcoin Core 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>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 cópia de segurança da carteira anterior deverá ser substituída com o novo ficheiro de carteira, agora encriptado. Por razões de segurança, cópias de segurança não encriptadas tornar-se-ão inúteis assim que começar a usar a nova carteira encriptada.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Atenção: A tecla Caps Lock está activa!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Carteira encriptada</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Escreva a antiga frase de segurança da carteira, seguida da nova.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>A encriptação da carteira falhou</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>A encriptação da carteira falhou devido a um erro interno. A carteira não foi encriptada.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>As frases de segurança fornecidas não coincidem.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>O desbloqueio da carteira falhou</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>A frase de segurança introduzida para a desencriptação da carteira estava incorreta.</translation>
+ <translation>Repita a nova frase de palavra-passe</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Wallet decryption failed</source>
- <translation>A desencriptação da carteira falhou</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Máscara de Rede</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>A frase de segurança da carteira foi alterada com êxito.</translation>
+ <source>Banned Until</source>
+ <translation>Banido Até</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -235,7 +84,7 @@
</message>
<message>
<source>&amp;Overview</source>
- <translation>Visã&amp;o geral</translation>
+ <translation>&amp;Sinopse</translation>
</message>
<message>
<source>Node</source>
@@ -243,7 +92,7 @@
</message>
<message>
<source>Show general overview of wallet</source>
- <translation>Mostrar visão geral da carteira</translation>
+ <translation>Mostrar sinopse geral da carteira</translation>
</message>
<message>
<source>&amp;Transactions</source>
@@ -251,7 +100,7 @@
</message>
<message>
<source>Browse transaction history</source>
- <translation>Navegar pelo histórico de transações</translation>
+ <translation>Explorar histórico das transações</translation>
</message>
<message>
<source>E&amp;xit</source>
@@ -262,6 +111,14 @@
<translation>Sair da aplicação</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Acerca de %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Mostrar informação sobre %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Sobre &amp;Qt</translation>
</message>
@@ -274,6 +131,10 @@
<translation>&amp;Opções...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Modificar opções de configuração para %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>E&amp;ncriptar Carteira...</translation>
</message>
@@ -283,31 +144,23 @@
</message>
<message>
<source>&amp;Change Passphrase...</source>
- <translation>Mudar &amp;Palavra-passe...</translation>
+ <translation>Alterar &amp;Frase de Palavra-passe...</translation>
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>A &amp;enviar endereços...</translation>
+ <translation>A &amp;enviar os endereços...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>A &amp;receber endereços...</translation>
+ <translation>A &amp;receber os endereços...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
<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>
- <message>
<source>Reindexing blocks on disk...</source>
- <translation>A reindexar blocos no disco...</translation>
+ <translation>A reindexar os blocos no disco...</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -315,11 +168,11 @@
</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>
+ <translation>Efetue uma cópia de segurança da carteira para outra localização</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation>Mudar a frase de segurança utilizada na encriptação da carteira</translation>
+ <translation>Alterar a frase de palavra-passe utilizada na encriptação da carteira</translation>
</message>
<message>
<source>&amp;Debug window</source>
@@ -350,16 +203,12 @@
<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>
<message>
<source>Show or hide the main Window</source>
- <translation>Mostrar ou esconder a janela principal</translation>
+ <translation>Mostrar ou ocultar a janela principal</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -387,23 +236,11 @@
</message>
<message>
<source>Tabs toolbar</source>
- <translation>Barra de separadores</translation>
- </message>
- <message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <translation>Barra de ferramentas dos separadores</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation>Solicitar pagamentos (gera códigos QR e URIs bitcoin:)</translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;Sobre o Bitcoin Core</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Modificar opções de configuração de Bitcoin Core</translation>
+ <translation>Solicitar pagamentos (gera códigos QR e bitcoin: URIs)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -419,17 +256,21 @@
</message>
<message>
<source>&amp;Command-line options</source>
- <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>
- <translation>Mostrar a mensagem de ajuda do Bitcoin Core para obter uma lista com possíveis opções de linha de comandos</translation>
+ <translation>&amp;Opções da linha de &amp;comando</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n ligação ativa à rede Bitcoin</numerusform><numerusform>%n ligações ativas à rede Bitcoin</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>A indexar blocos no disco...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>A processar blocos no disco...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Nenhuma fonte de blocos disponível...</translation>
</message>
@@ -463,11 +304,11 @@
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation>O último bloco recebido foi gerado %1 atrás.</translation>
+ <translation>O último bloco recebido foi gerado há %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation>Transações posteriores não serão visíveis por enquanto.</translation>
+ <translation>As transações depois de isto ainda não serão visíveis.</translation>
</message>
<message>
<source>Error</source>
@@ -498,7 +339,7 @@
<message>
<source>Amount: %1
</source>
- <translation>Quantia: %1
+ <translation>Valor: %1
</translation>
</message>
<message>
@@ -510,7 +351,7 @@
<message>
<source>Label: %1
</source>
- <translation>Rótulo: %1
+ <translation>Etiqueta: %1
</translation>
</message>
<message>
@@ -537,17 +378,10 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alerta da Rede</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
- <translation>Seleção de moeda</translation>
+ <translation>Seleção de Moeda</translation>
</message>
<message>
<source>Quantity:</source>
@@ -559,7 +393,7 @@
</message>
<message>
<source>Amount:</source>
- <translation>Quantia:</translation>
+ <translation>Valor:</translation>
</message>
<message>
<source>Priority:</source>
@@ -575,7 +409,7 @@
</message>
<message>
<source>After Fee:</source>
- <translation>Depois da Taxa:</translation>
+ <translation>Depois da taxa:</translation>
</message>
<message>
<source>Change:</source>
@@ -583,23 +417,23 @@
</message>
<message>
<source>(un)select all</source>
- <translation>(des)seleccionar todos</translation>
+ <translation>(des)selecionar todos</translation>
</message>
<message>
<source>Tree mode</source>
- <translation>Modo árvore</translation>
+ <translation>Modo de árvore</translation>
</message>
<message>
<source>List mode</source>
- <translation>Modo lista</translation>
+ <translation>Modo de lista</translation>
</message>
<message>
<source>Amount</source>
- <translation>Quantia</translation>
+ <translation>Valor</translation>
</message>
<message>
<source>Received with label</source>
- <translation>Recebido com rótulo</translation>
+ <translation>Recebido com etiqueta</translation>
</message>
<message>
<source>Received with address</source>
@@ -611,7 +445,7 @@
</message>
<message>
<source>Confirmations</source>
- <translation>Confirmados</translation>
+ <translation>Confirmações</translation>
</message>
<message>
<source>Confirmed</source>
@@ -621,150 +455,6 @@
<source>Priority</source>
<translation>Prioridade</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiar endereço</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiar rótulo</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar quantia</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID da transação</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Bloquear não gastos</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Desbloquear não gastos</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar quantidade</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar taxa</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiar valor após taxa</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <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>
- <message>
- <source>highest</source>
- <translation>muito alta</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>mais alta</translation>
- </message>
- <message>
- <source>high</source>
- <translation>alta</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>média-alta</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>média</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>média-baixa</translation>
- </message>
- <message>
- <source>low</source>
- <translation>baixa</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>mais baixa</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>muito alta</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 bloqueados)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>nenhum</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Este rótulo fica vermelho se o tamanho da transacção exceder os 1000 bytes.</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>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>
- <message>
- <source>no</source>
- <translation>não</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Pode variar +/- 1 byte por input.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transacções com uma prioridade mais alta têm uma maior probabilidade de serem incluídas num bloco.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sem rótulo)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>troco de %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(troco)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -774,58 +464,26 @@
</message>
<message>
<source>&amp;Label</source>
- <translation>&amp;Rótulo</translation>
+ <translation>&amp;Etiqueta</translation>
</message>
<message>
<source>The label associated with this address list entry</source>
- <translation>O rótulo associado com esta entrada no livro de endereços</translation>
+ <translation>A etiqueta associada com esta entrada da lista de endereços</translation>
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation>O endereço associado com o esta entrada no livro de endereços. Isto só pode ser modificado para endereços de saída.</translation>
+ <translation>O endereço associado com o esta entrada da lista de endereços. Isto só pode ser modificado para os endereços de envio.</translation>
</message>
<message>
<source>&amp;Address</source>
<translation>E&amp;ndereço</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Novo endereço de entrada</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Novo endereço de saída</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editar endereço de entrada</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editar endereço de saída</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>O endereço introduzido "%1" já se encontra no livro de endereços.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>O endereço introduzido "%1" não é um endereço bitcoin válido.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Impossível desbloquear carteira.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Falha ao gerar nova chave.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
<message>
<source>A new data directory will be created.</source>
- <translation>Uma nova pasta de dados será criada.</translation>
+ <translation>Irá ser criada uma nova diretoria de dados.</translation>
</message>
<message>
<source>name</source>
@@ -841,16 +499,12 @@
</message>
<message>
<source>Cannot create data directory here.</source>
- <translation>Não pode ser criada uma pasta de dados aqui.</translation>
+ <translation>Não é possível criar aqui uma diretoria de dados.</translation>
</message>
</context>
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>versão</translation>
</message>
@@ -859,12 +513,12 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Sobre o Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>Sobre %1</translation>
</message>
<message>
<source>Command-line options</source>
- <translation>Opções de linha de comandos</translation>
+ <translation>Opções da linha de comando</translation>
</message>
<message>
<source>Usage:</source>
@@ -872,42 +526,54 @@
</message>
<message>
<source>command-line options</source>
- <translation>opções da linha de comandos</translation>
+ <translation>opções da linha de comando</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Bem-vindo</translation>
+ <source>UI Options:</source>
+ <translation>Opções da IU:</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Bem-vindo ao Bitcoin Core.</translation>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Escolha a diretoria dos dados no arranque (predefinição: %u)</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>Sendo esta a primeira vez que o programa é iniciado, poderá escolher onde o Bitcoin Core irá guardar os seus dados.</translation>
+ <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>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>O Bitcoin Core vai transferir e armazenar uma cópia do "block chain" (cadeia de blocos). Pelo menos %1GB de dados serão armazenados nesta pasta, e vão crescer ao longo do tempo. A sua carteira também irá ser armazenada nesta pasta.</translation>
+ <source>Start minimized</source>
+ <translation>Iniciar minimizado</translation>
</message>
<message>
- <source>Use the default data directory</source>
- <translation>Utilizar a pasta de dados padrão</translation>
+ <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>Use a custom data directory:</source>
- <translation>Utilizar uma pasta de dados personalizada:</translation>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Mostrar o ecrã de abertura no arranque (predefinição: %u)</translation>
</message>
+ </context>
+<context>
+ <name>Intro</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <source>Welcome</source>
+ <translation>Bem-vindo</translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation>Bem-vindo a %1.</translation>
+ </message>
+ <message>
+ <source>Use the default data directory</source>
+ <translation>Utilizar a diretoria de dados predefinida</translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation>Utilizar uma diretoria de dados personalizada:</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>
+ <translation>Erro: não pode ser criada a diretoria de dados especificada como "%1.</translation>
</message>
<message>
<source>Error</source>
@@ -915,7 +581,7 @@
</message>
<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>
+ <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>
@@ -940,10 +606,6 @@
<source>Select payment request file</source>
<translation>Seleccione o ficheiro de pedido de pagamento</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Seleccione o ficheiro de pedido de pagamento a abrir</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -956,6 +618,14 @@
<translation>&amp;Principal</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Começar o %1 automaticamente ao iniciar a sessão no sistema.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Iniciar o %1 no início de sessão do sistema</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>Tamanho da cache da base de &amp;dados</translation>
</message>
@@ -969,11 +639,11 @@
</message>
<message>
<source>Accept connections from outside</source>
- <translation>Aceitar conceções externas</translation>
+ <translation>Aceitar ligações externas</translation>
</message>
<message>
<source>Allow incoming connections</source>
- <translation>Permitir conexão</translation>
+ <translation>Permitir ligação a receber</translation>
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
@@ -984,25 +654,21 @@
<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 quando escolher Sair da aplicação no menú.</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 utilizador pode ser definida aqui. Esta definição entrará em efeito após reiniciar o 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 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>
+ <translation>URLs de transação de terceiros</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>
+ <translation>Ativar as opções da linha de comando que se sobrepõem às opções acima:</translation>
</message>
<message>
<source>Reset all client options to default.</source>
- <translation>Repor todas as opções do cliente.</translation>
+ <translation>Repor todas as opções de cliente para a predefinição.</translation>
</message>
<message>
<source>&amp;Reset Options</source>
@@ -1013,16 +679,8 @@
<translation>&amp;Rede</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Começar o Bitcoin Core automaticamente ao iniciar sessão no sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Começar o Bitcoin Core ao iniciar o sistema</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>
+ <translation>(0 = automático, &lt;0 = deixar essa quantidade de núcleos livre)</translation>
</message>
<message>
<source>W&amp;allet</source>
@@ -1030,11 +688,11 @@
</message>
<message>
<source>Expert</source>
- <translation>Especialista</translation>
+ <translation> Especialistas </translation>
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation>Ativar funcionalidades de controlo de transação.</translation>
+ <translation>Ativar as funcionalidades de controlo de moedas</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>
@@ -1050,7 +708,7 @@
</message>
<message>
<source>Map port using &amp;UPnP</source>
- <translation>Mapear porta usando &amp;UPnP</translation>
+ <translation>Mapear porta, utilizando &amp;UPnP</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
@@ -1073,10 +731,42 @@
<translation>Porto do proxy (p.ex. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Usado para alcançar nós via:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Mostra, caso o proxy SOCKS5 predefinido submetido seja usado para alcançar nós através deste tipo de rede.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Ligar à rede Bitcoin através de um proxy SOCKS5 separado para utilizar os serviços ocultos do Tor.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Utilizar um proxy SOCKS5 separado para alcançar nós via serviços ocultos do Tor:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Janela</translation>
</message>
<message>
+ <source>Hide tray icon</source>
+ <translation>Ocultar ícone da bandeja</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Apenas mostrar o ícone da bandeja de sistema após minimizar a janela.</translation>
</message>
@@ -1102,11 +792,11 @@
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation>Escolha a subdivisão unitária a ser mostrada por defeito na aplicação e ao enviar moedas.</translation>
+ <translation>Escolha a unidade da subdivisão predefinida para ser mostrada na interface e quando enviar as moedas.</translation>
</message>
<message>
<source>Whether to show coin control features or not.</source>
- <translation>Escolha para mostrar funcionalidades de Coin Control ou não.</translation>
+ <translation>Escolha se deve mostrar as funcionalidades de controlo de moedas ou não.</translation>
</message>
<message>
<source>&amp;OK</source>
@@ -1118,7 +808,7 @@
</message>
<message>
<source>default</source>
- <translation>padrão</translation>
+ <translation>predefinição</translation>
</message>
<message>
<source>none</source>
@@ -1126,7 +816,7 @@
</message>
<message>
<source>Confirm options reset</source>
- <translation>Confirme a reposição de opções</translation>
+ <translation>Confirme a reposição das opções</translation>
</message>
<message>
<source>Client restart required to activate changes.</source>
@@ -1221,97 +911,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Manuseamento de URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Endereço de pagamento inválido %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <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>
- <message>
- <source>Payment request error</source>
- <translation>Erro de pedido de pagamento</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Impossível iniciar o controlador de bitcoin: click-to-pay</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <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>Payment request expired.</source>
- <translation>Pedido de pagamento expirou.</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>
- <message>
- <source>Invalid payment request.</source>
- <translation>Pedido de pagamento inválido.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <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>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>
- <message>
- <source>Payment acknowledged</source>
- <translation>Pagamento confirmado</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Erro de pedido de rede</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1366,31 +965,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Salvar Imagem...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copiar Imagem</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Guardar Código QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Imagem PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nome do Cliente</translation>
- </message>
- <message>
<source>N/A</source>
<translation>N/D</translation>
</message>
@@ -1411,16 +987,12 @@
<translation>Geral</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <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>
+ <translation>Hora de Arranque</translation>
</message>
<message>
<source>Network</source>
@@ -1443,6 +1015,18 @@
<translation>Número actual de blocos</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation>Banco de Memória</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Número actual de transacções</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Utilização de memória</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Recebido</translation>
</message>
@@ -1452,13 +1036,21 @@
</message>
<message>
<source>&amp;Peers</source>
- <translation>&amp;Conexção</translation>
+ <translation>&amp;Conexão</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation>Nós banidos</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>Whitelisted</source>
+ <translation>Permitido por si</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Direcção</translation>
</message>
@@ -1467,10 +1059,30 @@
<translation>Versão</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Bloco Inicial</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Cabeçalhos Sincronizados</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Blocos Sincronizados</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Agente Usuário</translation>
</message>
<message>
+ <source>Decrease font size</source>
+ <translation>Diminuir tamanho da letra</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Aumentar tamanho da letra</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Serviços</translation>
</message>
@@ -1480,7 +1092,7 @@
</message>
<message>
<source>Connection Time</source>
- <translation>Tempo de Conexção</translation>
+ <translation>Tempo de Ligação</translation>
</message>
<message>
<source>Last Send</source>
@@ -1495,6 +1107,18 @@
<translation>Tempo de Latência</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>A duração de um ping atualmente pendente.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Espera do Ping</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation>Fuso Horário</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Data do último bloco</translation>
</message>
@@ -1527,10 +1151,6 @@
<translation>Saída:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Data de compilação</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Ficheiro de registo de depuração</translation>
</message>
@@ -1539,8 +1159,36 @@
<translation>Limpar consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Bem-vindo à consola RPC do Bitcoin Core.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Desligar Nó</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Banir Nó por</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;hora</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;dia</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;semana</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;ano</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;Desbloquear Nó</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Bem-vindo à consola RPC da %1.</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>
@@ -1567,6 +1215,10 @@
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(id nó: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>via %1</translation>
</message>
@@ -1583,6 +1235,14 @@
<translation>Saída</translation>
</message>
<message>
+ <source>Yes</source>
+ <translation>Sim</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Não</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation>Desconhecido</translation>
</message>
@@ -1657,18 +1317,6 @@
<source>Remove</source>
<translation>Remover</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copiar rótulo</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copiar mensagem</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar quantia</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1688,73 +1336,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Salvar Imagem...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Requisitar Pagamento para %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informação de Pagamento</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Endereço</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Quantia</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Rótulo</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensagem</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI resultante muito longo. Tente reduzir o texto do rótulo / mensagem.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Erro ao codificar URI em Código QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Rótulo</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mensagem</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Quantia</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sem rótulo)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(sem mensagem)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(sem quantia)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1764,7 +1345,7 @@
</message>
<message>
<source>Coin Control Features</source>
- <translation>Funcionalidades de Coin Control:</translation>
+ <translation>Funcionalidades do Controlo de Moedas:</translation>
</message>
<message>
<source>Inputs...</source>
@@ -1820,7 +1401,7 @@
</message>
<message>
<source>Choose...</source>
- <translation>Escolha...</translation>
+ <translation>Escolher...</translation>
</message>
<message>
<source>collapse fee-settings</source>
@@ -1875,14 +1456,6 @@
<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>
@@ -1914,94 +1487,6 @@
<source>S&amp;end</source>
<translation>E&amp;nviar</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirme envio de moedas</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 para %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiar quantidade</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiar quantia</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiar taxa</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiar valor após taxa</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiar bytes</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiar prioridade</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiar alteração</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ou</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>A quantia excede o seu saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>O total excede o seu saldo quando a taxa de transação de %1 for incluída.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Erro: A criação da transação falhou! </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>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>Payment request expired.</source>
- <translation>Pedido de pagamento expirou.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Aviso: Endereço Bitcoin inválido</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(sem rótulo)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <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>
- <message>
- <source>added as transaction fee</source>
- <translation>adicionados como taxa de transação</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2014,16 +1499,12 @@
<translation>&amp;Pagar A:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Escreva um rótulo para este endereço para o adicionar ao seu livro de endereços</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>Rótu&amp;lo:</translation>
</message>
<message>
<source>Choose previously used address</source>
- <translation>Escolher endereço usado previamente</translation>
+ <translation>Escolha o endereço utilizado anteriormente</translation>
</message>
<message>
<source>This is a normal payment.</source>
@@ -2050,10 +1531,26 @@
<translation>Remover esta entrada</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>A taxa será deduzida ao montante enviado. O destinatário irá receber menos bitcoins do que as que introduziu no campo montante. Caso sejam seleccionados múltiplos destinatários, a taxa será repartida equitativamente.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>S&amp;ubtrair taxa ao montante</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Mensagem:</translation>
</message>
<message>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Pedido de pagamento não autenticado.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Pedido de pagamento autenticado.</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>
@@ -2073,8 +1570,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>O Bitcoin Core está a encerrar...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 está a encerrar...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2092,12 +1589,16 @@
<translation>&amp;Assinar Mensagem</translation>
</message>
<message>
+ <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation>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>
+ </message>
+ <message>
<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>
- <translation>Escolher endereço usado previamente</translation>
+ <translation>Escolha o endereço utilizado anteriormente</translation>
</message>
<message>
<source>Alt+A</source>
@@ -2144,6 +1645,10 @@
<translation>&amp;Verificar Mensagem</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation>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>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation>O endereço Bitcoin com que a mensagem foi designada</translation>
</message>
@@ -2159,70 +1664,10 @@
<source>Reset all verify message fields</source>
<translation>Repor todos os campos de verificação de mensagem</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Clique "Assinar mensagem" para gerar a assinatura</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>O endereço introduzido é inválido.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Por favor verifique o endereço e tente de novo.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>O endereço introduzido não refere a nenhuma chave.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>O desbloqueio da carteira foi cancelado.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>A chave privada para o endereço introduzido não está disponível.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Assinatura de mensagem falhou.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mensagem assinada.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>A assinatura não pôde ser descodificada.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Por favor verifique a assinatura e tente de novo.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>A assinatura não condiz com o conteúdo da mensagem.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Verificação da mensagem falhou.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mensagem verificada.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Os programadores do Bitcoin Core</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[rede de testes]</translation>
</message>
@@ -2235,778 +1680,668 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Aberto até %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>em conflito:</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/desligado</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/não confirmada</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmações</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Estado</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, transmitida através de %n nó</numerusform><numerusform>, transmitida através de %n nós</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Origem</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Gerado</translation>
- </message>
- <message>
- <source>From</source>
- <translation>De</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Para</translation>
- </message>
- <message>
- <source>own address</source>
- <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>
- <message>
- <source>Credit</source>
- <translation>Crédito</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>matura em %n bloco</numerusform><numerusform>matura em %n blocos</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>não aceite</translation>
- </message>
- <message>
- <source>Debit</source>
- <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>
+ <name>TransactionDescDialog</name>
<message>
- <source>Transaction fee</source>
- <translation>Taxa de transação</translation>
+ <source>This pane shows a detailed description of the transaction</source>
+ <translation>Esta janela mostra uma descrição detalhada da transação</translation>
</message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Net amount</source>
- <translation>Valor líquido</translation>
+ <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>bitcoin-core</name>
<message>
- <source>Message</source>
- <translation>Mensagem</translation>
+ <source>Options:</source>
+ <translation>Opções:</translation>
</message>
<message>
- <source>Comment</source>
- <translation>Comentário</translation>
+ <source>Specify data directory</source>
+ <translation>Especificar pasta de dados</translation>
</message>
<message>
- <source>Transaction ID</source>
- <translation>ID da Transação</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Ligar a um nó para recuperar endereços de pares, e desligar</translation>
</message>
<message>
- <source>Merchant</source>
- <translation>Comerciante</translation>
+ <source>Specify your own public address</source>
+ <translation>Especifique o seu endereço público</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>Moedas geradas deverão maturar por %1 blocos antes de poderem ser gastas. Quando gerou este bloco, ele foi transmitido para a rede para ser incluído na cadeia de blocos. Se a inclusão na cadeia de blocos falhar, o seu estado irá ser alterado para "não aceite" e as moedas não poderão ser gastas. Isto poderá acontecer ocasionalmente se outro nó da rede gerar um bloco a poucos segundos de diferença do seu.</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Aceitar comandos de linha de comandos e JSON-RPC</translation>
</message>
<message>
- <source>Debug information</source>
- <translation>Informação de depuração</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Se &lt;category&gt; não é fornecida ou &lt;category&gt; = 1, imprimir toda a informação de depuração.</translation>
</message>
<message>
- <source>Transaction</source>
- <translation>Transação</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>Poda configurada abaixo do mínimo de %d MiB. Por favor, utilize um valor mais elevado.</translation>
</message>
<message>
- <source>Inputs</source>
- <translation>Entradas</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Suprimir: a última sincronização da carteira vai além dos dados suprimidos. O que precisa para -reindex (transferir novamente toda a cadeia de blocos, no caso de nó suprimido)</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Quantia</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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>Reduza os requisitos de armazenamento podando (eliminando) blocos antigos. Este modo é incompatível com -txindex e -rescan. Aviso: Reverter esta opção requer um novo descarregamento da cadeia de blocos completa. (padrão: 0 = desactivar poda de blocos, &gt;%u = tamanho desejado em MiB para utilizar em ficheiros de blocos)</translation>
</message>
<message>
- <source>true</source>
- <translation>verdadeiro</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Reanálises não são possíveis no modo de suprimir. Para isso terá de utilizar -reindex que irá transferir novamente toda a cadeia de blocos.</translation>
</message>
<message>
- <source>false</source>
- <translation>falso</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Erro: Um erro fatal interno ocorreu, verificar debug.log para mais informação</translation>
</message>
<message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ainda não foi transmitida com sucesso</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Aberta por mais %n bloco</numerusform><numerusform>Aberta por mais %n blocos</numerusform></translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Taxa (em %s/kB) a adicionar às transacções que envia (padrão: %s)</translation>
</message>
<message>
- <source>unknown</source>
- <translation>desconhecido</translation>
+ <source>Pruning blockstore...</source>
+ <translation>A podar a blockstore...</translation>
</message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detalhes da transação</translation>
+ <source>Run in the background as a daemon and accept commands</source>
+ <translation>Correr o processo em segundo plano e aceitar comandos</translation>
</message>
<message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation>Esta janela mostra uma descrição detalhada da transação</translation>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Não é possível iniciar o servidor HTTP. Verifique o debug.log para detalhes.</translation>
</message>
-</context>
-<context>
- <name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation>Data</translation>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <translation>Aceitar ligações externas (padrão: 1 sem -proxy ou -connect)</translation>
</message>
<message>
- <source>Type</source>
- <translation>Tipo</translation>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Aberta por mais %n bloco</numerusform><numerusform>Aberta por mais %n blocos</numerusform></translation>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee está definida muito elevada! Esta é a taxa de transação pode poderá pagar quando as estimativas de taxas não estão disponíveis.</translation>
</message>
<message>
- <source>Open until %1</source>
- <translation>Aberto até %1</translation>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>Uma percentagem da taxa (em %s/kB) que será utilizada quando a estimativa da taxa tiver dados insuficientes (predefinição: %s)</translation>
</message>
<message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmada (%1 confirmações)</translation>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Aceitar as transações retransmitidas recebidas dos pares na lista branca, mesmo quando não retransmitir as transações (predefinição: %d)</translation>
</message>
<message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Este bloco não foi recebido por outros nós e provavelmente não será aceite pela rede!</translation>
+ <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>Generated but not accepted</source>
- <translation>Gerado mas não aceite</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>Offline</source>
- <translation>Offline</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>Label</source>
- <translation>Rótulo</translation>
+ <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>Unconfirmed</source>
- <translation>Não confirmado:</translation>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Forçar retransmissão das transações a partir dos pares da lista branca, mesmo que estes violem a política de retransmissão local (predefinição: %d)</translation>
</message>
<message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>A confirmar (%1 de %2 confirmações recomendadas)</translation>
+ <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>Conflicted</source>
- <translation>Em Conflito:</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>A base de dados de blocos contém um bloco que aparenta ser do futuro. Isto pode ser causado por uma data incorrecta definida no seu computador. Reconstrua apenas a base de dados de blocos caso tenha a certeza de que a data e hora do seu computador estão correctos.</translation>
</message>
<message>
- <source>Received with</source>
- <translation>Recebido com</translation>
+ <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>
<message>
- <source>Received from</source>
- <translation>Recebido de</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Utilizar UPnP para mapear a porta de escuta (predefinição: 1 quando escutar e sem -proxy)</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Enviado para</translation>
+ <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
+ <translation>Aviso: A rede não parece estar completamente de acordo! Parece que alguns mineiros estão com dificuldades técnicas.</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation>Pagamento a si mesmo</translation>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation>Atenção: Parecemos não estar de acordo com os nossos pares! Poderá ter que atualizar o seu cliente, ou outros nós poderão ter que atualizar os seus clientes.</translation>
</message>
<message>
- <source>Mined</source>
- <translation>Minadas</translation>
+ <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>watch-only</source>
- <translation>modo-verificação</translation>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>- máximo do banco de memória deverá ser pelo menos %d MB</translation>
</message>
<message>
- <source>(n/a)</source>
- <translation>(n/d)</translation>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;categoria&gt; pode ser:</translation>
</message>
<message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Estado da transação. Passar o cursor por cima deste campo para mostrar o número de confirmações.</translation>
+ <source>Append comment to the user agent string</source>
+ <translation>Anexar um comentário para a entrada de agente do utilizador</translation>
</message>
<message>
- <source>Date and time that the transaction was received.</source>
- <translation>Data e hora em que a transação foi recebida.</translation>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Tentar reuperar as chaves privadas de um "wallet" ao iniciar</translation>
</message>
<message>
- <source>Type of transaction.</source>
- <translation>Tipo de transação.</translation>
+ <source>Block creation options:</source>
+ <translation>Opções da criação de bloco:</translation>
</message>
<message>
- <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>
+ <source>Connect only to the specified node(s)</source>
+ <translation>Apenas ligar ao(s) nó(s) especificado(s)</translation>
</message>
<message>
- <source>Amount removed from or added to balance.</source>
- <translation>Quantia retirada ou adicionada ao saldo.</translation>
+ <source>Connection options:</source>
+ <translation>Opções de ligação:</translation>
</message>
-</context>
-<context>
- <name>TransactionView</name>
<message>
- <source>All</source>
- <translation>Todas</translation>
+ <source>Corrupted block database detected</source>
+ <translation>Cadeia de blocos corrompida detectada</translation>
</message>
<message>
- <source>Today</source>
- <translation>Hoje</translation>
+ <source>Debugging/Testing options:</source>
+ <translation>Opções de Depuração/Teste:</translation>
</message>
<message>
- <source>This week</source>
- <translation>Esta semana</translation>
+ <source>Do not load the wallet and disable wallet RPC calls</source>
+ <translation>Não carregar a carteira e desativar as chamadas de RPC da carteira.</translation>
</message>
<message>
- <source>This month</source>
- <translation>Este mês</translation>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation>Deseja reconstruir agora a base de dados de blocos.</translation>
</message>
<message>
- <source>Last month</source>
- <translation>Mês passado</translation>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Activar publicação do hash do bloco em &lt;address&gt;</translation>
</message>
<message>
- <source>This year</source>
- <translation>Este ano</translation>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Activar publicação do hash da transacção em &lt;address&gt;</translation>
</message>
<message>
- <source>Range...</source>
- <translation>Período...</translation>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Activar publicação de dados brutos do bloco em &lt;address&gt;</translation>
</message>
<message>
- <source>Received with</source>
- <translation>Recebida com</translation>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Activar publicação de dados brutos da transacção em &lt;address&gt;</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Enviada para</translation>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>Ativar substituição da transação no banco de memória (predefinição: %u)</translation>
</message>
<message>
- <source>To yourself</source>
- <translation>Para si mesmo</translation>
+ <source>Error initializing block database</source>
+ <translation>Erro ao inicializar a cadeia de blocos</translation>
</message>
<message>
- <source>Mined</source>
- <translation>Minadas</translation>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation>Erro ao inicializar o ambiente %s da base de dados da carteira</translation>
</message>
<message>
- <source>Other</source>
- <translation>Outras</translation>
+ <source>Error loading %s</source>
+ <translation>Erro ao carregar %s</translation>
</message>
<message>
- <source>Enter address or label to search</source>
- <translation>Escreva endereço ou rótulo a procurar</translation>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Erro ao carregar %s: carteira corrompida</translation>
</message>
<message>
- <source>Min amount</source>
- <translation>Quantia mínima</translation>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Erro ao carregar %s: a carteira requer a nova versão de %s</translation>
</message>
<message>
- <source>Copy address</source>
- <translation>Copiar endereço</translation>
+ <source>Error loading block database</source>
+ <translation>Erro ao carregar base de dados de blocos</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Copiar rótulo</translation>
+ <source>Error opening block database</source>
+ <translation>Erro ao abrir a base de dados de blocos</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation>Copiar quantia</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Erro: Pouco espaço em disco!</translation>
</message>
<message>
- <source>Copy transaction ID</source>
- <translation>Copiar ID da Transação</translation>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <translation>Falhou a escutar em qualquer porta. Use -listen=0 se quiser isto.</translation>
</message>
<message>
- <source>Edit label</source>
- <translation>Editar rótulo</translation>
+ <source>Importing...</source>
+ <translation>A importar...</translation>
</message>
<message>
- <source>Show transaction details</source>
- <translation>Mostrar detalhes da transação</translation>
+ <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>
<message>
- <source>Export Transaction History</source>
- <translation>Exportar Histórico de Transacções</translation>
+ <source>Invalid -onion address: '%s'</source>
+ <translation>Endereço -onion inválido: '%s'</translation>
</message>
<message>
- <source>Watch-only</source>
- <translation>Modo-verificação</translation>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Valor inválido para -%s=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Exporting Failed</source>
- <translation>A Exportação Falhou</translation>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Valor inválido para -fallbackfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Ocorreu um erro ao tentar guardar o histórico de transações em %1.</translation>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Manter o banco de memória da transação abaixo de &lt;n&gt; megabytes (predefinição: %u)</translation>
</message>
<message>
- <source>Exporting Successful</source>
- <translation>Exportação Bem Sucedida</translation>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Localização de cookie de autorização (predefinição: diretoria de dados)</translation>
</message>
<message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>O histórico de transacções foi com guardado com sucesso em %1.</translation>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Mínimo de bytes por sigop nas transações que nós transmitimos e mine (predefinição: %u)</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Ficheiro separado por vírgulas (*.csv)</translation>
+ <source>Not enough file descriptors available.</source>
+ <translation>Os descritores de ficheiros disponíveis são insuficientes.</translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>Confirmada</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>Date</source>
- <translation>Data</translation>
+ <source>Print this help message and exit</source>
+ <translation>Imprimir esta mensagem de ajuda e sair</translation>
</message>
<message>
- <source>Type</source>
- <translation>Tipo</translation>
+ <source>Print version and exit</source>
+ <translation>Imprimir versão e sair</translation>
</message>
<message>
- <source>Label</source>
- <translation>Rótulo</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Poda não pode ser configurada com um valor negativo.</translation>
</message>
<message>
- <source>Address</source>
- <translation>Endereço</translation>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Modo poda é incompatível com -txindex.</translation>
</message>
<message>
- <source>ID</source>
- <translation>ID</translation>
+ <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
+ <translation>Definir o tamanho da cache de base de dados em megabytes (%d a %d, padrão: %d)</translation>
</message>
<message>
- <source>Range:</source>
- <translation>Período:</translation>
+ <source>Set maximum block size in bytes (default: %d)</source>
+ <translation>Definir tamanho máximo por bloco em bytes (por defeito: %d)</translation>
</message>
<message>
- <source>to</source>
- <translation>até</translation>
+ <source>Specify wallet file (within data directory)</source>
+ <translation>Especifique ficheiro de carteira (dentro da pasta de dados)</translation>
</message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation>Unidade de valores recebidos. Clique para selecionar outra unidade.</translation>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Argumento não suportado -benchmark ignorado, use -debug=bench.</translation>
</message>
-</context>
-<context>
- <name>WalletFrame</name>
<message>
- <source>No wallet has been loaded.</source>
- <translation>Nenhuma carteira foi carregada.</translation>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Argumento não suportado -debugnet ignorado, use -debug=net.</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>Enviar Moedas</translation>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Argumento não suportado -tor encontrado, use -onion.</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Exportar</translation>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Utilizar UPnP para mapear a porta de escuta (predefinição: %u)</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportar os dados no separador actual para um ficheiro</translation>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>Comentário no User Agent (%s) contém caracteres inseguros.</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Cópia de Segurança da Carteira</translation>
+ <source>Verifying blocks...</source>
+ <translation>A verificar blocos...</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Dados da Carteira (*.dat)</translation>
+ <source>Verifying wallet...</source>
+ <translation>A verificar carteira...</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Cópia de Segurança Falhou</translation>
+ <source>Wallet %s resides outside data directory %s</source>
+ <translation>A carteira %s reside fora da pasta de dados %s</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Ocorreu um erro ao tentar guardar os dados da carteira em %1.</translation>
+ <source>Wallet options:</source>
+ <translation>Opções da carteira:</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Os dados da carteira foram guardados com sucesso em %1.</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>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>Backup Successful</source>
- <translation>Cópia de Segurança Bem Sucedida</translation>
+ <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>
-</context>
-<context>
- <name>bitcoin-core</name>
<message>
- <source>Options:</source>
- <translation>Opções:</translation>
+ <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>Vinculado para dar o endereço para atender as ligações JSON-RPC. Use [host]: Notação de porta para IPv6. Esta opção pode ser especificada várias vezes (padrão: ligam-se a todas as interfaces)</translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>Especificar pasta de dados</translation>
+ <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
+ <translation>Crie ficheiros novos com as permisões predefinidas do sistema, em vez de umask 077 (apenas eficaz caso a funcionalidade carteira esteja desactivada)</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Ligar a um nó para recuperar endereços de pares, e desligar</translation>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Descobrir o próprio endereço IP (padrão: 1 ao escutar e sem -externalip ou -proxy)</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Especifique o seu endereço público</translation>
+ <source>Error: Listening for incoming connections failed (listen returned error %s)</source>
+ <translation>Erro: A escuta de ligações de entrada falhou (escuta devolveu erro %s)</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Aceitar comandos de linha de comandos e JSON-RPC</translation>
+ <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>Executar comando quando um alerta relevante for recebido ou em caso de uma divisão longa da cadeia de blocos (no comando, %s é substituído pela mensagem)</translation>
</message>
<message>
- <source>Run in the background as a daemon and accept commands</source>
- <translation>Correr o processo em segundo plano e aceitar comandos</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Taxas (em %s/kB) abaixo deste valor são consideradas nulas para propagação, mineração e criação de transacções (padrão: %s)</translation>
</message>
<message>
- <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>Aceitar ligações externas (padrão: 1 sem -proxy ou -connect)</translation>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Caso o paytxfee não seja definido, inclua uma taxa suficiente para que as transacções comecem a ser confirmadas, em média, dentro de n blocos (padrão: %u)</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>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Montante inválido para -maxtxfee=&lt;amount&gt;: '%s' (deverá ser, no mínimo , a taxa mínima de propagação de %s, de modo a evitar transações bloqueadas)</translation>
</message>
<message>
- <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>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Tamanho máximo dos dados em transacções que incluem dados que propagamos e mineramos (padrão: %u)</translation>
</message>
<message>
- <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>
+ <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
+ <translation>Encontrar pares usando DNS lookup, caso o número de endereços seja reduzido (padrão: 1 excepto -connect)</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>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Usar credenciais aleatórias por cada ligação proxy. Permite que o Tor use stream isolation (padrão: %u)</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>
+ <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
+ <translation>Definir tamanho máximo de transações com alta-prioridade/baixa-taxa em bytes (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>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>O montante da transacção é demasiado baixo após a dedução da taxa</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Incapaz de vincular à porta %s neste computador. O Bitcoin Core provavelmente já está a correr.</translation>
+ <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 produto inclui software desenvolvido pelo OpenSSL Project para utilização no OpenSSL Toolkit &lt;https://www.openssl.org/&gt; e software criptográfico escrito por Eric Young e software UPnP escrito por Thomas Bernard.</translation>
</message>
<message>
- <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>Aviso: A rede não parece estar completamente de acordo! Parece que alguns mineiros estão com dificuldades técnicas.</translation>
+ <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>Os pares enviados para a lista branca não podem ser DoS banidos e as suas transações são sempre retransmitidas, mesmo que já estejam no banco de memória, útil, por exemplo, para um acesso</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>Atenção: Parecemos não estar de acordo com os nossos pares! Poderá ter que atualizar o seu cliente, ou outros nós poderão ter que atualizar os seus clientes.</translation>
+ <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
+ <translation>É necessário reconstruir a base de dados, utilizando -reindex para voltar ao modo de suprimir. Isto irá transferir novamente a cadeia de blocos completa</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>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>
+ <source>(default: %u)</source>
+ <translation>(predefinição: %u)</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>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Aceitar pedidos REST públicos (predefinição: %u)</translation>
</message>
<message>
- <source>&lt;category&gt; can be:</source>
- <translation>&lt;categoria&gt; pode ser:</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Criar automaticamente o serviço Tor oculto (predefinição: %d)</translation>
</message>
<message>
- <source>Block creation options:</source>
- <translation>Opções de criação de bloco:</translation>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>Ligar através de um proxy SOCKS5</translation>
</message>
<message>
- <source>Connect only to the specified node(s)</source>
- <translation>Apenas ligar ao(s) nó(s) especificado(s)</translation>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Erro ao ler da base de dados, encerrando.</translation>
</message>
<message>
- <source>Connection options:</source>
- <translation>Opcões de conexção:</translation>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Importar blocos de um ficheiro blk000??.dat externo ao iniciar</translation>
</message>
<message>
- <source>Corrupted block database detected</source>
- <translation>Cadeia de blocos corrompida detectada</translation>
+ <source>Information</source>
+ <translation>Informação</translation>
</message>
<message>
- <source>Debugging/Testing options:</source>
- <translation>Depuração/Opções teste:</translation>
+ <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation>Montante inválido para -paytxfee=&lt;amount&gt;: '%s' (deverá ser no mínimo %s)</translation>
</message>
<message>
- <source>Do not load the wallet and disable wallet RPC calls</source>
- <translation>Não carregar a carteira e desativar chamadas RPC de carteira.</translation>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation>Máscara de rede inválida especificada em -whitelist: '%s'</translation>
</message>
<message>
- <source>Do you want to rebuild the block database now?</source>
- <translation>Deseja reconstruir agora a base de dados de blocos.</translation>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>Manter no máximo &lt;n&gt; transacções órfãs em memória (padrão: %u)</translation>
</message>
<message>
- <source>Error initializing block database</source>
- <translation>Erro ao inicializar a cadeia de blocos</translation>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation>Necessário especificar uma porta com -whitebind: '%s'</translation>
</message>
<message>
- <source>Error initializing wallet database environment %s!</source>
- <translation>Erro ao inicializar o ambiente %s da base de dados da carteira</translation>
+ <source>Node relay options:</source>
+ <translation>Opções da transmissão de nós:</translation>
</message>
<message>
- <source>Error loading block database</source>
- <translation>Erro ao carregar base de dados de blocos</translation>
+ <source>RPC server options:</source>
+ <translation>Opções do servidor RPC:</translation>
</message>
<message>
- <source>Error opening block database</source>
- <translation>Erro ao abrir a base de dados de blocos</translation>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Reduzindo -maxconnections de %d para %d, devido a limitações no sistema.</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Erro: Pouco espaço em disco!</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Procurar transacções em falta na cadeia de blocos ao iniciar</translation>
</message>
<message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation>Falhou a escutar em qualquer porta. Use -listen=0 se quiser isto.</translation>
+ <source>Send trace/debug info to console instead of debug.log file</source>
+ <translation>Enviar informação de rastreio/depuração para a consola e não para o ficheiro debug.log</translation>
</message>
<message>
- <source>Importing...</source>
- <translation>A importar...</translation>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Enviar como uma transacção a custo zero se possível (padrão: %u)</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>
+ <source>Show all debugging options (usage: --help -help-debug)</source>
+ <translation>Mostrar todas as opções de depuração (utilização: --help -help-debug)</translation>
</message>
<message>
- <source>Invalid -onion address: '%s'</source>
- <translation>Endereço -onion inválido: '%s'</translation>
+ <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>
<message>
- <source>Not enough file descriptors available.</source>
- <translation>Os descritores de ficheiros disponíveis são insuficientes.</translation>
+ <source>Signing transaction failed</source>
+ <translation>Falhou assinatura da transação</translation>
</message>
<message>
- <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>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>O montante da transacção é demasiado baixo para pagar a taxa</translation>
</message>
<message>
- <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
- <translation>Definir o tamanho da cache de base de dados em megabytes (%d a %d, padrão: %d)</translation>
+ <source>This is experimental software.</source>
+ <translation>Isto é software experimental.</translation>
</message>
<message>
- <source>Set maximum block size in bytes (default: %d)</source>
- <translation>Definir tamanho máximo por bloco em bytes (por defeito: %d)</translation>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Palavra-passe da porta de controlo Tor (predefinição: vazio)</translation>
</message>
<message>
- <source>Specify wallet file (within data directory)</source>
- <translation>Especifique ficheiro de carteira (dentro da pasta de dados)</translation>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Porta de controlo Tor a utilizar se a escuta cebola estiver ativada (predefinição: %s)</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>
+ <source>Transaction amount too small</source>
+ <translation>Quantia da transação é muito baixa</translation>
</message>
<message>
- <source>Verifying blocks...</source>
- <translation>A verificar blocos...</translation>
+ <source>Transaction amounts must be positive</source>
+ <translation>Quantia da transação deverá ser positiva</translation>
</message>
<message>
- <source>Verifying wallet...</source>
- <translation>A verificar carteira...</translation>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transacção demasiado grande para a política de taxas</translation>
</message>
<message>
- <source>Wallet %s resides outside data directory %s</source>
- <translation>A carteira %s reside fora da pasta de dados %s</translation>
+ <source>Transaction too large</source>
+ <translation>Transação grande demais</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>Opções da carteira:</translation>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation>Incapaz de vincular à porta %s neste computador (vínculo retornou erro %s)</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Aviso: Esta versão está desatualizada; atualização necessária!</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Actualizar carteira para o formato mais recente ao iniciar</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>É necessário reconstruir as bases de dados usando -reindex para mudar o -txindex</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Nome de utilizador para ligações JSON-RPC</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>
+ <source>Warning</source>
+ <translation>Aviso</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>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Aviso: ativadas novas regras desconhecidas (versionbit %i)</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>Vinculado para dar o endereço para atender as ligações JSON-RPC. Use [host]: Notação de porta para IPv6. Esta opção pode ser especificada várias vezes (padrão: ligam-se a todas as interfaces)</translation>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Se operar apenas num modo de blocos (predefinição: %u)</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>
+ <source>Zapping all transactions from wallet...</source>
+ <translation>A limpar todas as transações da carteira...</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>Executar comando quando um alerta relevante for recebido ou em caso de uma divisão longa da cadeia de blocos (no comando, %s é substituído pela mensagem)</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>Opções de notificação ZeroMQ:</translation>
</message>
<message>
- <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
- <translation>Definir tamanho máximo de transações com alta-prioridade/baixa-taxa em bytes (por defeito: %d)</translation>
+ <source>Password for JSON-RPC connections</source>
+ <translation>Palavra-passe para ligações JSON-RPC</translation>
</message>
<message>
- <source>(default: %u)</source>
- <translation>(por defeito: %u)</translation>
+ <source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
+ <translation>Executar comando quando o melhor bloco mudar (no comando, %s é substituído pela hash do bloco)</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Os Programadores do Bitcoin Core</translation>
+ <source>Allow DNS lookups for -addnode, -seednode and -connect</source>
+ <translation>Permitir procuras DNS para -addnode, -seednode e -connect</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 uma versão mais recente do Bitcoin Core</translation>
+ <source>Loading addresses...</source>
+ <translation>A carregar os endereços...</translation>
</message>
<message>
- <source>Information</source>
- <translation>Informação</translation>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = guardar metadados da transacção ex: proprietário da conta e informação do pedido de pagamento, 2 = descartar metadados da transacção)</translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Quantia inválida para -minrelaytxfee=&lt;quantidade&gt;: '%s'</translation>
+ <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee está definido com um valor muito alto! Taxas desta magnitude podem ser pagas numa única transacção.</translation>
</message>
<message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Quantia inválida para -mintxfee=&lt;quantidade&gt;: '%s'</translation>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee está definido com um valor muito alto! Esta é a taxa que irá pagar se enviar uma transacção.</translation>
</message>
<message>
- <source>Send trace/debug info to console instead of debug.log file</source>
- <translation>Enviar informação de rastreio/depuração para a consola e não para o ficheiro debug.log</translation>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Não guardar transações no banco de memória por mais de &lt;n&gt; horas (predefinição: %u)</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>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Taxas (em %s/kB) abaixo deste valor são consideradas nulas para a criação de transacções (padrão: %s)</translation>
</message>
<message>
- <source>Signing transaction failed</source>
- <translation>Falhou assinatura da transação</translation>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Minuciosidade da verificação de blocos para -checkblocks é (0-4, padrão: %u)</translation>
</message>
<message>
- <source>Transaction amount too small</source>
- <translation>Quantia da transação é muito baixa</translation>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>Manter um índice de transacções completo, usado pela chamada RPC getrawtransaction (padrão: %u)</translation>
</message>
<message>
- <source>Transaction amounts must be positive</source>
- <translation>Quantia da transação deverá ser positiva</translation>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>Número de segundos a impedir que pares com comportamento indesejado se liguem de novo (padrão: %u)</translation>
</message>
<message>
- <source>Transaction too large</source>
- <translation>Transação grande demais</translation>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>Informação de depuração (padrão: %u, fornecer uma &lt;category&gt; é opcional)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Nome de utilizador para ligações JSON-RPC</translation>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Suportar filtragem de blocos e transacções com fitros bloom (padrão: %u)</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>A Carteira precisou de ser reescrita: reinicie o Bitcoin Core para completar o processo</translation>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>Comprimento total da entrada da versão de rede (%i) excede o comprimento máximo (%i). Reduzir o número ou o tamanho de uacomments.</translation>
</message>
<message>
- <source>Warning</source>
- <translation>Aviso</translation>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Tenta manter o tráfego externo abaixo do limite especificado (em MiB por 24h), 0 = sem limite (padrão: %d)</translation>
</message>
<message>
- <source>Zapping all transactions from wallet...</source>
- <translation>A limpar todas as transações da carteira...</translation>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Encontrado um argumento não suportado -socks. Definir a versão do SOCKS já não é possível, apenas proxies SOCKS5 são suportados.</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corrompido, recuperação falhou</translation>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Argumento não suportado -whitelistalwaysrelay ignorado, utilize -whitelistrelay e/ou -whitelistforcerelay.</translation>
</message>
<message>
- <source>Password for JSON-RPC connections</source>
- <translation>Palavra-passe para ligações JSON-RPC</translation>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Use um proxy SOCKS5 separado para alcançar pares via serviços ocultos do Tor (padrão: %s)</translation>
</message>
<message>
- <source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
- <translation>Executar comando quando o melhor bloco mudar (no comando, %s é substituído pela hash do bloco)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Username e hash da password para ligações JSON-RPC. O campo &lt;userpw&gt; está no formato: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Um script python está incluido em share/rpcuser. Esta opção pode ser especificada múltiplas vezes.</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Esta mensagem de ajuda</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Atenção: Versões desconhecidas de blocos estão a ser mineradas! É possível que regras desconhecias estão a ser efetuadas</translation>
</message>
<message>
- <source>Allow DNS lookups for -addnode, -seednode and -connect</source>
- <translation>Permitir procuras DNS para -addnode, -seednode e -connect</translation>
+ <source>(default: %s)</source>
+ <translation>(predefinição: %s)</translation>
</message>
<message>
- <source>Loading addresses...</source>
- <translation>A carregar endereços...</translation>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Utilizar sempre a consulta de DNS para endereços de pares (predefinição: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Erro ao carregar wallet.dat: Carteira danificada</translation>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>Quantos blocos para verificar no arranque (predefinição: %u, 0 = todos)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Erro ao carregar wallet.dat</translation>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>Incluir endereços de IP na informação de depuração (predefinição: %u)</translation>
</message>
<message>
<source>Invalid -proxy address: '%s'</source>
@@ -3014,7 +2349,7 @@
</message>
<message>
<source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
- <translation>Escutar por ligações JSON-RPC na porta &lt;port&gt; (por defeito: %u ou rede de testes: %u)</translation>
+ <translation>Escutar por ligações JSON-RPC na porta &lt;port&gt; (predefinição: %u ou rede de testes: %u)</translation>
</message>
<message>
<source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
@@ -3025,6 +2360,10 @@
<translation>Manter no máximo &lt;n&gt; ligações a outros nós da rede (por defeito: %u)</translation>
</message>
<message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>Colocar a carteira a transmitir transacções</translation>
+ </message>
+ <message>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
<translation>Maximo armazenamento intermédio de recepção por ligação, &lt;n&gt;*1000 bytes (por defeito: %u)</translation>
</message>
@@ -3037,8 +2376,16 @@
<translation>Adicionar data e hora à informação de depuração (por defeito: %u)</translation>
</message>
<message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Propagar e minerar transacções que incluem dados (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Propagar não P2SH multisig (predefinição: %u)</translation>
+ </message>
+ <message>
<source>Set key pool size to &lt;n&gt; (default: %u)</source>
- <translation>Definir o tamanho da memória de chaves para &lt;n&gt; (por defeito: %u)</translation>
+ <translation>Definir tamanho do banco de memória da chave para &lt;n&gt; (predefinição: %u)</translation>
</message>
<message>
<source>Set minimum block size in bytes (default: %u)</source>
@@ -3057,20 +2404,20 @@
<translation>Especificar tempo de espera da ligação em milissegundos (mínimo 1, por defeito: %d)</translation>
</message>
<message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation>Rede desconhecida especificada em -onlynet: '%s'</translation>
+ <source>Specify pid file (default: %s)</source>
+ <translation>Especificar ficheiro pid (padrão: %s)</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Não foi possível resolver o endereço -bind: '%s'</translation>
+ <source>Spend unconfirmed change when sending transactions (default: %u)</source>
+ <translation>Gastar troco não confirmado ao enviar transacções (padrão: %u)</translation>
</message>
<message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Não foi possível resolver o endereço -externalip: '%s'</translation>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>Tolerância para desligar nós com comportamento indesejável (padrão: %u)</translation>
</message>
<message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Quantia inválida para -paytxfee=&lt;amount&gt;: '%s'</translation>
+ <source>Unknown network specified in -onlynet: '%s'</source>
+ <translation>Rede desconhecida especificada em -onlynet: '%s'</translation>
</message>
<message>
<source>Insufficient funds</source>
@@ -3078,7 +2425,7 @@
</message>
<message>
<source>Loading block index...</source>
- <translation>A carregar índice de blocos...</translation>
+ <translation>A carregar o índice de blocos...</translation>
</message>
<message>
<source>Add a node to connect to and attempt to keep the connection open</source>
@@ -3086,7 +2433,7 @@
</message>
<message>
<source>Loading wallet...</source>
- <translation>A carregar carteira...</translation>
+ <translation>A carregar a carteira...</translation>
</message>
<message>
<source>Cannot downgrade wallet</source>
@@ -3102,7 +2449,7 @@
</message>
<message>
<source>Done loading</source>
- <translation>Carregamento completo</translation>
+ <translation>Carregamento concluído</translation>
</message>
<message>
<source>Error</source>
diff --git a/src/qt/locale/bitcoin_ro.ts b/src/qt/locale/bitcoin_ro.ts
new file mode 100644
index 0000000000..270a4ba062
--- /dev/null
+++ b/src/qt/locale/bitcoin_ro.ts
@@ -0,0 +1,136 @@
+<TS language="ro" version="2.1">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation>Click dreapta pentru a modifica adresa o eticheta</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation>Crează o nouă adresă</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>Nou</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>Copiază în notițe adresa selectată în prezent</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>Copiază</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>ÃŽnchide</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Șterge adresa curentă selectata din listă</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Exportă datele din tabul curent in fisier</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>Exportă</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>Șterge</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation>Secventa de cuvinte a parolei</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation>Introduceti parola</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation>Noua parolă</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Repetati noua parolă</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ </context>
+<context>
+ <name>Intro</name>
+ </context>
+<context>
+ <name>OpenURIDialog</name>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ </context>
+<context>
+ <name>QObject</name>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ </context>
+<context>
+ <name>SplashScreen</name>
+ </context>
+<context>
+ <name>TrafficGraphWidget</name>
+ </context>
+<context>
+ <name>TransactionDescDialog</name>
+ </context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ro_RO.ts b/src/qt/locale/bitcoin_ro_RO.ts
index c88908263a..489ed07639 100644
--- a/src/qt/locale/bitcoin_ro_RO.ts
+++ b/src/qt/locale/bitcoin_ro_RO.ts
@@ -26,10 +26,6 @@
<translation>ÃŽnchide</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Copiază adresa</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Şterge adresele curent selectate din listă</translation>
</message>
@@ -43,74 +39,7 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation>Åžterge</translation>
- </message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Alegeţi adresa unde vreţi să trimiteţi monezile</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Alegeţi adresa unde vreţi să primiţi monezile</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Alegeţi</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Adresa destinatarului</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <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 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 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>
- <translation>Copiază &amp;eticheta</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Editare</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportă listă de adrese</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fişier text cu valori separate prin virgulă (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Export nereuÅŸit</translation>
- </message>
- <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>
- <source>Label</source>
- <translation>Etichetă</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresă</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(fără etichetă)</translation>
+ <translation>&amp;Åžterge</translation>
</message>
</context>
<context>
@@ -131,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Repetaţi noua frază de acces</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Criptare portofel</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Această acţiune necesită fraza dvs. de acces pentru deblocarea portofelului.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Deblocare portofel</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Această acţiune necesită fraza dvs. de acces pentru decriptarea portofelului.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Decriptare portofel</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Schimbare frază de acces</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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 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>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 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>Atenţie! Caps Lock este pornit!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Portofel criptat</translation>
- </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>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 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 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>
- <translation>Frazele de acces introduse nu se potrivesc.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Deblocarea portofelului nu a reuÅŸit</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Fraza de acces introdusă pentru decriptarea portofelului a fost incorectă.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Decriptarea portofelului nu a reuÅŸit</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Netmask</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Parola portofelului electronic a fost schimbată.</translation>
+ <source>Banned Until</source>
+ <translation>Banat până la</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -298,14 +147,6 @@
<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>Import blocuri de pe disk...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Se reindexează blocurile pe disc...</translation>
</message>
@@ -350,10 +191,6 @@
<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>Arată/Ascunde</translation>
</message>
@@ -390,22 +227,10 @@
<translation>Bara de unelte</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucleul Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<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>Arată lista de adrese trimise şi etichetele folosite.</translation>
</message>
@@ -421,10 +246,6 @@
<source>&amp;Command-line options</source>
<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>
- </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>
@@ -537,17 +358,10 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Alertă reţea</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
- <translation>Selectarea monezii</translation>
+ <translation>Selectarea monedei</translation>
</message>
<message>
<source>Quantity:</source>
@@ -621,142 +435,6 @@
<source>Priority</source>
<translation>Prioritate</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Copiază adresa</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiază eticheta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiază suma</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiază ID tranzacţie</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Blocare necheltuiţi</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Deblocare necheltuiţi</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiază cantitea</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiază taxa</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiază după taxă</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiază octeţi</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiază prioritatea</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Copiază praf</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiază rest</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>cea mai mare</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>mai mare</translation>
- </message>
- <message>
- <source>high</source>
- <translation>mare</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medie-mare</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>medie</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>medie-scăzută</translation>
- </message>
- <message>
- <source>low</source>
- <translation>scazută</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>mai scăzută</translation>
- </message>
- <message>
- <source>lowest</source>
- <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>
- <message>
- <source>no</source>
- <translation>nu</translation>
- </message>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <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 sînt mai susceptibile de fi incluse într-un bloc.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(fără etichetă)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>restul de la %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(rest)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -780,38 +458,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresă</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Noua adresă de primire</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Noua adresă de trimitere</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Editează adresa de primire</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Editează adresa de trimitere</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Adresa introdusă "%1" se află deja în lista de adrese.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Adresa introdusă "%1" nu este o adresă bitcoin validă.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Portofelul nu a putut fi deblocat.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Generarea noii chei nu a reuÅŸit.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -839,10 +485,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucleul Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>versiunea</translation>
</message>
@@ -851,8 +493,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Despre Nucleul Bitcoin</translation>
+ <source>About %1</source>
+ <translation>Despre %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -866,20 +508,36 @@
<source>command-line options</source>
<translation>Opţiuni linie de comandă</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Bun venit</translation>
+ <source>UI Options:</source>
+ <translation>Opţiuni UI:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Alege dosarul de date la pornire (implicit: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Setează limba, de exemplu: "ro_RO" (implicit: sistem local)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Porniţi minimizat</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>Welcome to Bitcoin Core.</source>
- <translation>Bine aţi venit la Nucleul Bitcoin.</translation>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Afişează ecran splash la pornire (implicit: %u)</translation>
</message>
+ </context>
+<context>
+ <name>Intro</name>
<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>
+ <source>Welcome</source>
+ <translation>Bun venit</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -890,10 +548,6 @@
<translation>FoloseÅŸte un dosar de date personalizat:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <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>
@@ -928,10 +582,6 @@
<source>Select payment request file</source>
<translation>Selectaţi fişierul cerere de plată</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Selectaţi fişierul cerere de plată pentru deschidere</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -972,10 +622,6 @@
<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>
@@ -1000,10 +646,6 @@
<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>
@@ -1056,6 +698,18 @@
<translation>Portul proxy (de exemplu: 9050)</translation>
</message>
<message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Fereastră</translation>
</message>
@@ -1204,103 +858,16 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Gestionare URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <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>Suma cerută de plată de %1 este prea mică (considerată praf).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Eroare la cererea de plată</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <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>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>
- </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>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>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Plată acceptată</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Eroare în cererea de reţea</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
<translation>Agent utilizator</translation>
</message>
<message>
+ <source>Node/Service</source>
+ <translation>Nod/Serviciu</translation>
+ </message>
+ <message>
<source>Ping Time</source>
<translation>Timp ping</translation>
</message>
@@ -1345,31 +912,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Salvează imagine...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Copiază imaginea</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Salvează codul QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>Imagine de tip PNG (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Nume client</translation>
- </message>
- <message>
<source>N/A</source>
<translation>indisponibil</translation>
</message>
@@ -1390,10 +934,6 @@
<translation>General</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>FoloseÅŸte OpenSSL versiunea</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>FoloseÅŸte BerkeleyDB versiunea</translation>
</message>
@@ -1422,6 +962,14 @@
<translation>Numărul curent de blocuri</translation>
</message>
<message>
+ <source>Current number of transactions</source>
+ <translation>Numărul curent de tranzacţii</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Memorie folosită</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Recepţionat</translation>
</message>
@@ -1438,6 +986,10 @@
<translation>Selectaţi un partener pentru a vedea informaţiile detaliate.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Whitelisted</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Direcţie</translation>
</message>
@@ -1446,6 +998,18 @@
<translation>Versiune</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Bloc de început</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Headere Sincronizate</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Blocuri Sincronizate</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Agent utilizator</translation>
</message>
@@ -1502,10 +1066,6 @@
<translation>IeÅŸire:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Construit la data</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>FiÅŸier jurnal depanare</translation>
</message>
@@ -1514,8 +1074,24 @@
<translation>Curăţă consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Bun venit la consola Nucleului Bitcoin RPC.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Deconectare nod</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;oră</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;zi</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;săptămână</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;an</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>
@@ -1558,6 +1134,14 @@
<translation>IeÅŸire</translation>
</message>
<message>
+ <source>Yes</source>
+ <translation>Da</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Nu</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation>Necunoscut</translation>
</message>
@@ -1632,18 +1216,6 @@
<source>Remove</source>
<translation>Înlătură</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Copiază eticheta</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Copiază mesajul</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiază suma</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1663,73 +1235,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Salvează imaginea...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Cere plata pentru %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informaţiile plăţii</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresă</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Sumă</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etichetă</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaj</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <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>
- <translation>Eroare la codarea URl-ului în cod QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etichetă</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaj</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Sumă</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(fără etichetă)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(nici un mesaj)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(sumă nulă)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1830,14 +1335,6 @@
<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>
</message>
@@ -1869,98 +1366,6 @@
<source>S&amp;end</source>
<translation>Trimit&amp;e</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Confirmă trimiterea de monede</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 la %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Copiază cantitea</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiază suma</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Copiază taxa</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Copiază după taxă</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Copiază octeţi</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Copiază prioritatea</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Copiază rest</translation>
- </message>
- <message>
- <source>or</source>
- <translation>sau</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>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <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 taxei de %1.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <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>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>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>Atenţie: Adresa bitcoin nevalidă!</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(fără etichetă)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <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>Sigur doriţi să trimiteţi?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>adăugat ca taxă de tranzacţie</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1973,10 +1378,6 @@
<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>Introduceţi o etichetă pentru această adresă pentru a fi adăugată în lista dvs. de adrese</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etichetă:</translation>
</message>
@@ -2032,8 +1433,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Nucleul Bitcoin se închide...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 se închide</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2118,70 +1519,10 @@
<source>Reset all verify message fields</source>
<translation>Resetează toate cîmpurile mesajelor semnate</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Faceţi clic pe "Semneaza msaj" pentru a genera semnătura</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Adresa introdusă nu este validă</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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 introdusă nu se referă la o cheie.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Blocarea portofelului a fost întreruptă.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Cheia privată pentru adresa introdusă nu este validă.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Semnarea mesajului nu a reuÅŸit.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mesaj semnat.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Această semnatură nu a putut fi decodată.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <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 se potriveÅŸte cu mesajul.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Verificarea mesajului nu a reuÅŸit.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mesaj verificat.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Nucleul Bitcoin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Dezvoltatorii Nucleului Bitcoin</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2194,406 +1535,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Deschis pînă la %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>în conflict</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/deconectat</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/neconfirmat</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 confirmări</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Stare</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, distribuit prin %n nod</numerusform><numerusform>, distribuit prin %n noduri</numerusform><numerusform>, distribuit prin %n de noduri</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Sursa</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generat</translation>
- </message>
- <message>
- <source>From</source>
- <translation>De la</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Către</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>adresa proprie</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>doar-supraveghere</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etichetă</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Credit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>se maturizează în încă %n bloc</numerusform><numerusform>se maturizează în încă %n blocuri</numerusform><numerusform>se maturizează în încă %n de blocuri</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <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>Taxă tranzacţie</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Suma netă</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaj</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Comentariu</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID-ul tranzacţie</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Comerciant</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>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>Informaţii pentru depanare</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Tranzacţie</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Intrări</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Sumă</translation>
- </message>
- <message>
- <source>true</source>
- <translation>adevărat</translation>
- </message>
- <message>
- <source>false</source>
- <translation>fals</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, nu s-a propagat încă</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>necunoscut</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detaliile tranzacţiei</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Acest panou arată o descriere detaliată a tranzacţiei</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tip</translation>
- </message>
- <message>
- <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>
- <translation>Deschis până la %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Confirmat (%1 confirmări)</translation>
- </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 nici un alt nod şi probabil nu va fi acceptat!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generat dar neacceptat</translation>
- </message>
- <message>
- <source>Offline</source>
- <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 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>
- </message>
- <message>
- <source>Received from</source>
- <translation>Primit de la</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Trimis către</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Plată către dvs.</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minerit</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>doar-supraveghere</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>indisponibil</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <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>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tipul tranzacţiei.</translation>
- </message>
- <message>
- <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>
- <translation>Suma extrasă sau adăugată la sold.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Toate</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Astăzi</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Săptămîna aceasta</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Luna aceasta</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Luna trecută</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Anul acesta</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Interval...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Recepţionat cu</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Trimis către</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Către dvs.</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minerit</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Altele</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Introduceţi adresa sau eticheta pentru căutare</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Suma minimă</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Copiază adresa</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Copiază eticheta</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Copiază suma</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Copiază ID tranzacţie</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Editează eticheta</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Arată detaliile tranzacţiei</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Export istoric tranzacţii</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Doar-supraveghere</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <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 la salvarea istoricului tranzacţiilor la %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Export reuÅŸit</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Istoricul tranzacţiilor a fost salvat cu succes la %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Fişier text cu valori separate prin virgulă (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Confirmat</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tip</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etichetă</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresă</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Interval:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>către</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2601,55 +1549,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Nu a fost încărcat nici un portofel.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Trimitere bitcoin</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Export</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportă datele din tab-ul curent într-un fişier</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Copie de siguranţă portofel</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Date portofel (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <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 la salvarea datelor portofelului la %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Datele portofelului s-au salvat cu succes la %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Copie de siguranţă efectuată cu succes</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2680,6 +1579,10 @@
<translation>Acceptă conexiuni din afară (implicit: 1 dacă nu se foloseşte -proxy sau -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Nucleul Bitcoin</translation>
+ </message>
+ <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Ataşaţi adresei date şi ascultaţi totdeauna pe ea. Folosiţi notaţia [host]:port pentru IPv6</translation>
</message>
@@ -2700,10 +1603,6 @@
<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: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Atenţie: Reţeaua nu pare să fie de acord în totalitate! Aparent nişte mineri au probleme.</translation>
</message>
@@ -2712,10 +1611,6 @@
<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: 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>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>&lt;category&gt; can be:</source>
<translation>&lt;category&gt; poate fi:</translation>
</message>
@@ -2824,18 +1719,10 @@
<translation>Opţiuni portofel:</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Trebuie să reconstruiţi baza de date folosind -reindex pentru a schimba -txindex</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>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>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>
@@ -2848,16 +1735,20 @@
<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>(default: %u)</source>
+ <translation>(implicit: %u)</translation>
+ </message>
+ <message>
<source>Accept public REST requests (default: %u)</source>
<translation>Acceptă cererile publice REST (implicit: %u)</translation>
</message>
<message>
- <source>Connect through SOCKS5 proxy</source>
- <translation>Conectare prin proxy SOCKS5</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Crează automat un serviciu Tor ascuns (implicit: %d)</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Dezvoltatorii Bitcoin</translation>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>Conectare prin proxy SOCKS5</translation>
</message>
<message>
<source>Error reading from database, shutting down.</source>
@@ -2868,22 +1759,6 @@
<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>Sumă nevalidă pentru -minrelaytxfee=&lt;suma&gt;:'%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <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>
@@ -2948,10 +1823,6 @@
<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>Avertisment</translation>
</message>
@@ -2960,10 +1831,6 @@
<translation>Şterge toate tranzacţiile din portofel...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corupt, salvare nereuşită</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Parola pentru conexiunile JSON-RPC</translation>
</message>
@@ -2972,10 +1839,6 @@
<translation>Execută comanda cînd cel mai bun bloc se modifică (%s în cmd este înlocuit cu hash-ul blocului)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Acest mesaj de ajutor</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Permite căutări DNS pentru -addnode, -seednode şi -connect</translation>
</message>
@@ -2984,10 +1847,6 @@
<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>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>
@@ -2996,14 +1855,6 @@
<translation>(implicit: %s)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Eroare la încărcarea wallet.dat</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>
@@ -3028,18 +1879,6 @@
<translation>Reţeaua specificată în -onlynet este necunoscută: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Nu se poate rezolva adresa -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Nu se poate rezolva adresa -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Suma nevalidă pentru -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fonduri insuficiente</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts
index ea577694ac..60f5d5dfa2 100644
--- a/src/qt/locale/bitcoin_ru.ts
+++ b/src/qt/locale/bitcoin_ru.ts
@@ -26,10 +26,6 @@
<translation>&amp;Закрыть</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Копировать адреÑ</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Удалить выбранный Ð°Ð´Ñ€ÐµÑ Ð¸Ð· ÑпиÑка</translation>
</message>
@@ -45,69 +41,6 @@
<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>&amp;Выбрать</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>Это ваши адреÑа 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>Это ваши адреÑа Bitcoin Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ‘Ð¼Ð° платежей. РекомендуетÑÑ Ð¸Ñпользовать новый Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ транзакции.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Копировать &amp;метку</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Правка</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>ЭкÑпортировать ÑпиÑок адреÑов</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>ТекÑÑ‚, разделённый запÑтыми (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ЭкÑпорт не удалÑÑ</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Метка</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>[нет метки]</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -127,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Повторите новый пароль</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Зашифровать бумажник</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ требуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ вашего бумажника.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Разблокировать бумажник</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ требуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ вашего бумажника.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>РаÑшифровать бумажник</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Сменить пароль</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Внимание: Caps Lock включен!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Бумажник зашифрован</translation>
- </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>Введите новый пароль бумажника.&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>
- <translation>Ðе удалоÑÑŒ зашифровать бумажник</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Шифрование бумажника не удалоÑÑŒ из-за внутренней ошибки. Ваш бумажник не был зашифрован.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Введённые пароли не Ñовпадают.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Разблокировка бумажника не удалаÑÑŒ</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Указанный пароль не подходит.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>РаÑшифрование бумажника не удалоÑÑŒ</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Пароль бумажника уÑпешно изменён.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -266,6 +111,14 @@
<translation>Закрыть приложение</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;О %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Показать информацию о %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>О &amp;Qt</translation>
</message>
@@ -278,6 +131,10 @@
<translation>&amp;Параметры</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Изменить конфигурационные наÑтройки Ð´Ð»Ñ %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>&amp;Зашифровать бумажник...</translation>
</message>
@@ -302,14 +159,6 @@
<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>
@@ -354,10 +203,6 @@
<translation>&amp;Получить</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>
@@ -394,22 +239,10 @@
<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-коды и bitcoin: ÑÑылки)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;О 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>
@@ -425,15 +258,19 @@
<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>Показать помощь по 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><numerusform>%n активных Ñоединений Ñ Ñетью Bitcoin</numerusform><numerusform>%n активных Ñоединений Ñ Ñетью Bitcoin</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>ИндекÑÐ°Ñ†Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð² на диÑке...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Обработка блоков на диÑке...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>ИÑточник блоков недоÑтупен...</translation>
</message>
@@ -490,6 +327,10 @@
<translation>Синхронизировано</translation>
</message>
<message>
+ <source>%1 client</source>
+ <translation>%1 клиент</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>СинхронизируетÑÑ...</translation>
</message>
@@ -541,13 +382,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ Ð¢Ñ€ÐµÐ²Ð¾Ð³Ð°</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -625,150 +459,6 @@
<source>Priority</source>
<translation>Приоритет</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Копировать адреÑ</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Копировать метку</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>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 Ñатоши на вход.</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>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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>Ñдача Ñ %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(размен)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -792,38 +482,6 @@
<source>&amp;Address</source>
<translation>&amp;ÐдреÑ</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Ðовый Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Ðовый Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Изменение адреÑа Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Изменение адреÑа Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Введённый Ð°Ð´Ñ€ÐµÑ Â«%1» уже находитÑÑ Ð² адреÑной книге.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Введённый Ð°Ð´Ñ€ÐµÑ "%1" не ÑвлÑетÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼ Bitcoin-адреÑом.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ðе удаетÑÑ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ бумажник.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ключа не удалаÑÑŒ.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -851,10 +509,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>верÑиÑ</translation>
</message>
@@ -863,8 +517,8 @@
<translation>(%1-бит)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>О Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>О %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -878,6 +532,34 @@
<source>command-line options</source>
<translation>параметры командной Ñтроки</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>ÐаÑтройки интерфейÑа:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Выбрать каталог данных при запуÑке (по умолчанию: %u)</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: %u)</source>
+ <translation>Показывать Ñкран-заÑтавку при запуÑке (по умолчанию: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>СброÑить вÑе наÑтройки, измененные в графичеÑком интерфейÑе</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -886,16 +568,16 @@
<translation>Добро пожаловать</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Добро пожаловать в Bitcoin Core.</translation>
+ <source>Welcome to %1.</source>
+ <translation>Добро пожаловать в %1</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>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>При первом запуÑке программы вы можете выбрать где %1 будет хранить Ñвои данные.</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>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 Ñкачает и Ñохранит копию цепи блоков. Как минимум %2GB будут запиÑаны в Ñтот каталог, и Ñо временем он будет раÑти. Бумажник также будет Ñохранен в Ñтом каталоге.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -906,10 +588,6 @@
<translation>ИÑпользовать другой каталог данных:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Ошибка: не удалоÑÑŒ Ñоздать указанный каталог данных "%1".</translation>
</message>
@@ -944,10 +622,6 @@
<source>Select payment request file</source>
<translation>Выбрать файл запроÑа платежа</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Выберите файл запроÑа платежа</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -960,6 +634,14 @@
<translation>&amp;ГлавнаÑ</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>ÐвтоматичеÑки запуÑкать %1 поÑле входа в ÑиÑтему.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;ЗапуÑкать %1 при входе в ÑиÑтему</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>Размер кÑша &amp;БД</translation>
</message>
@@ -988,10 +670,6 @@
<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 (например, block explorer), которые отображаютÑÑ Ð½Ð° вкладке транзакций как пункты контекÑтного меню. %s в URL заменÑетÑÑ Ñ…Ñшем транзакции. URL отделÑÑŽÑ‚ÑÑ Ð´Ñ€ÑƒÐ³ от друга вертикальной чертой |.</translation>
</message>
@@ -1016,14 +694,6 @@
<translation>&amp;Сеть</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>&amp;ЗапуÑкать Bitcoin Core при входе в ÑиÑтему</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = автоматичеÑки, &lt;0 = оÑтавить Ñтолько незагруженных Ñдер)</translation>
</message>
@@ -1108,6 +778,14 @@
<translation>&amp;Окно</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Скрыть иконку из ÑиÑтемного треÑ.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Скрыть иконку в трее</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Показывать только иконку в ÑиÑтемном лотке поÑле ÑÐ²Ð¾Ñ€Ð°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÐºÐ½Ð°.</translation>
</message>
@@ -1128,6 +806,10 @@
<translation>&amp;Язык интерфейÑа:</translation>
</message>
<message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation>ЗдеÑÑŒ можно уÑтановить Ñзык пользовательÑкого интерфейÑа. ÐаÑтройки вÑтупÑÑ‚ в Ñилу поÑле перезагрузки %1</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Отображать Ñуммы в единицах: </translation>
</message>
@@ -1252,97 +934,6 @@
</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>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>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить bitcoin: обработчик click-to-pay</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>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>
- <message>
- <source>Network request error</source>
- <translation>Ошибка Ñетевого запроÑа</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1397,31 +988,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <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>
- <source>Client name</source>
- <translation>Ð˜Ð¼Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Ð/Д</translation>
</message>
@@ -1442,14 +1010,14 @@
<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>Datadir</source>
+ <translation>Каталог Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка</translation>
</message>
@@ -1474,8 +1042,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>Пул памÑти</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Текущее чиÑло транзакций</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>ИÑпользование памÑти</translation>
</message>
<message>
<source>Received</source>
@@ -1526,6 +1102,18 @@
<translation>Юзер-агент</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Открыть отладочный лог-файл %1 из текущего каталога данных. Это может занÑÑ‚ÑŒ неÑколько Ñекунд Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… лог-файлов.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Уменьшить размер текÑта</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Увеличить размер текÑта</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>СервиÑÑ‹</translation>
</message>
@@ -1594,10 +1182,6 @@
<translation>Выход:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Дата Ñборки</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Отладочный лог-файл</translation>
</message>
@@ -1634,8 +1218,8 @@
<translation>&amp;Разблокировать узел</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Добро пожаловать в RPC-конÑоль Bitcoin Core.</translation>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Добро пожаловать в конÑоль RPC %1.</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>
@@ -1764,18 +1348,6 @@
<source>Remove</source>
<translation>Удалить</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Копировать метку</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Копировать Ñообщение</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Скопировать Ñумму</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1795,73 +1367,6 @@
<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>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сумма</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Метка</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Сообщение</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>ПолучившийÑÑ URI Ñлишком длинный, попробуйте Ñократить текÑÑ‚ метки / ÑообщениÑ.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Ошибка ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ URI в QR-код</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Метка</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Сообщение</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сумма</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>[нет метки]</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(нет ÑообщениÑ)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(нет Ñуммы)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1982,14 +1487,6 @@
<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>
@@ -2021,110 +1518,6 @@
<source>S&amp;end</source>
<translation>&amp;Отправить</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Подтвердите отправку монет</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>С %1 на %2</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>Copy change</source>
- <translation>Копировать размен</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>ÐžÐ±Ñ‰Ð°Ñ Ñумма %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>или</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Сумма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ должно быть больше 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <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>
- </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>
- <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>
- <message>
- <source>added as transaction fee</source>
- <translation>добавлено как комиÑÑиÑ</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2137,10 +1530,6 @@
<translation>Полу&amp;чатель:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Введите метку Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ адреÑа (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² адреÑную книгу)</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Метка:</translation>
</message>
@@ -2212,8 +1601,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core выключаетÑÑ...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 выключаетÑÑ...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2306,70 +1695,10 @@
<source>Reset all verify message fields</source>
<translation>СброÑить вÑе Ð¿Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑообщениÑ</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Ðажмите "ПодпиÑать Ñообщение" Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Введённый Ð°Ð´Ñ€ÐµÑ Ð½ÐµÐ²ÐµÑ€ÐµÐ½</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Ðе удалоÑÑŒ подпиÑать Ñообщение</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Сообщение подпиÑано</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>ПодпиÑÑŒ не может быть раÑкодирована.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>ПожалуйÑта, проверьте подпиÑÑŒ и попробуйте ещё раз.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>ПодпиÑÑŒ не ÑоответÑтвует отпечатку ÑообщениÑ.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Проверка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ удалаÑÑŒ.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Сообщение проверено.</translation>
- </message>
</context>
<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>
- <message>
<source>[testnet]</source>
<translation>[теÑÑ‚Ð¾Ð²Ð°Ñ Ñеть]</translation>
</message>
@@ -2382,418 +1711,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Открыто до %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>в противоречии</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/отключен</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/не подтверждено</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 подтверждений</translation>
- </message>
- <message>
- <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><numerusform>, разоÑлано через %n узлов</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>ИÑточник</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Сгенерированно</translation>
- </message>
- <message>
- <source>From</source>
- <translation>От</translation>
- </message>
- <message>
- <source>To</source>
- <translation>ДлÑ</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>Ñвой адреÑ</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>только наблюдение</translation>
- </message>
- <message>
- <source>label</source>
- <translation>метка</translation>
- </message>
- <message>
- <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><numerusform>будет доÑтупно через %n блоков</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>не принÑто</translation>
- </message>
- <message>
- <source>Debit</source>
- <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>
- <message>
- <source>Net amount</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>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>ТранзакциÑ</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Входы</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Сумма</translation>
- </message>
- <message>
- <source>true</source>
- <translation>иÑтина</translation>
- </message>
- <message>
- <source>false</source>
- <translation>ложь</translation>
- </message>
- <message>
- <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><numerusform>Открыто Ð´Ð»Ñ ÐµÑ‰Ñ‘ %n блоков</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>неизвеÑтно</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Детали транзакции</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Эта панель отображает детальное опиÑание транзакции.</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Type</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><numerusform>Открыто Ð´Ð»Ñ ÐµÑ‰Ñ‘ %n блоков</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Открыто до %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Подтверждено (%1 подтверждений)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Этот блок не был получен другими узлами и, возможно, не будет принÑÑ‚!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Сгенерированно, но не подтверждено</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Ðет активных Ñоединений Ñ Ñетью</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Метка</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Ðеподтверждено</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>В противоречии</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Получено</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Получено от</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Отправлено</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Отправлено Ñебе</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Добыто</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>только наблюдение</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>[не доÑтупно]</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸. Подведите курÑор к нужному полю Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы увидеть количеÑтво подтверждений.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Дата и времÑ, когда Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð±Ñ‹Ð»Ð° получена.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Тип транзакции.</translation>
- </message>
- <message>
- <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>
- <translation>Сумма, добавленнаÑ, или ÑнÑÑ‚Ð°Ñ Ñ Ð±Ð°Ð»Ð°Ð½Ñа.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Ð’Ñе</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>СегоднÑ</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Ðа Ñтой неделе</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Ð’ Ñтом меÑÑце</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Ð’ прошлом меÑÑце</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Ð’ Ñтом году</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Промежуток...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Получено на</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Отправлено на</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Отправленные Ñебе</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Добытые</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Другое</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Введите Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ метку Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Мин. Ñумма</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Копировать адреÑ</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Копировать метку</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Скопировать Ñумму</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Скопировать ID транзакции</translation>
- </message>
- <message>
- <source>Copy raw transaction</source>
- <translation>Скопировать иÑходную транзакции</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Изменить метку</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Показать подробноÑти транзакции</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>ЭкÑпортировать иÑторию транзакций</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Ð”Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ЭкÑпорт не удалÑÑ</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Произошла ошибка при Ñохранении иÑтории транзакций в %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>Подтверждено</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тип</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Метка</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑ</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Промежуток от:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>до</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2801,55 +1725,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Ðе был загружен ни один бумажник.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Отправка</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;ЭкÑпорт</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>ЭкÑпортировать данные из вкладки в файл</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Сделать резервную копию бумажника</translation>
- </message>
- <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>
<source>Options:</source>
@@ -2876,14 +1751,6 @@
<translation>ЕÑли &lt;category&gt; не предоÑтавлена или равна 1, выводить вÑÑŽ отладочную информацию.</translation>
</message>
<message>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
- <translation>МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма комиÑÑий (%s) Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ транзакции в бумажнике; Ñлишком низкое значение может вызвать прерывание больших транзакций (по умолчанию: %s)</translation>
- </message>
- <message>
- <source>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>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation>Удаление блоков выÑтавлено ниже, чем минимум в %d Мб. ПожалуйÑта, иÑпользуйте большее значение.</translation>
</message>
@@ -2924,10 +1791,26 @@
<translation>Принимать Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð²Ð½Ðµ (по умолчанию: 1, еÑли не иÑпользуетÑÑ -proxy или -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>The %s developers</source>
+ <translation>Разработчики %s</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>УÑтановлено очень большое значение -fallbackfee! Это комиÑÑÐ¸Ñ Ð·Ð° транзацию, которую вы можете заплатить, еÑли оценка размера комиÑÑии не доÑтупна. </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>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>Ðевозможно заблокировать каталог данных %s. %s возможно уже работает.</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>
@@ -2936,10 +1819,22 @@
<translation>РаÑпроÑтранÑетÑÑ Ð¿Ð¾Ð´ лицензией MIT, Ñм. приложенный файл COPYING или &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ %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>
<message>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Ð’Ñегда разрешать транзакции, полученные от учаÑтников из белого ÑпиÑка (по умолчанию: %d)</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>ПожалуйÑта убедитеÑÑŒ в корректноÑти уÑтановки времени и даты на вашем компьютере! ЕÑли Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановлено неверно, %s не будет работать правильно.</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>
@@ -2952,22 +1847,10 @@
<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>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>ИÑпользовать UPnP Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð±Ñ€Ð¾Ñа порта (по умолчанию: 1, еÑли иÑпользуетÑÑ Ð¿Ñ€Ð¾Ñлушивание и нет -proxy)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>Ð’ÐИМÐÐИЕ: Ñгенерировано ненормально большое чиÑло блоков, %d блоков получено за поÑледние %d чаÑов (ожидалоÑÑŒ %d)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>Ð’ÐИМÐÐИЕ: проверьте Ñетевое подключение, получено %d блоков за поÑледние %d чаÑов (ожидалоÑÑŒ %d)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Внимание: похоже, в Ñети нет полного ÑоглаÑиÑ! Ðекоторый майнеры, возможно, иÑпытывают проблемы.</translation>
</message>
@@ -2976,14 +1859,14 @@
<translation>Внимание: мы не полноÑтью ÑоглаÑны Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼Ð¸ учаÑтниками! Вам или другим учаÑтникам, возможно, Ñледует обновитьÑÑ.</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>Внимание: 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>%s corrupt, salvage failed</source>
+ <translation>%s поврежден, воÑÑтановить не удалоÑÑŒ</translation>
+ </message>
+ <message>
<source>-maxmempool must be at least %d MB</source>
<translation>-maxmempool должен быть как минимум %d MB</translation>
</message>
@@ -2992,6 +1875,14 @@
<translation>&lt;category&gt; может быть:</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>Добавить комментарий к Ñтроке пользовательÑкого агента</translation>
+ </message>
+ <message>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>ПопытатьÑÑ Ð²Ð¾ÑÑтановить приватные ключи из повреждённого бумажника при запуÑке</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Параметры ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²:</translation>
</message>
@@ -3004,6 +1895,10 @@
<translation>Параметры подключениÑ:</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Copyright (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>БД блоков повреждена</translation>
</message>
@@ -3044,6 +1939,18 @@
<translation>Ошибка инициализации Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð‘Ð” бумажника %s!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>Ошибка загрузки %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Ошибка загрузки %s: Бумажник поврежден</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Ошибка загрузки %s: Ð”Ð»Ñ Ð±ÑƒÐ¼Ð°Ð¶Ð½Ð¸ÐºÐ° требуетÑÑ Ð±Ð¾Ð»ÐµÐµ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных блоков</translation>
</message>
@@ -3072,10 +1979,22 @@
<translation>Ðеверный -onion адреÑ: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñумма Ð´Ð»Ñ -%s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
<translation>СбраÑывать транзакции из памÑти на диÑк каждые &lt;n&gt; мегабайт (по умолчанию: %u)</translation>
</message>
<message>
+ <source>Loading banlist...</source>
+ <translation>Загрузка банлиÑта...</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>РаÑположение куки входы(по умолчанию: data dir)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>ÐедоÑтаточно файловых деÑкрипторов.</translation>
</message>
@@ -3084,6 +2003,14 @@
<translation>СоединÑÑ‚ÑŒÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ по Ñети &lt;net&gt; (ipv4, ipv6 или onion)</translation>
</message>
<message>
+ <source>Print this help message and exit</source>
+ <translation>ВывеÑти Ñту Ñправку и выйти</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>ÐапиÑать верÑию и выйти</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>Удаление блоков не может иÑпользовать отрицательное значение.</translation>
</message>
@@ -3092,10 +2019,18 @@
<translation>Режим ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð² неÑовмеÑтим Ñ -txindex.</translation>
</message>
<message>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>ПереÑтроить Ð¸Ð½Ð´ÐµÐºÑ Ñ†ÐµÐ¿Ð¸ из текущих индекÑированных блоков</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 cost (default: %d)</source>
+ <translation>Задать макÑимальную ÑтоимоÑÑ‚ÑŒ блока (по умолчанию: %d)</translation>
+ </message>
+ <message>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>Задать макÑимальный размер блока в байтах (по умолчанию: %d)</translation>
</message>
@@ -3104,6 +2039,14 @@
<translation>Укажите файл бумажника (внутри каталога данных)</translation>
</message>
<message>
+ <source>The source code is available from %s.</source>
+ <translation>ИÑходный код доÑтупен в %s.</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>Ðевозможно привÑзатьÑÑ Ðº %s на Ñтом компьютере. Возможно, %s уже работает.</translation>
+ </message>
+ <message>
<source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Ðеподдерживаемый аргумент -benchmark проигнорирован, иÑпользуйте -debug=bench.</translation>
</message>
@@ -3136,16 +2079,16 @@
<translation>Бумажник %s раÑполагаетÑÑ Ð²Ð½Ðµ каталога данных %s</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>ÐаÑтройки бумажника:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Параметры отладки/теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ¼Ð°Ð¶Ð½Ð¸ÐºÐ°:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Внимание: Ñта верÑÐ¸Ñ ÑƒÑтарела; требуетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ!</translation>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>Ðеобходимо перезапиÑать бумажник, перезапуÑтите %s Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸.</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Вам необходимо переÑобрать базы данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -reindex, чтобы изменить -txindex</translation>
+ <source>Wallet options:</source>
+ <translation>ÐаÑтройки бумажника:</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>
@@ -3160,10 +2103,6 @@
<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. Возможно, 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>
@@ -3208,10 +2147,6 @@
<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>
@@ -3236,38 +2171,14 @@
<translation>Принимать публичные REST-запроÑÑ‹ (по умолчанию: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>ÐктивируетÑÑ Ð»ÑƒÑ‡ÑˆÐ°Ñ Ñ†ÐµÐ¿ÑŒ...</translation>
- </message>
- <message>
- <source>Always relay transactions received from whitelisted peers (default: %d)</source>
- <translation>Ð’Ñегда транÑлировать транзакции, полученные из белого ÑпиÑка учаÑтников (по умолчанию: %d)</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>ПопытатьÑÑ Ð²Ð¾ÑÑтановить приватные ключи из повреждённого wallet.dat при запуÑке</translation>
- </message>
- <message>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation>ÐвтоматичеÑки Ñоздавать Ñкрытый Tor ÑÐµÑ€Ð²Ð¸Ñ (по умолчанию: %d)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Ðе удаётÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ Ð°Ð´Ñ€ÐµÑ Ð² параметре -whitebind: '%s'</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>Ð’Ñе права защищены © 2009-%i Разработчики Bitcoin Core</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>
@@ -3280,22 +2191,6 @@
<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;кол-во&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñумма в параметре -mintxfee=&lt;кол-во&gt;: '%s'</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Ðеверное количеÑтво в параметре -paytxfee=&lt;кол-во&gt;: '%s' (должно быть как минимум %s)</translation>
</message>
@@ -3320,14 +2215,6 @@
<translation>Параметры Ñервера RPC:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>ПереÑтроить при запуÑке Ð¸Ð½Ð´ÐµÐºÑ Ñ†ÐµÐ¿Ð¸ блоков из текущих файлов blk000??.dat</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Получать и отображать P2P Ñетевые тревоги (по умолчанию: %u)</translation>
- </message>
- <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation>Уменьшите -maxconnections Ñ %d до %d, из-за ограничений ÑиÑтемы.</translation>
</message>
@@ -3400,14 +2287,14 @@
<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: unknown new rules activated (versionbit %i)</source>
+ <translation>Внимание: неизвеÑтные правила вÑтупили в Ñилу(versionbit %i)</translation>
+ </message>
+ <message>
<source>Whether to operate in a blocks only mode (default: %u)</source>
<translation>Будет работать в режиме только блоков (по умолчанию: %u)</translation>
</message>
@@ -3420,10 +2307,6 @@
<translation>ZeroMQ параметры оповещениÑ:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat повреждён, ÑпаÑение данных не удалоÑÑŒ</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Пароль Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ JSON-RPC</translation>
</message>
@@ -3432,10 +2315,6 @@
<translation>Выполнить команду, когда поÑвлÑетÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ блок (%s в команде заменÑетÑÑ Ð½Ð° Ñ…Ñш блока)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Эта Ñправка</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Разрешить поиÑк в DNS Ð´Ð»Ñ -addnode, -seednode и -connect</translation>
</message>
@@ -3444,10 +2323,6 @@
<translation>Загрузка адреÑов...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
@@ -3464,8 +2339,8 @@
<translation>Ðе хранить транзакции в памÑти дольше, чем &lt;n&gt; чаÑов (по умолчанию %u)</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ wallet.dat! Ð’Ñе ключи прочитаны верно, но данные транзакций или запиÑи адреÑной книги могут отÑутÑтвовать или быть неправильными.</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>КомиÑÑии (в %s/Кб) меньшие Ñтого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑчитаютÑÑ Ð½ÑƒÐ»ÐµÐ²Ñ‹Ð¼Ð¸ при Ñоздании транзакций (по умолчанию: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3484,6 +2359,10 @@
<translation>Выводить отладочную информацию (по умолчанию: %u, указание &lt;category&gt; необÑзательно)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Поддерживать фильтрацию блоков и транзакций Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ фильтра Блума (по умолчанию: %u)</translation>
+ </message>
+ <message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<translation>Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñтроки верÑии Ñети (%i) превышает макÑимальную длину (%i). УвеливаетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво или размер uacomments.</translation>
</message>
@@ -3500,20 +2379,24 @@
<translation>ИÑпользовать отдельный прокÑи SOCKS5 Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑƒÑ‡Ð°Ñтниками через Ñкрытые ÑервиÑÑ‹ Tor (по умолчанию: %s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(по умолчанию: %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ Ñ…Ñш Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ JSON-RPC Ñоединений. Поле &lt;userpw&gt; иÑпользует формат: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Каноничный пример Ñкрипта на питоне включен в "share/rpcuser". Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть указана неÑколько раз</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Ð’Ñегда запрашивать адреÑа учаÑтников Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ DNS (по умолчанию: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Внимание: Получена неизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ°! Возможно неизвеÑтные правила вÑтупили в Ñилу.</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Ошибка при загрузке wallet.dat</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Внимание: Файл бумажника поврежден, данные воÑÑтановлены! Оригинальный %s Ñохранен как %s в %s; ЕÑли Ð±Ð°Ð»Ð°Ð½Ñ Ð¸Ð»Ð¸ транзакции некорректны, вы должны воÑÑтановить файл из резервной копии.</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Включить добычу монет (по умолчанию: %u)</translation>
+ <source>(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>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3568,6 +2451,10 @@
<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>
@@ -3596,18 +2483,6 @@
<translation>Ð’ параметре -onlynet указана неизвеÑÑ‚Ð½Ð°Ñ Ñеть: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Ðе удаётÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ Ð°Ð´Ñ€ÐµÑ Ð² параметре -bind: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Ðе удаётÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ Ð°Ð´Ñ€ÐµÑ Ð² параметре -externalip: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñумма в параметре -paytxfee=&lt;кол-во&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>ÐедоÑтаточно монет</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ru_RU.ts b/src/qt/locale/bitcoin_ru_RU.ts
index fa42dfaaad..66419728e2 100644
--- a/src/qt/locale/bitcoin_ru_RU.ts
+++ b/src/qt/locale/bitcoin_ru_RU.ts
@@ -1,21 +1,62 @@
<TS language="ru_RU" version="2.1">
<context>
<name>AddressBookPage</name>
- </context>
-<context>
- <name>AddressTableModel</name>
- </context>
+ <message>
+ <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>Copy the currently selected address to the system clipboardый Ð°Ð´Ñ€ÐµÑ Ð² буфер</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>Копировать</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Удалить выбранный Ð°Ð´Ñ€ÐµÑ Ð¸Ð· ÑпиÑка</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>ЭкÑпортировать данные текущей вкладки в файл</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>ЭкÑпортировать</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>Удалить</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
- </context>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Повторите новый пароль</translation>
+ </message>
+</context>
<context>
<name>BanTableModel</name>
</context>
<context>
<name>BitcoinGUI</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <source>&amp;Command-line options</source>
+ <translation>Опции командной Ñтроки</translation>
</message>
<message>
<source>Error</source>
@@ -31,9 +72,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Date</source>
@@ -47,18 +85,6 @@
<source>Confirmed</source>
<translation>Подтвержденные</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Копировать адреÑ</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>Да</translation>
- </message>
- <message>
- <source>no</source>
- <translation>Ðет</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -73,29 +99,21 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>верÑиÑ</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>О Bitcoin Core</translation>
+ <source>Command-line options</source>
+ <translation>Опции командной Ñтроки</translation>
</message>
<message>
- <source>Command-line options</source>
+ <source>command-line options</source>
<translation>Опции командной Ñтроки</translation>
</message>
</context>
<context>
<name>Intro</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
@@ -118,19 +136,17 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
+ <message>
+ <source>&amp;Information</source>
+ <translation>ИнформациÑ</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -139,13 +155,6 @@
<name>ReceiveRequestDialog</name>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- </context>
-<context>
<name>SendCoinsDialog</name>
</context>
<context>
@@ -159,61 +168,23 @@
</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>Дата</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Copy address</source>
- <translation>Копировать адреÑ</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Подтвержденные</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>ИнформациÑ</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts
index 0451b1485e..a4f0ebcb4e 100644
--- a/src/qt/locale/bitcoin_sk.ts
+++ b/src/qt/locale/bitcoin_sk.ts
@@ -26,10 +26,6 @@
<translation>Zatvoriť</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopírovať adresu</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Vymaž vybranú adresu zo zoznamu</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Zmazať</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Zvoľte adresu kam poslať coins</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Zvoľte adresu na ktorú prijať coins</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>Vybrať</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Adresa odoslania</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Adresa prijatia</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>Toto sú Vaše Bitcoin adresy pre posielanie platieb. Vždy skontrolujte množstvo a prijímaciu adresu pred poslaním coins.</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>Toto sú vaÅ¡e Bitcoin adresy pre prijímanie platieb. OdporúÄa sa použiÅ¥ novú prijímaciu adresu pre každú transakciu.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopírovať &amp;popis</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Upraviť</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportovať zoznam adries</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Čiarkou oddelovaný súbor (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Export zlyhal</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Nastala chyba pri pokuse uložiť zoznam adries do %1. Skúste znovu.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Popis</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez popisu)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Zopakujte nové heslo</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Zašifrovať peňaženku</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Táto operácia potrebuje heslo k vašej peňaženke aby ju mohla dešifrovať.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Odomknúť peňaženku</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Táto operácia potrebuje heslo k vašej peňaženke na dešifrovanie peňaženky.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dešifrovať peňaženku</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Zmena hesla</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>PotvrÄte Å¡ifrovanie peňaženky</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>Varovanie: Ak zaÅ¡ifrujete peňaženku a stratíte heslo, &lt;b&gt;STRATÃTE VÅ ETKY VAÅ E BITCOINY&lt;/b&gt;!âŽ</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Ste si istí, že si želáte zašifrovať peňaženku?</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>Jadro Bitcoin sa teraz ukonÄí pre dokonÄenie procesu Å¡ifrovania. Pamätaj, že Å¡ifrovanie peňaženky Ťa nemôže úplne ochrániÅ¥ pred krádežou bitcoinov pomocou Å¡kodlivého software.</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>DÔLEŽITÉ: VÅ¡etky doterajÅ¡ie záložné kópie peňaženky ktoré ste zhotovili by mali byÅ¥ nahradené novým zaÅ¡ifrovaným súborom s peňaženkou. Z bezpeÄnostných dôvodov sa predchádzajúce kópie nezaÅ¡ifrovanej peňaženky stanú neužitoÄné keÄ zaÄnete používaÅ¥ novú zaÅ¡ifrovanú peňaženku.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Varovanie: Caps Lock je zapnutý</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Peňaženka zašifrovaná</translation>
- </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>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>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Zadajte staré a nové heslo k peňaženke.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Šifrovanie peňaženky zlyhalo</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Šifrovanie peňaženky zlyhalo kôli internej chybe. Vaša peňaženka nebola zašifrovaná.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Zadané heslá nesúhlasia.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Odomykanie peňaženky zlyhalo</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Zadané heslo pre dešifrovanie peňaženky bolo nesprávne.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Zlyhalo šifrovanie peňaženky.</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Maska stiete</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Heslo k peňaženke bolo úspešne zmenené.</translation>
+ <source>Banned Until</source>
+ <translation>Blokovaný do</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -262,6 +111,10 @@
<translation>UkonÄiÅ¥ program</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;O %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>O &amp;Qt</translation>
</message>
@@ -298,14 +151,6 @@
<translation>Otvoriť &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core klient</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importujem bloky z disku...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Preindexúvam bloky na disku...</translation>
</message>
@@ -350,10 +195,6 @@
<translation>&amp;Prijať</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Zobraziť informácie o Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>Zobraziť / skryť</translation>
</message>
@@ -390,22 +231,10 @@
<translation>Lišta záložiek</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Jadro Bitcoin</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Vyžiadať platby (vygeneruje QR kódy a bitcoin: URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>O jadre Bitcoin</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Upraviť možnosti nastavenia pre Jadro Bitcoin</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Zobraziť zoznam použitých adries odosielateľa a ich popisy</translation>
</message>
@@ -421,10 +250,6 @@
<source>&amp;Command-line options</source>
<translation>Možnosti príkazového riadku</translation>
</message>
- <message>
- <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>
@@ -537,13 +362,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Výstraha siete</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -621,150 +439,6 @@
<source>Priority</source>
<translation>Priorita</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopírovať adresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopírovať popis</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopírovať sumu</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopírovať ID transakcie</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Uzamknúť neminuté</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Odomknúť neminuté</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopírovať množstvo</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopírovať poplatok</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopírovať za poplatok</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopírovať bajty</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <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>
- <message>
- <source>highest</source>
- <translation>najvyššie</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>vyššie</translation>
- </message>
- <message>
- <source>high</source>
- <translation>vysoké</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>stredne vysoké</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>stredné</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>stredne nízke</translation>
- </message>
- <message>
- <source>low</source>
- <translation>nízke</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>nižšie</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>najnižšie</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 zamknutých)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>žiadne</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Tento popis sÄervenie ak veľkosÅ¥ transakcie presiahne 1000 bajtov.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>Tento popis sÄervenie ak je priorita nižšia ako "stredná".</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than %1.</source>
- <translation>Tento popis sÄervenie ak ktorýkoľvek príjemca dostane sumu menÅ¡iu ako %1.</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>
- <message>
- <source>no</source>
- <translation>nie</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Môže sa pohybovať +/- 1 bajt pre vstup.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transakcie s vysokou prioritou sa pravdepodobnejsie dostanú do bloku.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez popisu)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>zmena od %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(zmena)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -788,38 +462,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresa</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nová adresa pre prijímanie</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nová adresa pre odoslanie</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Upraviť prijímacie adresy</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Upraviť odosielaciu adresu</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Vložená adresa "%1" sa už nachádza v adresári.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Vložená adresa "%1" nieje platnou adresou bitcoin.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Nepodarilo sa odomknúť peňaženku.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Generovanie nového kľúÄa zlyhalo.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -847,10 +489,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Jadro Bitcoin</translation>
- </message>
- <message>
<source>version</source>
<translation>verzia</translation>
</message>
@@ -859,10 +497,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>O jadre Bitcoin</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Voľby príkazového riadku</translation>
</message>
@@ -874,24 +508,36 @@
<source>command-line options</source>
<translation>voľby príkazového riadku</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>Vitajte</translation>
+ <source>UI Options:</source>
+ <translation>Možnosti používateľského rozhrania:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Vyberte dátový prieÄinok pri Å¡tarte (predvolené: %u)</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Vitajte v jadre Bitcoin.</translation>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Nastavte jazyk, napríklad "de_DE" (predvolené: podľa systému)</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>KeÄže spúštate program prvý krát, môžte si vybraÅ¥ kde bude Bitcoin Jadro ukladaÅ¥ svoje dáta.</translation>
+ <source>Start minimized</source>
+ <translation>Spustiť minimalizované</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>Jadro Bitcoin stiahne zo siete a uloží kópiu Bitcoin blockchain. Aspoň %1GB dát bude uložených v tomto prieÄinku a Äasom porastie. Peňaženka bude tiež uložená v tomto prieÄinku.</translation>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Nastaviť SSL root certifikáty pre vyžiadanie platby (predvolené: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Zobraziť uvítaciu obrazovku pri štarte (predvolené: %u)</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>Vitajte</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -902,10 +548,6 @@
<translation>Použiť vlastný dátový adresár:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Jadro Bitcoin</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Chyba: Zadaný prieÄinok pre dáta "%1" nemôže byÅ¥ vytvorený.</translation>
</message>
@@ -940,10 +582,6 @@
<source>Select payment request file</source>
<translation>Vyberte súbor s výzvou k platbe</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Vyberte ktorý súbor s výzvou k platbe otvoriť</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -984,10 +622,6 @@
<translation>MinimalizovaÅ¥ 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>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>Tu sa dá nastaviÅ¥ jazyk užívateľského rozhrania. Toto nastavenie bude úÄinné po reÅ¡tartovaní Jadra 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 tretích strán (napr. prehliadaÄ blockchain) ktoré sa zobrazujú v záložke transakcií ako položky kontextového menu. %s v URL je nahradené hash-om transakcie. Viaceré URL sú oddelené zvislou Äiarou |.</translation>
</message>
@@ -1009,15 +643,7 @@
</message>
<message>
<source>&amp;Network</source>
- <translation>Sieť</translation>
- </message>
- <message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Automaticky spustiť Jadro Bitcoin po prihlásení do systému</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Spustiť Bitcoin pri spustení systému správy okien</translation>
+ <translation>&amp;Sieť</translation>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
@@ -1025,7 +651,7 @@
</message>
<message>
<source>W&amp;allet</source>
- <translation>Peňaženka</translation>
+ <translation>&amp;Peňaženka</translation>
</message>
<message>
<source>Expert</source>
@@ -1072,8 +698,36 @@
<translation>Port proxy (napr. 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Použité pre získavanie peerov cez:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Zobrazuje, Äi je poskytované predvolené SOCKS5 proxy používané pre získavanie peerov cez tento typ siete.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Pripojiť k Bitcoinovej sieti cez separované SOCKS5 proxy pre skrytú službu Tor.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>PoužiÅ¥ samostatný SOCKS5 proxy server na dosiahnutie poÄítaÄov cez skryté služby Tor:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
- <translation>Okno</translation>
+ <translation>&amp;Okno</translation>
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
@@ -1089,7 +743,7 @@
</message>
<message>
<source>&amp;Display</source>
- <translation>&amp;Displej</translation>
+ <translation>&amp;Zobrazenie</translation>
</message>
<message>
<source>User Interface &amp;language:</source>
@@ -1220,97 +874,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Spracovanie URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Neplatná adresa platby %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Požiadavka na platbu zamietnutá</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Sieť požiadavky na platbu nie je zhodná so sieťou klienta.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Požiadavka na platbu nie je inicializovaná</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Požadovaná platba sumy %1 je príliš malá (považovaná za prach).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Chyba pri vyžiadaní platby</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Nedá sa spustiť obslužný program bitcoin: click-to-pay zaplatiť kliknutím</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>URL pre stiahnutie výzvy na zaplatenie je neplatné: %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 sa nedá analyzovať! To môže byť spôsobené neplatnou Bitcoin adresou alebo zle upravenými vlastnosťami URI.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Obsluha súboru s požiadavkou na platbu</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Súbor s výzvou na zaplatenie sa nedá ÄítaÅ¥ alebo spracovaÅ¥! To môže byÅ¥ spôsobené aj neplatným súborom s výzvou.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Vypršala platnosť požiadavky na platbu.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>Program nepodporuje neoverené platobné výzvy na vlastná skripty.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Chybná požiadavka na platbu.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>Vrátenie z %1</translation>
- </message>
- <message>
- <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
- <translation>Požiadavka na platbu %1 je príliš veľká (%2 bajtov, povolené je %3 bajtov).</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>Chyba komunikácie s %1: %2 </translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Požiadavka na platbu nemôže byť analyzovaná!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Zlá odpoveÄ zo servera %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Platba potvrdená</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Chyba požiadavky siete</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1365,31 +928,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>Uložiť obrázok...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>Kopírovať obrázok</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Ukladanie QR kódu</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG obrázok (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Meno klienta</translation>
- </message>
- <message>
<source>N/A</source>
<translation>nie je k dispozícii</translation>
</message>
@@ -1410,10 +950,6 @@
<translation>Všeobecné</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Používa OpenSSL verziu</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Používa BerkeleyDB verziu</translation>
</message>
@@ -1442,8 +978,16 @@
<translation>Aktuálny poÄet blokov</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>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>
+ <source>Memory Pool</source>
+ <translation>Pamäť Poolu</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Aktuálny poÄet tranzakcií</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Využitie pamäte</translation>
</message>
<message>
<source>Received</source>
@@ -1458,10 +1002,18 @@
<translation>&amp;Partneri</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>Zablokované spojenia</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>Vyberte poÄítaÄ pre zobrazenie podrobností.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Povolené</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Smer</translation>
</message>
@@ -1470,6 +1022,19 @@
<translation>Verzia</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>PoÄiatoÄný Blok</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Synchronizované hlaviÄky
+</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>Synchronizované bloky</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Aplikácia</translation>
</message>
@@ -1498,6 +1063,10 @@
<translation>ÄŒas odozvy</translation>
</message>
<message>
+ <source>Ping Wait</source>
+ <translation>ÄŒakanie na ping</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Časový posun</translation>
</message>
@@ -1534,10 +1103,6 @@
<translation>Von:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Dátum zostavenia</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Súbor záznamu ladenia</translation>
</message>
@@ -1546,8 +1111,32 @@
<translation>Vymazať konzolu</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Vitajte v RPC konzole pre Jadro Bitcoin.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>&amp;Odpojené uzly</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Blokovať uzol na</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;hodinu</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;deň</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;týždeň</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;rok</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>&amp;odblokovať uzol</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>
@@ -1574,6 +1163,10 @@
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(ID uzlu: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>cez %1</translation>
</message>
@@ -1590,6 +1183,14 @@
<translation>Odchádzajúce</translation>
</message>
<message>
+ <source>Yes</source>
+ <translation>Ãno</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Nie</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation>neznámy</translation>
</message>
@@ -1664,18 +1265,6 @@
<source>Remove</source>
<translation>Odstrániť</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopírovať popis</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopírovať správu</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopírovať sumu</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1695,73 +1284,6 @@
<source>&amp;Save Image...</source>
<translation>Uložiť obrázok...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Vyžiadať platbu pre %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informácia o platbe</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Suma</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Popis</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Správa</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Výsledné URI príliš dlhé, skráť text pre názov / správu.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Chyba v zakódovaní URI do QR kódu</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dátum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Popis</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Správa</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Suma</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez popisu)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(žiadna správa)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(žiadna suma)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1882,14 +1404,6 @@
<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>
@@ -1921,106 +1435,6 @@
<source>S&amp;end</source>
<translation>&amp;Odoslať</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Potvrdiť odoslanie bitcoins</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 do %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopírovať množstvo</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopírovať sumu</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopírovať poplatok</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopírovať za poplatok</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopírovať bajty</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopírovať prioritu</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopírovať zmenu</translation>
- </message>
- <message>
- <source>or</source>
- <translation>alebo</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Suma je vyššia ako Váš zostatok.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Suma celkom prevyÅ¡uje Váš zostatok ak sú zapoÄítané %1 transakÄné poplatky.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Vytvorenie transakcie zlyhalo!</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>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>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Poplatok vyšší ako %1 je považovaný za šialene vysoký.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Vypršala platnosť požiadavky na platbu.</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>Duplicate address found: addresses should only be used once each.</source>
- <translation>Našla sa duplicitná adresa: každú adresu je možné použiť len raz.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Varovanie: Nesprávna Bitcoin adresa</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(bez popisu)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <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>
- <message>
- <source>added as transaction fee</source>
- <translation>pridané ako transakÄný poplatok</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2033,10 +1447,6 @@
<translation>Zapla&amp;tiť:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Vložte popis pre túto adresu aby sa pridala do adresára</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Popis:</translation>
</message>
@@ -2069,6 +1479,10 @@
<translation>Odstrániť túto položku</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>Poplatok sa odpoÄíta od Äiastky, ktorú odosielate. Príjemca dostane menej bitcoinov ako zadáte. Ak je vybraných viacero príjemcov, poplatok je rozdelený rovným dielom.</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation>OdpoÄítaÅ¥ poplatok od s&amp;umy</translation>
</message>
@@ -2104,10 +1518,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Jadro Bitcoin sa ukonÄuje...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Nevypínajte poÄítaÄ kým toto okno nezmizne.</translation>
</message>
@@ -2123,6 +1533,10 @@
<translation>&amp;Podpísať Správu</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation>Bitcoin adresa pre podpísanie správy s</translation>
+ </message>
+ <message>
<source>Choose previously used address</source>
<translation>Vybrať predtým použitú adresu</translation>
</message>
@@ -2186,70 +1600,10 @@
<source>Reset all verify message fields</source>
<translation>Obnoviť všetky polia v overiť správu</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Kliknite "Podpísať Správu" na získanie podpisu</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Zadaná adresa je neplatná.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Prosím skontrolujte adresu a skúste znova.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Vložená adresa nezodpovedá žiadnemu kľúcu.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Odomknutie peňaženky bolo zrušené.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Súkromný kÄ¾ÃºÄ pre vložená adresu nieje k dispozícii.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Podpísanie správy zlyhalo.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Správa podpísaná.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Podpis nie je možné dekódovať.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Prosím skontrolujte podpis a skúste znova.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Podpis sa nezhoduje so zhrnutím správy</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Overenie správy zlyhalo.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Správa overená.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Jadro Bitcoin</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Vývojári jadra Bitcoin</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testovacia sieť]</translation>
</message>
@@ -2262,410 +1616,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Otvorené do %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>sporné</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/offline</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/nepotvrdené</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 potvrdení</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Stav</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, vysielať cez %n uzol</numerusform><numerusform>, vysielať cez %n uzle</numerusform><numerusform>, vysielať cez %n uzolov</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dátum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Zdroj</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Vygenerované</translation>
- </message>
- <message>
- <source>From</source>
- <translation>od</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Pre</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>vlastná adresa</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>Iba sledovanie</translation>
- </message>
- <message>
- <source>label</source>
- <translation>popis</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Kredit</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>neprijaté</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debet</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Debit spolu</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Kredit spolu</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>TransakÄný poplatok</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Suma netto</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Správa</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Komentár</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID transakcie</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Kupec</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>Vygenerované mince musia dospieÅ¥ %1 blokov kým môžu byÅ¥ minuté. KeÄ vytvoríte tento blok, bude rozoslaný do siete aby bol akceptovaný do reÅ¥aze blokov. Ak sa nedostane do reÅ¥azca, jeho stav sa zmení na "zamietnutý" a nebude sa daÅ¥ minúť. Toto sa môže obÄas staÅ¥ ak iný uzol vytvorí blok približne v rovnakom Äase.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Ladiace informácie</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transakcie</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Vstupy</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Suma</translation>
- </message>
- <message>
- <source>true</source>
- <translation>pravda</translation>
- </message>
- <message>
- <source>false</source>
- <translation>nepravda</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ešte nebola úspešne odoslaná</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Otvorené pre %n Äalší blok</numerusform><numerusform>Otvorené pre %n ÄalÅ¡ie bloky</numerusform><numerusform>Otvorené pre %n Äalších blokov</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>neznámy</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detaily transakcie</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Táto ÄasÅ¥ obrazovky zobrazuje detailný popis transakcie</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Dátum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Otvorené pre %n Äalší blok</numerusform><numerusform>Otvorené pre %n ÄalÅ¡ie bloky</numerusform><numerusform>Otvorené pre %n Äalších blokov</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Otvorené do %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Potvrdené (%1 potvrdení)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ten blok nebol prijatý žiadnou inou nódou a pravdepodobne nebude akceptovaný!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Vygenerované ale neakceptované</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Offline</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Popis</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Nepotvrdené</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation> Potvrdzuje sa ( %1 z %2 odporúÄaných potvrdení)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>V rozpore</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Prijaté s</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Prijaté od:</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Odoslané na</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Platba sebe samému</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Vyťažené</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>Iba sledovanie</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Status transakcie. Pohybujte myÅ¡ou nad týmto poľom a zjaví sa poÄet potvrdení.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Dátum a Äas prijatia transakcie.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Typ transakcie.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Či sú ale nie sú, adresy iba na sledovanie zahrnuté v tejto transakcii.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Suma pridaná alebo odobraná k zostatku.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>VÅ¡etko</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Dnes</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Tento týždeň</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Tento mesiac</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Minulý mesiac</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Tento rok</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Rozsah...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Prijaté s</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Odoslané na</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Samému sebe</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Vyťažené</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Iné</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Vložte adresu alebo popis pre vyhľadávanie</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Min množstvo</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopírovať adresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopírovať popis</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopírovať sumu</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopírovať ID transakcie</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Editovať popis</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Zobraziť podrobnosti transakcie</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Exportovať históriu transakcií</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Iba sledovanie</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Export zlyhal</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Vyskytla sa chyba pri pokuse o uloženie histórie transakcií do %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Export úspešný</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>História transakciá bola úspešne uložená do %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Čiarkou oddelovaný súbor (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Potvrdené</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Dátum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Popis</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Rozsah:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>do</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2673,55 +1630,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Nie je naÄítaná peňaženka.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Poslať Bitcoins</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportovať...</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportovať tento náhľad do súboru</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Zálohovať peňaženku</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Údaje peňaženky (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Záloha zlyhala</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Vyskytla sa chyba pri pokuse o uloženie dát peňaženky do %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Dáta peňaženky boli úspešne uložené do %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Záloha úspešná</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2744,14 +1652,34 @@
<translation>Prijímať príkazy z príkazového riadku a JSON-RPC</translation>
</message>
<message>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Chyba: Vyskytla sa interná chyba, pre viac informácií zobrazte debug.log</translation>
+ </message>
+ <message>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Poplatok (za %s/kB) pridaný do tranzakcie, ktorú posielate (predvolené: %s)</translation>
+ </message>
+ <message>
+ <source>Pruning blockstore...</source>
+ <translation>Redukovanie blockstore...</translation>
+ </message>
+ <message>
<source>Run in the background as a daemon and accept commands</source>
<translation>Bežať na pozadí ako démon a prijímať príkazy</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>Nepodarilo sa spustiť HTTP server. Pre viac detailov zobrazte debug log.</translation>
+ </message>
+ <message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Prijať spojenia zvonku (predvolené: 1 ak žiadne -proxy alebo -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Jadro Bitcoin</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>
@@ -2776,10 +1704,6 @@
<translation>Toto je pred-testovacia verzia - použitie je na vlastné riziko - nepoužívajte na tvorbu bitcoin ani obchodovanie.</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Nepodarilo sa pripojiÅ¥ na %s na tomto poÄítaÄi. Bitcoin Jadro je už pravdepodobne spustené.</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Varovanie: Javí sa že sieť sieť úplne nesúhlasí! Niektorí mineri zjavne majú ťažkosti.
@@ -2790,14 +1714,14 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<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: 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>Varovanie: wallet.dat je poškodený, údaje úspešne získané! Pôvodný wallet.dat uložený ako wallet.{timestamp}.bak v %s; ak váš zostatok alebo transakcie niesu správne, mali by ste súbor obnoviť zo zálohy.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Uzle na zoznam povolených, ktoré sa pripájajú z danej netmask alebo IP adresy. Môže byť zadané viac krát.</translation>
</message>
<message>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool musí byť najmenej %d MB</translation>
+ </message>
+ <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;category&gt; môže byť:</translation>
</message>
@@ -2830,6 +1754,18 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Chcete znovu zostaviť databázu blokov?</translation>
</message>
<message>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Povoliť zverejneneie hash blokov pre &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Povoliť zverejnenie hash tranzakcií pre &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Povoliť zverejnenie raw bloku pre &lt;address&gt;</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Chyba inicializácie databázy blokov</translation>
</message>
@@ -2838,6 +1774,18 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Chyba spustenia databázového prostredia peňaženky %s!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>Chyba naÄítania %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Chyba naÄítania %s: Peňaženka je poÅ¡kodená</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Chyba naÄítania %s: Peňaženka vyžaduje novÅ¡iu verziu %s</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>Chyba naÄítania databázy blokov</translation>
</message>
@@ -2866,6 +1814,18 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Neplatná -onion adresa: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Neplatná suma pre -%s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Neplatná suma pre -fallbackfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Loading banlist...</source>
+ <translation>NaÄítavam banlist...</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>Nedostatok kľúÄových slov súboru.</translation>
</message>
@@ -2874,6 +1834,14 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Pripojiť iba k uzlom v sieti &lt;net&gt; (ipv4, ipv6, alebo onion)</translation>
</message>
<message>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Redukovanie nemôže byť nastavené na zápornú hodnotu.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Redukovanie je nekompatibilné s -txindex.</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 do %d, prednastavené: %d)</translation>
</message>
@@ -2886,6 +1854,18 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>OznaÄ súbor peňaženky (v prieÄinku s dátami)</translation>
</message>
<message>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Nepodporovaný parameter -benchmark bol ignorovaný, použite -debug=bench.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Nepodporovaný argument -debugnet bol ignorovaný, použite -debug=net.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Nepodporovaný argument -tor, použite -onion.</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: %u)</source>
<translation>PoužiÅ¥ UPnP pre mapovanie poÄúvajúceho portu (predvolené: %u)</translation>
</message>
@@ -2906,10 +1886,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Voľby peňaženky:</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Potrebujete prebudovať databázu použitím -reindex zmeniť -txindex</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>Povoliť JSON-RPC pripojenia zo zadaného zdroja. Pre &lt;ip&gt; sú platné jednoduché IP (napr. 1.2.3.4), sieť/netmask (napr. 1.2.3.4/255.255.255.0) alebo sieť/CIDR (napr. 1.2.3.4/24). Táto možnosť môže byť zadaná niekoľko krát</translation>
</message>
@@ -2922,14 +1898,14 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>SpojiÅ¥ s danou adresou pre poÄúvanie JSON-RPC spojení. Použite zápis [host]:port pre IPv6. Táto možnosÅ¥ môže byt zadaná niekoľko krát (predvolené: spojiÅ¥ so vÅ¡etkými rozhraniami)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Neviem uzamknúť data adresár %s. Jadro Bitcoin je pravdepodobne už spustené.</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Vytvoriť nové súbory z predvolenými systémovými právami, namiesto umask 077 (funguje iba z vypnutou funkcionalitou peňaženky)</translation>
</message>
<message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Zisti vlastnú IP adresu (predvolené: 1 pre listen a -externalip alebo -proxy)</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>
@@ -2958,8 +1934,8 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>NastaviÅ¥ najväÄÅ¡iu veľkosÅ¥ vysoká-dôležitosÅ¥/nízke-poplatky transakcií v bajtoch (prednastavené: %d)</translation>
</message>
<message>
- <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
- <translation>NastaviÅ¥ poÄet vlákien pre generáciu mincí (-1 = vÅ¡etky jadrá, predvolené: %d)</translation>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>Suma je príliš malá pre odoslanie tranzakcie</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>
@@ -2978,40 +1954,24 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Akceptovať verejné REST žiadosti (predvolené: %u)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Nedá sa vyriešiť -whitebind adresa: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Automaticky vytvoriť skrytú službu Tor (predvolené: %d)</translation>
</message>
<message>
<source>Connect through SOCKS5 proxy</source>
<translation>Pripojiť cez proxy server SOCKS5</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Autorské práva (C) 2009-%i Vývojári jadra Bitcoin</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>Error reading from database, shutting down.</source>
<translation>Chyba pri naÄítaní z databázy, ukonÄuje sa.</translation>
</message>
<message>
- <source>Information</source>
- <translation>Informácia</translation>
- </message>
- <message>
- <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neplatná suma pre -maxtxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neplatná suma pre -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Importovať bloky z externého súboru blk000??.dat pri štarte</translation>
</message>
<message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neplatná suma pre -mintxfee=&lt;amount&gt;: '%s'</translation>
+ <source>Information</source>
+ <translation>Informácia</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3038,10 +1998,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Možnosti servra RPC:</translation>
</message>
<message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Obdržať a zobraziť sieťové P2P varovania (predvolené: %u)</translation>
- </message>
- <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Odoslať trace/debug informácie na konzolu namiesto debug.info žurnálu</translation>
</message>
@@ -3062,10 +2018,18 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Podpísanie správy zlyhalo</translation>
</message>
<message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Suma tranzakcie je príliš malá na zaplatenie poplatku</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Toto je experimentálny softvér.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Heslo na kontrolu portu pre Tor (predvolené: žiadne)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Suma transakcie príliš malá</translation>
</message>
@@ -3086,6 +2050,10 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Na tomto poÄítaÄi sa nedá vytvoriÅ¥ väzba %s (vytvorenie väzby vrátilo chybu %s)</translation>
</message>
<message>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Aktualizovať peňaženku na posledný formát pri štarte</translation>
+ </message>
+ <message>
<source>Username for JSON-RPC connections</source>
<translation>Užívateľské meno pre JSON-RPC spojenia</translation>
</message>
@@ -3098,10 +2066,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Zmazať všetky transakcie z peňaženky...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat je poškodený, záchrana zlyhala</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Heslo pre JSON-rPC spojenia</translation>
</message>
@@ -3110,10 +2074,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Vykonaj príkaz, ak zmeny v najlepšom bloku (%s v príkaze nahradí blok hash)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Táto pomocná správa</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Povoliť vyhľadávanie DNS pre pridanie nódy a spojenie</translation>
</message>
@@ -3122,10 +2082,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>NaÄítavanie adries...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Chyba naÄítania wallet.dat: Peňaženka je poÅ¡kodená</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 = zachovaÅ¥ metaúdaje tx napr. vlastníka úÄtu a informácie o platobných príkazoch, 2 = zahodiÅ¥ metaúdaje tx)</translation>
</message>
@@ -3158,10 +2114,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Vždy sa dotazovať adresy partnerských uzlov cez vyhľadávanie DNS (predvolené: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Chyba naÄítania wallet.dat</translation>
- </message>
- <message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
<translation>Koľko blokov overiť pri spustení (predvolené: %u, 0 = všetky)</translation>
</message>
@@ -3242,18 +2194,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Neznáma sieť upresnená v -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Nemožno rozriešiť -bind adress: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Nemožno rozriešiť -externalip address: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neplatná suma pre -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nedostatok prostriedkov</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sl_SI.ts b/src/qt/locale/bitcoin_sl_SI.ts
index f26e350545..16ef20ea3a 100644
--- a/src/qt/locale/bitcoin_sl_SI.ts
+++ b/src/qt/locale/bitcoin_sl_SI.ts
@@ -26,10 +26,6 @@
<translation>&amp;Zapri</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopiraj naslov</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>IzbriÅ¡i trenutno oznaÄeni naslov iz seznama</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>I&amp;zbriši</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Izbira naslova, na katerega poÅ¡iljate plaÄilo</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Izbira naslova za prejem plaÄila</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>&amp;Izberi</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Imenik naslovov za pošiljanje</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Imenik naslovov za prejemanje</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>To je vaÅ¡ imenik shranjenih naslovov Bitcoin, na katere lahko poÅ¡iljate plaÄila. Pred vsakim odlivom vedno preverite, Äe sta znesek in prejemnikov naslov pravilna.</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 je imenik vaÅ¡ih ustvarjenih naslovov Bitcoin, na katere lahko prejemate plaÄila. PriporoÄljivo je, da za vsak nov priliv ustvarite nov prejemni naslov.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopiraj &amp;oznako</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Uredi</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Izvozi seznam naslovov</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Datoteka s podatki, loÄenimi z vejico (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Seznama naslovov ni bilo mogoÄe izvoziti.</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Napaka pri shranjevanju seznama naslovov v datoteko %1. Prosimo, poskusite znova.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Naslov</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(brez oznake)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Ponovite novo geslo</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Å ifriraj denarnico</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>To dejanje zahteva geslo za odklepanje vaše denarnice.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Odkleni denarnico</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>To dejanje zahteva geslo za dešifriranje vaše denarnice.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dešifriraj denarnico</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Zamenjaj geslo</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Potrditev Å¡ifriranja denarnice</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>Opozorilo: V primeru izgube gesla Å¡ifrirane denarnice, boste &lt;b&gt;IZGUBILI VSE BITCOINE V DENARNICI&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Ali ste prepriÄani, da želite Å¡ifrirati vaÅ¡o denarnico?</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>Program se bo zaprl, da dokonÄa proces Å¡ifriranja. Zapomnite si, da Å¡ifriranje ne more popolnoma zaÅ¡Äititi vaÅ¡e denarnice pred krajami in zlonamernimi programi, ki bi lahko bili nameÅ¡Äeni na vaÅ¡em raÄunalniku.</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>POMEMBNO: Vse starejÅ¡e obstojeÄe varnostne kopije denarnice je potrebno zamenjati s to novo, Å¡ifrirano varnostno kopijo. Iz varnostnih razlogov bodo stare varnostne kopije postale neuporabne takoj, ko zaÄnete uporabljati novo, Å¡ifrirano denarnico.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Opozorilo: imate vklopljene velike Ärke (Caps Lock)</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Denarnica je Å¡ifrirana</translation>
- </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>Vnesite novo geslo. Prosimo, da uporabite geslo sestavljeno iz &lt;b&gt;deset ali veÄ&lt;/b&gt; nakljuÄnih znakov, ali &lt;b&gt;osem ali veÄ&lt;/b&gt; besed.</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase to the wallet.</source>
- <translation>Vnesite staro in novo geslo denarnice.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Denarnice ni bilo mogoÄe Å¡ifrirati.</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>PriÅ¡lo je do napake. Denarnice ni bilo mogoÄe Å¡ifrirati.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Vnešeni gesli se ne ujemata</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Denarnice ni bilo mogoÄe odkleniti.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Vnesli ste napaÄno geslo za deÅ¡ifriranje denarnice.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Denarnice ni bilo mogoÄe deÅ¡ifrirati.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Geslo za dostop do denarnice je bilo uspešno zamenjano.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -298,14 +139,6 @@
<translation>Odpri &amp;URI ...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Odjemalec Bitcoin Core</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Uvažam bloke z diska ...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Poustvarjam kazalo blokov na disku ...</translation>
</message>
@@ -350,10 +183,6 @@
<translation>P&amp;rejmi</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Oglejte si informacije o programu</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Prikaži / Skrij</translation>
</message>
@@ -390,22 +219,10 @@
<translation>Orodna vrstica zavihkov</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Zahtevajte plaÄilo (ustvarite zahtevek s kodo QR in URI tipa bitcoin:)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>&amp;O programu</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>Spremenite programske nastavitve</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Preglejte in uredite seznam naslovov, na katere ste kdaj poslali plaÄila</translation>
</message>
@@ -421,13 +238,9 @@
<source>&amp;Command-line options</source>
<translation>Opcije &amp;ukazne vrstice</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Oglejte si seznam in kratek opis vseh opcij pri zagonu programa iz ukazne vrstice</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 aktivne povezave v bitcoin omrežje</numerusform><numerusform>%n aktivnih povezav v bitcoin omrežje</numerusform></translation>
+ <translation><numerusform>%n aktivna povezava v omrežje Bitcoin</numerusform><numerusform>%n aktivni povezavi v omrežje Bitcoin</numerusform><numerusform>%n aktivne povezave v omrežje Bitcoin</numerusform><numerusform>%n aktivnih povezav v omrežje Bitcoin</numerusform></translation>
</message>
<message>
<source>No block source available...</source>
@@ -439,7 +252,7 @@
</message>
<message numerus="yes">
<source>%n hour(s)</source>
- <translation><numerusform>%n ura</numerusform><numerusform>%n uri</numerusform><numerusform>%n ure</numerusform><numerusform>%n ur</numerusform></translation>
+ <translation><numerusform>%n uro</numerusform><numerusform>%n uri</numerusform><numerusform>%n ure</numerusform><numerusform>%n ur</numerusform></translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
@@ -463,7 +276,7 @@
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation>Zadnji prejeti blok je bil ustvarjen %1 nazaj.</translation>
+ <translation>Zadnji prejeti blok je star %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
@@ -537,13 +350,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Omrežno opozorilo</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -621,150 +427,6 @@
<source>Priority</source>
<translation>Prioriteta</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopiraj naslov</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiraj oznako</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiraj znesek</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopiraj ID transakcije</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Zakleni neporabljeno</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Odkleni neporabljeno</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopiraj Å¡tevilo vhodov</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopiraj znesek provizije</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopiraj konÄni znesek</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopiraj Å¡tevilo bajtov</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopiraj prioriteto</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopiraj prah</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopiraj znesek vraÄila</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>najvišja</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>višja</translation>
- </message>
- <message>
- <source>high</source>
- <translation>visoka</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>srednje visoka</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>srednja</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>srednje nizka</translation>
- </message>
- <message>
- <source>low</source>
- <translation>nizka</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>nižja</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>najnižja</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 zaklenjeno)</translation>
- </message>
- <message>
- <source>none</source>
- <translation>niÄ</translation>
- </message>
- <message>
- <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
- <translation>Oznaka postane rdeÄa, Äe je transakcije veÄja od 1000 bajtov.</translation>
- </message>
- <message>
- <source>This label turns red if the priority is smaller than "medium".</source>
- <translation>Oznaka postane rdeÄa, Äe je prioriteta transakcije manjÅ¡a kot "srednja".</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than %1.</source>
- <translation>Oznaka postane rdeÄa, Äe je znesek manjÅ¡i od %1.</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Lahko variira +/- %1 satoshijev na vhod.</translation>
- </message>
- <message>
- <source>yes</source>
- <translation>da</translation>
- </message>
- <message>
- <source>no</source>
- <translation>ne</translation>
- </message>
- <message>
- <source>This means a fee of at least %1 per kB is required.</source>
- <translation>To pomeni, da je zahtevana provizija v višini vsaj %1 na KiB.</translation>
- </message>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Lahko variira +/-1 bajt na vhod.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transakcije z viÅ¡jo prioriteto imajo boljÅ¡e možnosti za vkljuÄitev v blok.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(brez oznake)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>vraÄilo od %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(vraÄilo)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -788,38 +450,6 @@
<source>&amp;Address</source>
<translation>&amp;Naslov</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Nov naslov za prilive</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Nov naslov za odlive</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Uredi naslov za prilive</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Uredi naslov za odlive</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Vnešeni naslov %1 je že v imeniku.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Vnešeni naslov %1 ni veljaven naslov Bitcoin.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Denarnice ni bilo mogoÄe odkleniti.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Novega kljuÄa ni bilo mogoÄe ustvariti.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -847,10 +477,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>razliÄica</translation>
</message>
@@ -859,10 +485,6 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>O programu Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Možnosti ukazne vrstice</translation>
</message>
@@ -874,7 +496,7 @@
<source>command-line options</source>
<translation>možnosti ukazne vrstice</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -882,18 +504,6 @@
<translation>Dobrodošli</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Dobrodošli v programu Bitcoin Core.</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>To je prvi zagon programa, zato lahko izberete mapo, v katero bo program shranjeval podatke.</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 bo prenesel in shranil kopijo verige blokov. V izbrani podatkovni mapi bo shranjenih vsaj %1 GiB podatkov, ta koliÄina pa bo sÄasoma Å¡e naraÅ¡Äala. V tej mapi bo shranjena tudi denarnica.</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>Uporabi privzeto podatkovno mapo</translation>
</message>
@@ -902,10 +512,6 @@
<translation>Uporabi to podatkovno mapo:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Napaka: Ni mogoÄe ustvariti mape "%1".</translation>
</message>
@@ -917,7 +523,11 @@
<source>%n GB of free space available</source>
<translation><numerusform>%n GiB prostega prostora na voljo</numerusform><numerusform>%n GiB prostega prostora na voljo</numerusform><numerusform>%n GiB prostega prostora na voljo</numerusform><numerusform>%n GiB prostega prostora na voljo</numerusform></translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(od potrebnih %n GiB)</numerusform><numerusform>(od potrebnih %n GiB)</numerusform><numerusform>(od potrebnih %n GiB)</numerusform><numerusform>(od potrebnih %n GiB)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -936,10 +546,6 @@
<source>Select payment request file</source>
<translation>Izbiranje datoteke z zahtevkom za plaÄilo</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Izberite datoteko, ki vsebuje zahtevek za plaÄilo</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -980,10 +586,6 @@
<translation>Ko zaprete glavno okno programa, bo program tekel Å¡e naprej, okno pa bo zgolj minimirano. Program v tem primeru ustavite tako, da v meniju izberete ukaz Izhod.</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
- <translation>Nastavitev jezika uporabniškega vmesnika programa. Nova nastavitev jezika bo uporabljena šele, ko boste znova zagnali program.</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>Naslovi URL tretjih oseb (npr. raziskovalec blokov), ki bodo navedeni v kontekstnem meniju seznama transakcij. Niz %s iz naslova URL je nadomeÅ¡Äen s hash vrednostjo transakcije. VeÄ zaporednih naslovov URL je med seboj loÄenih z znakom |.</translation>
</message>
@@ -1008,14 +610,6 @@
<translation>&amp;Omrežje</translation>
</message>
<message>
- <source>Automatically start Bitcoin Core after logging in to the system.</source>
- <translation>Ob uporabnikovi prijavi v sistem se bo program samodejno zagnal</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin Core on system login</source>
- <translation>&amp;Zaženi program ob prijavi v sistem</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = samodejno, &lt;0 = toliko procesorskih jeder naj ostane prostih)</translation>
</message>
@@ -1068,6 +662,10 @@
<translation>Vrata posredniškega strežnika (npr. 9050)</translation>
</message>
<message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Za dostop do soležnikov preko skritih storitev Tor uporabi drug posredniški strežnik SOCKS5:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>O&amp;kno</translation>
</message>
@@ -1216,97 +814,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>Rokovanje z URI</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Neveljaven naslov plaÄila %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Zahtevek za plaÄilo je bil zavrnjen.</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Zahtevek za plaÄilo in vaÅ¡ odjemalec se nahajata na dveh razliÄnih omrežjih.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Zahtevek za plaÄilo ni inicializiran.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Znesek %1 v zahtevku za plaÄilo je prenizek (smatran za prah.)</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Napaka pri zahtevku za plaÄilo</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Ni mogoÄe zagnati rokovalca plaÄilnih povezav tipa bitcoin:.</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Naslov URL za pridobitev zahtevka za plaÄilo ni veljaven: %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 je neprepoznaven! Možno je, da je naslov Bitcoin neveljaven, ali da so parametri v URI napaÄno oblikovani.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Rokovanje z datoteko z zahtevkom za plaÄilo</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Datoteke z zahtevkom za plaÄilo ni mogoÄe prebrati! Možno je, da datoteka ni veljavna.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Zahtevek za plaÄilo je potekel.</translation>
- </message>
- <message>
- <source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>Nepreverjeni zahtevki za plaÄilo, namenjeni plaÄilni skripti po meri, niso podprti.</translation>
- </message>
- <message>
- <source>Invalid payment request.</source>
- <translation>Neveljaven zahtevek za plaÄilo.</translation>
- </message>
- <message>
- <source>Refund from %1</source>
- <translation>PovraÄilo od %1</translation>
- </message>
- <message>
- <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
- <translation>Zahtevek za plaÄilo %1 je prevelik (%2 bajtov, dovoljenih je %3 bajtov.)</translation>
- </message>
- <message>
- <source>Error communicating with %1: %2</source>
- <translation>Napaka pri povezavi z %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Zahtevek za plaÄilo je neprepoznaven!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>NapaÄen odziv strežnika %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>PlaÄilo priznano</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Napaka omrežne zahteve</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1314,7 +821,7 @@
</message>
<message>
<source>Node/Service</source>
- <translation>VozliÅ¡Äe/Storitev</translation>
+ <translation>Naslov</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1361,31 +868,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Shrani sliko ...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopiraj sliko</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Shrani kodo QR</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG slika (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Ime odjemalca</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Neznano</translation>
</message>
@@ -1406,10 +890,6 @@
<translation>Splošno</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>OpenSSL razliÄica v rabi</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>BerkeleyDB razliÄica v rabi</translation>
</message>
@@ -1438,10 +918,6 @@
<translation>Trenutno Å¡tevilo blokov</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>Odpre razhroÅ¡Äevalni dnevnik debug.log, ki se nahaja v trenutni podatkovni mapi. ÄŒe je datoteka velika, lahko postopek traja nekaj sekund.</translation>
- </message>
- <message>
<source>Received</source>
<translation>Prejeto</translation>
</message>
@@ -1530,10 +1006,6 @@
<translation>Odhodnih:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Datum izgradnje</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>RazhroÅ¡Äevalni dnevnik</translation>
</message>
@@ -1542,10 +1014,6 @@
<translation>PoÄisti konzolo</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Dobrodošli v konzoli RPC programa 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>Uporabite tipki gor in dol za navigacijo po zgodovini ukazov. Uporabite &lt;b&gt;Ctrl-L&lt;/b&gt; za izbris zaslona in zgodovine ukazov.</translation>
</message>
@@ -1668,18 +1136,6 @@
<source>Remove</source>
<translation>Odstrani</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopiraj oznako</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopiraj sporoÄilo</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiraj znesek</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1699,73 +1155,6 @@
<source>&amp;Save Image...</source>
<translation>&amp;Shrani sliko ...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Zahtevek za plaÄilo z oznako: %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Informacije o plaÄilu</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Naslov</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Znesek</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>SporoÄilo</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Nastali URI je predolg. SkuÅ¡ajte skrajÅ¡ati besedilo v oznaki/sporoÄilu.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Napaka pri pretvorbi URI v kodo QR.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>SporoÄilo</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Znesek</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(brez oznake)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(brez sporoÄila)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(brez zneska)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1886,14 +1275,6 @@
<translation>hitro</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <translation>PoÅ¡lji brez provizije, Äe je mogoÄe</translation>
- </message>
- <message>
- <source>(confirmation may take longer)</source>
- <translation>(Äas do potrditve je lahko daljÅ¡i)</translation>
- </message>
- <message>
<source>Send to multiple recipients at once</source>
<translation>PoÅ¡lji veÄ prejemnikom hkrati</translation>
</message>
@@ -1925,110 +1306,6 @@
<source>S&amp;end</source>
<translation>&amp;Pošlji</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Potrdi pošiljanje</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 na %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopiraj Å¡tevilo vhodov</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiraj znesek</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopiraj provizijo</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopiraj Po proviziji</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopiraj bajte</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopiraj prioriteto</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopiraj vraÄilo</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ali</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Znesek za plaÄilo mora biti veÄji od 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Znesek je veÄji od stanja sredstev, s katerimi razpolagate.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Celotni znesek z vkljuÄeno provizijo %1 je veÄji od stanja sredstev, s katerimi razpolagate.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Transakcije ni bilo mogoÄe ustvariti!</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>Transakcija je bila zavrnjena! To se lahko zgodi, Äe so bili kateri od kovancev iz denarnice že porabljeni, kot v primeru, da ste kje uporabili kopijo datoteke wallet.dat in kovance tam že porabili, lokalno pa ti Å¡e niso bili oznaÄeni kot porabljeni.</translation>
- </message>
- <message>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation>Provizija, višja od %1, velja za nesmiselno visoko.</translation>
- </message>
- <message>
- <source>Payment request expired.</source>
- <translation>Zahtevek za plaÄilo je potekel.</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation><numerusform>Predviden zaÄetek potrditev po %n najdenem bloku.</numerusform><numerusform>Predviden zaÄetek potrditev po %n najdenih blokih.</numerusform><numerusform>Predviden zaÄetek potrditev po %n najdenih blokih.</numerusform><numerusform>Predviden zaÄetek potrditev po %n najdenih blokih.</numerusform></translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>Naslov prejemnika je neveljaven. Prosimo, preverite.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation>Naslov je že bil uporabljen. Vsak naslov naj bi se uporabil samo enkrat.</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>Opozorilo: Neveljaven bitcoin naslov</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(brez oznake)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Opozorilo: Neznan naslov za vraÄilo drobiža</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopiraj prah</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Ali ste prepriÄani, da želite izvesti plaÄilo?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>dodano kot provizija transakcije</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2041,10 +1318,6 @@
<translation>Prejemnik &amp;plaÄila:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Vnesite oznako, pod katero bo zgornji naslov shranjen v imenik</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Oznaka:</translation>
</message>
@@ -2116,10 +1389,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Program se ustavlja ...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Dokler to okno ne izgine, ne zaustavljajte raÄunalnika.</translation>
</message>
@@ -2210,70 +1479,10 @@
<source>Reset all verify message fields</source>
<translation>PoÄisti vsa polja za vnos v oknu za preverjanje</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Kliknite "PodpiÅ¡i sporoÄilo" da ustvarite podpis</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Vnešeni naslov ni veljaven.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Prosimo preverite naslov in poskusite znova.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>VneÅ¡eni naslov se ne nanaÅ¡a na noben kljuÄ.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Odklepanje denarnice je bilo preklicano.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Zasebni kljuÄ vneÅ¡enega naslova ni na voljo.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Podpisa ni bilo mogoÄe ustvariti.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Podpis je bil ustvarjen.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Podpisa ni bilo mogoÄe razbrati.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Prosimo preverite podpis in poskusite znova.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Podpis se ne ujema z rezultatom funkcije preverjanja.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Podpis ni veljaven za to sporoÄilo.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Podpis sporoÄila je veljaven.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Bitcoin Core razvijalci</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2286,418 +1495,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Odprto do %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>v konfliktu</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/brez povezave</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/nepotrjeno</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 potrdil</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, posredovano %n vozliÅ¡Äu</numerusform><numerusform>, posredovano %n vozliÅ¡Äema</numerusform><numerusform>, posredovano %n vozliÅ¡Äem</numerusform><numerusform>, posredovano %n vozliÅ¡Äem</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Izvor</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Generirano</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Pošiljatelj</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Prejemnik</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>lasten naslov</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>opazovano</translation>
- </message>
- <message>
- <source>label</source>
- <translation>oznaka</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>V dobro</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>dozori po %n najdenem bloku</numerusform><numerusform>dozori po %n najdenih blokih</numerusform><numerusform>dozori po %n najdenih blokih</numerusform><numerusform>dozori po %n najdenih blokih</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>ni bilo sprejeto</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Debit</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Skupaj v breme</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Skupaj v dobro</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Provizija transakcije</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Neto znesek</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>SporoÄilo</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Opomba</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>ID transakcije</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Trgovec</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>Ustvarjeni kovanci morajo zoreti %1 blokov, preden jih lahko porabite. Ko ste ta blok zgenerirali, je bil posredovan v omrežje, da bo dodan v verigo. ÄŒe se bloku ni uspelo uvrstiti v verigo, se bo njegovo stanje spremenilo v "ni bilo sprejeto" in kovancev ne bo mogoÄe porabiti. To se vÄasih zgodi, Äe kak drug rudar v roku nekaj sekund hkrati z vami odkrije drug blok.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>RazhroÅ¡Äevalne informacije</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transakcija</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Vhodi</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Znesek</translation>
- </message>
- <message>
- <source>true</source>
- <translation>pravilno</translation>
- </message>
- <message>
- <source>false</source>
- <translation>nepravilno</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, še ni bila uspešno raznešena</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Odprto Å¡e %n blok</numerusform><numerusform>Odprto Å¡e %n bloka</numerusform><numerusform>Odprto Å¡e %n bloke</numerusform><numerusform>Odprto Å¡e %n blokov</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>neznano</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Podrobnosti transakcije</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>V tem podoknu so prikazane podrobnosti o transakciji</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Vrsta</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>Nedozorelo (Å¡t. potrditev: %1, na voljo Å¡ele po: %2)</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Odprto Å¡e %n blok</numerusform><numerusform>Odprto Å¡e %n bloka</numerusform><numerusform>Odprto Å¡e %n bloke</numerusform><numerusform>Odprto Å¡e %n blokov</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Odprto do %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Potrjeno (%1 potrdil)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ta blok ni prejelo Å¡e nobeno vozliÅ¡Äe. Najverjetneje ne bo sprejet!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Generirano, toda ne sprejeto</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Brez povezave</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Nepotrjeno</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>V potrjevanju (Å¡t. potrditev: %1 od priporoÄenih %2)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>V konfliktu</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Prejemek</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Prejemek</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Izdatek</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Nakazilo sebi</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Narudarjeno</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>opazovano</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(ni na voljo)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Stanje transakcije. Zapeljite z miÅ¡ko Äez to polje za prikaz Å¡tevila potrdil. </translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Datum in Äas, ko je transakcija bila prejeta.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Vrsta transakcije.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Ali je v transakciji udeležen kateri od opazovanih naslovov.</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation>UporabniÅ¡ko doloÄen namen transakcije.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Znesek spremembe stanja sredstev.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Vse</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Danes</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Ta teden</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Ta mesec</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Prejšnji mesec</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>To leto</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>ObmoÄje ...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Prejemek</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Izdatek</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Nakazilo sebi</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Narudarjeno</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Drugo</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>IÅ¡Äite po naslovu ali oznaki</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minimalni znesek</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopiraj naslov</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiraj oznako</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiraj znesek</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopiraj ID transakcije</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Uredi oznako</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Prikaži podrobnosti transakcije</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Izvoz zgodovine transakcij</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Opazovano</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Seznama transakcij ni bilo mogoÄe izvoziti.</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Prišlo je do napake med shranjevanjem zgodovine transakcij v datoteko %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Uspešen izvoz</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Zgodovina poteklih transakcij je bila uspešno shranjena v datoteko %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Datoteka s podatki, loÄenimi z vejico (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Potrjeno</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Vrsta</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Oznaka</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Naslov</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>ObmoÄje:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>za</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2705,55 +1509,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Denarnica ni bila naložena.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Pošlji</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Izvozi</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Izvozi podatke iz trenutnega zavihka v datoteko</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Izdelava varnostne kopije denarnice</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Podatki denarnice (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Varnostne kopije ni bilo mogoÄe izdelati.</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Prišlo je do napake pri shranjevanju podatkov denarnice v datoteko %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Podatki iz denarnice so bili uspešno shranjeni v datoteko %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Varnostna kopija je bila uspešno izdelana</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2784,6 +1539,10 @@
<translation>Sprejemaj zunanje povezave (privzeto: 1, razen Äe ste vklopili opciji -proxy ali -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Veži dani naslov in tam vedno poslušaj. Za naslove protokola IPv6 uporabite zapis [gostitelj]:vrata.</translation>
</message>
@@ -2804,18 +1563,6 @@
<translation>To je preizkusna razliÄica Å¡e neizdanega programa. Uporabljate jo na lastno odgovornost. Programa ne uporabljajte je za rudarjenje ali trgovske aplikacije.</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Na tem raÄunalniku ni bilo mogoÄe vezati naslova %s. Odjemalec Bitcoin Core je verjetno že zagnan.</translation>
- </message>
- <message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>OPOZORILO: Generirano je bilo nenavadno veliko Å¡tevilo blokov. Å t. prejetih blokov: %d v Å¡t. ur: %d (priÄakovanih je %d blokov)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>OPOZORILO: Preverite vaÅ¡o omrežno povezavo. Å t. prejetih blokov: %d v Å¡t. ur: %d (priÄakovanih je %d blokov)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Opozorilo: Trenutno na omrežju ni videti konsenza! Videti je, kot da bi imeli nekateri rudarji težave.</translation>
</message>
@@ -2824,10 +1571,6 @@
<translation>Opozorilo: Trenutno se s soležniki ne strinjam v popolnosti! MogoÄe bi morali vi ali drugi udeleženci posodobiti odjemalce.</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>Opozorilo: Datoteka wallet.dat je bila okvarjena, podatki pa so bili kljub temu reÅ¡eni! Originalna datoteka je bila shranjena kot wallet.{Äas.oznaka}.bak v mapo %s. ÄŒe sta skupno stanje ali seznam transakcij napaÄna, morate datoteko restavrirati iz varnostne kopije.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Sprejemaj povezave samo od soležnikov, ki so na naslovih, ki ustrezajo navedeni omrežni maski ali naslovu. Opcijo lahko navedete veÄkrat.</translation>
</message>
@@ -2948,14 +1691,6 @@
<translation>Izbire denarnice:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Opozorilo: RazliÄica vaÅ¡ega odjemalca je zastarela. Potrebna je nadgradnja!</translation>
- </message>
- <message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Ob spremembi vrednosti opcije -txindex boste morali obnoviti bazo podatkov z uporabo opcije -reindex</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>Iz navedenega vira dovoli povezave na JSON-RPC. Veljavne oblike vrednosti parametra &lt;ip&gt; so: edinstven naslov IP (npr.: 1.2.3.4), kombinacija omrežje/netmask (npr.: 1.2.3.4/255.255.255.0), ali pa kombinacija omrežje/CIDR (1.2.3.4/24). To opcijo lahko navedete veÄkrat.</translation>
</message>
@@ -2968,10 +1703,6 @@
<translation>Veži dani naslov in sprejemaj povezave na JSON-RPC. Za naslove protokola IPv6 uporabite zapis [gostitelj]:vrata. To opcijo lahko navedete veÄkrat. (privzeto: veži vse omrežne vmesnike)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Ne morem zakleniti podatkovne mape %s. Bitcoin Core je verjetno že zagnan.</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Ustvarjaj nove datoteke s privzetimi sistemskimi dovoljenji, namesto z umask 077. (To pride v poštev samo, kadar imate izklopljeno funkcijo denarnice.)</translation>
</message>
@@ -3000,22 +1731,10 @@
<translation>(privzeto: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>Preklapljam na najboljšo verigo ...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Naslova %s, podanega pri opciji -whitebind ni mogoÄe razreÅ¡iti.</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Poveži se preko posredniškega strežnika SOCKS5</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>Information</source>
<translation>Informacije</translation>
</message>
@@ -3068,10 +1787,6 @@
<translation>Brišem vse transakcije iz denarnice ...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>Datoteka wallet.dat je poÅ¡kodovana in je ni bilo mogoÄe obnoviti.</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Geslo za povezave na JSON-RPC</translation>
</message>
@@ -3080,10 +1795,6 @@
<translation>Izvedi ukaz, ko je najden najboljši blok (niz %s v ukazu bo zamenjan s hash vrednostjo bloka)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>To sporoÄilo pomoÄi</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>OmogoÄi poizvedbe DNS za opcije -addnode, -seednode in -connect.</translation>
</message>
@@ -3092,10 +1803,6 @@
<translation>Nalagam naslove ...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Napaka pri nalaganju wallet.dat: denarnica pokvarjena</translation>
- </message>
- <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Za dostop do soležnikov preko skritih storitev Tor uporabi drug posredniški strežnik SOCKS5 (privzeto: %s)</translation>
</message>
@@ -3104,10 +1811,6 @@
<translation>(privzeto: %s)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Napaka pri nalaganju wallet.dat</translation>
- </message>
- <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Neveljaven naslov -proxy: '%s'</translation>
</message>
@@ -3140,18 +1843,6 @@
<translation>Neznano omrežje doloÄeno v -onlynet: '%s'.</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Naslova %s, podanega pri opciji -bind ni mogoÄe razreÅ¡iti.</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Naslova "%s", podanega pri opciji -externalip ni mogoÄe razreÅ¡iti.</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Neveljavna koliÄina za -paytxfee=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Premalo sredstev</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sq.ts b/src/qt/locale/bitcoin_sq.ts
index 769b45b562..6c86b7d9fc 100644
--- a/src/qt/locale/bitcoin_sq.ts
+++ b/src/qt/locale/bitcoin_sq.ts
@@ -22,75 +22,16 @@
<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>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Këto janë Bitcoin adresat e juaja për të dërguar pagesa. Gjithmon kontrolloni shumën dhe adresën pranuese para se të dërgoni monedha.</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation>Këto janë Bitcoin adresat e juaja për të pranuar pagesa. Rekomandohet që gjithmon të përdorni një adresë të re për çdo transaksion.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopjo &amp;Etiketë</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Ndrysho</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Eksporto listën e adresave</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Skedar i ndarë me pikëpresje(*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Eksportimi dështoj</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Gabim gjatë ruajtjes së listës së adresave në %1. Ju lutem provoni prapë.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiketë</translation>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Eksporto të dhënat e skedës korrente në një skedar</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresë</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(pa etiketë)</translation>
+ <source>&amp;Delete</source>
+ <translation>&amp;Fshi</translation>
</message>
</context>
<context>
@@ -107,67 +48,7 @@
<source>Repeat new passphrase</source>
<translation>Përsërisni frazkalimin e ri</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Kripto portofolin</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ky veprim ka nevojë per frazkalimin e portofolit tuaj që të ç'kyç portofolin.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>ç'kyç portofolin.</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ky veprim kërkon frazkalimin e portofolit tuaj që të dekriptoj portofolin.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dekripto portofolin</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Ndrysho frazkalimin</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>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Enkriptimi i portofolit dështoi</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Enkriptimi i portofolit dështoi për shkak të një gabimi të brëndshëm. portofoli juaj nuk u enkriptua.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Frazkalimet e plotësuara nuk përputhen.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>ç'kyçja e portofolit dështoi</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Frazkalimi i futur për dekriptimin e portofolit nuk ishte i saktë.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Dekriptimi i portofolit dështoi</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -202,6 +83,10 @@
<translation>&amp;Opsione</translation>
</message>
<message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Duke marr adresen</translation>
+ </message>
+ <message>
<source>Change the passphrase used for wallet encryption</source>
<translation>Ndrysho frazkalimin e përdorur per enkriptimin e portofolit</translation>
</message>
@@ -242,14 +127,6 @@
<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>
@@ -291,9 +168,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -311,22 +185,6 @@
<source>Date</source>
<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>
</context>
<context>
<name>EditAddressDialog</name>
@@ -342,34 +200,6 @@
<source>&amp;Address</source>
<translation>&amp;Adresa</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Adresë e re pritëse</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Adresë e re dërgimi</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Ndrysho adresën pritëse</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>ndrysho adresën dërguese</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Adresa e dhënë "%1" është e zënë në librin e adresave. </translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Nuk mund të ç'kyçet portofoli.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Krijimi i çelësit të ri dështoi.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -381,17 +211,9 @@
<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>
@@ -400,14 +222,6 @@
<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>
@@ -421,6 +235,10 @@
<source>Options</source>
<translation>Opsionet</translation>
</message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>Portofol</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
@@ -430,9 +248,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -443,11 +258,12 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
+ <source>&amp;Information</source>
+ <translation>Informacion</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation>&amp;Hap</translation>
</message>
@@ -467,42 +283,23 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>&amp;Etiketë:</translation>
- </message>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>Adresë</translation>
+ <source>&amp;Amount:</source>
+ <translation>Shuma:</translation>
</message>
<message>
- <source>Amount</source>
- <translation>Sasia</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;Etiketë:</translation>
</message>
<message>
- <source>Label</source>
- <translation>Etiketë</translation>
+ <source>Clear</source>
+ <translation>Pastro</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiketë</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Sasia</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
<message>
- <source>(no label)</source>
- <translation>(pa etiketë)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Kopjo adresen</translation>
</message>
</context>
<context>
@@ -512,6 +309,10 @@
<translation>Dërgo Monedha</translation>
</message>
<message>
+ <source>Insufficient funds!</source>
+ <translation>Fonde te pamjaftueshme</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>Shuma:</translation>
</message>
@@ -527,18 +328,6 @@
<source>Confirm the send action</source>
<translation>Konfirmo veprimin e dërgimit</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>konfirmo dërgimin e monedhave</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Shuma e paguar duhet të jetë më e madhe se 0.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(pa etiketë)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -551,10 +340,6 @@
<translation>Paguaj &amp;drejt:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Krijoni një etiketë për këtë adresë që t'ja shtoni librit të adresave</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiketë:</translation>
</message>
@@ -570,6 +355,10 @@
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Paguaj drejt:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -592,10 +381,6 @@
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Berthama Bitcoin</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testo rrjetin]</translation>
</message>
@@ -604,159 +389,25 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Hapur deri më %1</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/I pakonfirmuar</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 konfirmimet</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Sasia</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, nuk është transmetuar me sukses deri tani</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>i/e panjohur</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Detajet e transaksionit</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Ky panel tregon një përshkrim të detajuar të transaksionit</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Lloji</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Hapur deri më %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>I/E konfirmuar(%1 konfirmime)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ky bllok është marrë nga ndonjë nyje dhe ka shumë mundësi të mos pranohet! </translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Sent to</source>
- <translation>Dërguar drejt</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Pagesë ndaj vetvetes</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minuar</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(p/a)</translation>
- </message>
+ <name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>TransactionView</name>
- <message>
- <source>Received with</source>
- <translation>Marrë me</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Dërguar drejt</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minuar</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopjo adresën</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Eksportimi dështoj</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Skedar i ndarë me pikëpresje(*.csv)</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Data</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Lloji</translation>
- </message>
+ <name>bitcoin-core</name>
<message>
- <source>Label</source>
- <translation>Etiketë</translation>
+ <source>Options:</source>
+ <translation>Opsionet:</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresë</translation>
- </message>
- </context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- </context>
-<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Dërgo Monedha</translation>
+ <source>Bitcoin Core</source>
+ <translation>Berthama Bitcoin</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
- <name>bitcoin-core</name>
<message>
<source>Information</source>
<translation>Informacion</translation>
diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts
index 425c077b2b..6b6f1af6f6 100644
--- a/src/qt/locale/bitcoin_sr.ts
+++ b/src/qt/locale/bitcoin_sr.ts
@@ -18,10 +18,6 @@
<translation>Kopirajte</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>Kopirajte adresu</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Izbrisite trenutno izabranu adresu sa liste</translation>
</message>
@@ -29,25 +25,6 @@
<source>&amp;Delete</source>
<translation>&amp;Избриши</translation>
</message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Зарезом одвојене вредноÑти (*.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Етикета</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без етикете)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -63,74 +40,6 @@
<source>Repeat new passphrase</source>
<translation>Поновите нову лозинку</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Шифровање новчаника</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ова акција захтева лозинку Вашег новчаника да би га откључала.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Откључавање новчаника</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ова акција захтева да унеÑете лозинку да би дешифловала новчаник.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Дешифровање новчаника</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Промена лозинке</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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;ИЗГУБИТИ СВЕ BITCOIN-Е&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Да ли Ñте Ñигурни да желите да Ñе новчаник шифује?</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Ðовчаник је шифрован</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>ÐеуÑпело шифровање новчаника</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>ÐаÑтала је унутрашња грешка током шифровања новчаника. Ваш новчаник није шифрован.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Лозинке које Ñте унели Ñе не подударају.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>ÐеуÑпело откључавање новчаника</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Лозинка коју Ñте унели за откључавање новчаника је нетачна.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>ÐеуÑпело дешифровање новчаника</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Лозинка за приÑтуп новчанику је уÑпешно промењена.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -247,9 +156,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Amount:</source>
@@ -267,22 +173,6 @@
<source>Confirmed</source>
<translation>Potvrdjen</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>kopiraj adresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>kopiraj naziv</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>kopiraj iznos</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без етикете)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -298,15 +188,7 @@
<source>&amp;Address</source>
<translation>&amp;ÐдреÑа</translation>
</message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Унешена адреÑа "%1" Ñе већ налази у адреÑару.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ðемогуће откључати новчаник.</translation>
- </message>
- </context>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -317,10 +199,6 @@
<translation>верзија</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>O Bitcoin Coru</translation>
- </message>
- <message>
<source>Usage:</source>
<translation>Korišćenje:</translation>
</message>
@@ -338,6 +216,10 @@
<translation>ПоÑтавке</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>новчаник</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Јединица за приказивање изноÑа:</translation>
</message>
@@ -354,9 +236,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -367,58 +246,28 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>&amp;Label:</source>
- <translation>&amp;Етикета</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>kopiraj naziv</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>kopiraj iznos</translation>
- </message>
-</context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
+ <source>&amp;Amount:</source>
+ <translation>Iznos:</translation>
</message>
<message>
- <source>Amount</source>
- <translation>iznos</translation>
+ <source>&amp;Label:</source>
+ <translation>&amp;Етикета</translation>
</message>
<message>
- <source>Label</source>
- <translation>Етикета</translation>
+ <source>&amp;Message:</source>
+ <translation>Poruka:</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Етикета</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>iznos</translation>
- </message>
+ <name>ReceiveRequestDialog</name>
<message>
- <source>(no label)</source>
- <translation>(без етикете)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>Kopirajte adresu</translation>
</message>
</context>
<context>
@@ -439,18 +288,14 @@
<source>S&amp;end</source>
<translation>&amp;Пошаљи</translation>
</message>
- <message>
- <source>Copy amount</source>
- <translation>kopiraj iznos</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(без етикете)</translation>
- </message>
- </context>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
+ <source>A&amp;mount:</source>
+ <translation>Iznos:</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Етикета</translation>
</message>
@@ -492,250 +337,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Otvoreno do %1</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/nepotvrdjeno</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 potvrde</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>datum</translation>
- </message>
- <message>
- <source>label</source>
- <translation>етикета</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>iznos</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, nije još uvek uspešno emitovan</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>nepoznato</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>detalji transakcije</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Ovaj odeljak pokazuje detaljan opis transakcije</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>tip</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Otvoreno do %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Potvrdjena (%1 potvrdjenih)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ovaj blok nije primljen od ostalih Ävorova (nodova) i verovatno neće biti prihvaćen!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>Primljeno od</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Poslat ka</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Isplata samom sebi</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minirano</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Status vaše transakcije. Predjite mišem preko ovog polja da bi ste videli broj konfirmacija</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Datum i vreme primljene transakcije.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Tip transakcije</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Iznos odbijen ili dodat balansu.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Sve</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Danas</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>ove nedelje</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Ovog meseca</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Prošlog meseca</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Ove godine</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Opseg...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Primljen sa</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Poslat ka</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Vama - samom sebi</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Minirano</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Drugi</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Navedite adresu ili naziv koji bi ste potražili</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Min iznos</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>kopiraj adresu</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>kopiraj naziv</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>kopiraj iznos</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>promeni naziv</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Зарезом одвојене вредноÑти (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Potvrdjen</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>tip</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Етикета</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Opseg:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>do</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Слање новца</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>Backup Wallet</source>
- <translation>Backup новчаника</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -762,22 +373,10 @@
<translation>Lozinka za JSON-RPC konekcije</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Ova poruka Pomoći</translation>
- </message>
- <message>
<source>Loading addresses...</source>
<translation>uÄitavam adrese....</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Грешка током учитавања wallet.dat: Ðовчаник је покварен </translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>Грешка током учитавања wallet.dat </translation>
- </message>
- <message>
<source>Loading block index...</source>
<translation>UÄitavam blok indeksa...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr@latin.ts b/src/qt/locale/bitcoin_sr@latin.ts
new file mode 100644
index 0000000000..86243bc14c
--- /dev/null
+++ b/src/qt/locale/bitcoin_sr@latin.ts
@@ -0,0 +1,200 @@
+<TS language="sr@latin" version="2.1">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation>Klikni desnim tasterom za uređivanje adrese ili oznake</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation>Kreiraj novu adresu</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Novi</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>Kopiraj selektovanu adresu u sistemski klipbord</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Kopiraj</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>Zatvori</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Briše trenutno izabranu adresu sa liste</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Izvoz podataka iz trenutne kartice u datoteku</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;Izvoz</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Izbrisati</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation>Dialog pristupne fraze</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation>Unesi pristupnu frazu</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation>Nova pristupna fraza</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Ponovo unesite pristupnu frazu</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation>IP/Netmask</translation>
+ </message>
+ <message>
+ <source>Banned Until</source>
+ <translation>Banovani ste do</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>Error</source>
+ <translation>Greska</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Amount</source>
+ <translation>Kolicina</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation>Datum</translation>
+ </message>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Error</source>
+ <translation>Greska</translation>
+ </message>
+ </context>
+<context>
+ <name>OpenURIDialog</name>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ </context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Amount</source>
+ <translation>Kolicina</translation>
+ </message>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ </context>
+<context>
+ <name>SplashScreen</name>
+ </context>
+<context>
+ <name>TrafficGraphWidget</name>
+ </context>
+<context>
+ <name>TransactionDescDialog</name>
+ </context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Insufficient funds</source>
+ <translation>Nedovoljno sredstava</translation>
+ </message>
+ <message>
+ <source>Loading block index...</source>
+ <translation>Ucitavanje indeksa bloka...</translation>
+ </message>
+ <message>
+ <source>Add a node to connect to and attempt to keep the connection open</source>
+ <translation>Dodajte cvor za povezivanje, da bi pokusali da odrzite vezu otvorenom</translation>
+ </message>
+ <message>
+ <source>Loading wallet...</source>
+ <translation>Ucitavanje novcanika...</translation>
+ </message>
+ <message>
+ <source>Cannot write default address</source>
+ <translation>Nije moguce ispisivanje podrazumevane adrese</translation>
+ </message>
+ <message>
+ <source>Rescanning...</source>
+ <translation>Ponovno skeniranje...</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation>Zavrseno ucitavanje</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Greska</translation>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts
index 18f096b841..ee46974d8b 100644
--- a/src/qt/locale/bitcoin_sv.ts
+++ b/src/qt/locale/bitcoin_sv.ts
@@ -26,10 +26,6 @@
<translation>S&amp;täng</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Kopiera adress</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Ta bort den valda adressen från listan</translation>
</message>
@@ -45,74 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Radera</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Välj en adress att sända betalning till</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Välj en adress att ta emot betalning till</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>V&amp;älj</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Avsändaradresser</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Mottagaradresser</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Detta är dina Bitcoin-adresser för att skicka betalningar. Kolla alltid summan och den mottagande adressen innan du skickar Bitcoins.</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>Detta är dina Bitcoin-adresser för att ta emot betalningar. Det rekommenderas att använda en ny mottagningsadress för varje transaktion.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopiera &amp;etikett</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Ändra</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Exportera adresslistan</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommaseparerad fil (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exporteringen misslyckades</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Det inträffade ett fel när adresslistan skulle sparas till %1.
-Var vänlig och försök igen.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etikett</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adress</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(ingen etikett)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -132,94 +60,6 @@ Var vänlig och försök igen.</translation>
<source>Repeat new passphrase</source>
<translation>Upprepa nytt lösenord</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Kryptera plånbok</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Denna operation behöver din plånboks lösenord för att låsa upp plånboken.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Lås upp plånbok</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Denna operation behöver din plånboks lösenord för att dekryptera plånboken.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Dekryptera plånbok</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Ändra lösenord</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Bekräfta kryptering av plånbok</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>VARNING: Om du krypterar din plånbok och glömmer ditt lösenord, kommer du att &lt;b&gt;FÖRLORA ALLA DINA TILLGÅNGAR&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Varning: Caps Lock är påslaget!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Plånboken är krypterad</translation>
- </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>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>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>
- <translation>Kryptering av plånbok misslyckades</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Kryptering av plånbok misslyckades på grund av ett internt fel. Din plånbok blev inte krypterad.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>De angivna lösenorden överensstämmer inte.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Upplåsning av plånbok misslyckades</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Lösenordet för dekryptering av plånbok var felaktig.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Dekryptering av plånbok misslyckades</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Plånbokens lösenord har ändrats.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -271,6 +111,14 @@ Var vänlig och försök igen.</translation>
<translation>Avsluta programmet</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;Om %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>Visa information om %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>Om &amp;Qt</translation>
</message>
@@ -283,6 +131,10 @@ Var vänlig och försök igen.</translation>
<translation>&amp;Alternativ...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>Ändra konfigurationsalternativ för %1</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>&amp;Kryptera plånbok...</translation>
</message>
@@ -307,14 +159,6 @@ Var vänlig och försök igen.</translation>
<translation>Öppna &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core-klient</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Importerar block från disk...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Återindexerar block på disken...</translation>
</message>
@@ -359,10 +203,6 @@ Var vänlig och försök igen.</translation>
<translation>&amp;Ta emot</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Visa information om Bitcoin Core</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Visa / Göm</translation>
</message>
@@ -399,22 +239,10 @@ Var vänlig och försök igen.</translation>
<translation>Verktygsfält för tabbar</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Begär betalning (genererar QR-koder och bitcoin-URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
@@ -430,15 +258,19 @@ Var vänlig och försök igen.</translation>
<source>&amp;Command-line options</source>
<translation>&amp;Kommandoradsalternativ</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Visa Bitcoin Cores hjälpmeddelande för att få en lista med möjliga Bitcoin-kommandoradsalternativ.</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n aktiva anslutningar till Bitcoin-nätverket.</numerusform><numerusform>%n aktiva anslutningar till Bitcoin-nätverket.</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Indexerar block på disken...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Bearbetar block på disken...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Ingen block-källa tillgänglig...</translation>
</message>
@@ -495,6 +327,14 @@ Var vänlig och försök igen.</translation>
<translation>Uppdaterad</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Visa %1 hjälpmeddelande för att få en lista med möjliga Bitcoin kommandoradsalternativ.</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1-klient</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Hämtar senaste...</translation>
</message>
@@ -546,13 +386,6 @@ Var vänlig och försök igen.</translation>
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Nätverkslarm</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -630,146 +463,6 @@ Var vänlig och försök igen.</translation>
<source>Priority</source>
<translation>Prioritet</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Kopiera adress</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiera etikett</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiera belopp</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopiera transaktions ID</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>LÃ¥s ospenderat</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>LÃ¥s upp ospenderat</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopiera kvantitet</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopiera avgift</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopiera efter avgift</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopiera byte</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopiera prioritet</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopiera damm</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopiera växel</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>högst</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>högre</translation>
- </message>
- <message>
- <source>high</source>
- <translation>hög</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>medelhög</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>medel</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>lågmedel</translation>
- </message>
- <message>
- <source>low</source>
- <translation>låg</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>lägre</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>lägst</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 låst)</translation>
- </message>
- <message>
- <source>none</source>
- <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>
- <message>
- <source>no</source>
- <translation>nej</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Kan variera +/- 1 byte per inmatning.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transaktioner med högre prioritet har större sannolikhet att inkluderas i ett block.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Ingen etikett)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>växel från %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(växel)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -793,38 +486,6 @@ Var vänlig och försök igen.</translation>
<source>&amp;Address</source>
<translation>&amp;Adress</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Ny mottagaradress</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Ny avsändaradress</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Redigera mottagaradress</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Redigera avsändaradress</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Den angivna adressen "%1" finns redan i adressboken.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Den angivna adressen "%1" är inte en giltig Bitcoin-adress.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Plånboken kunde inte låsas upp.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Misslyckades med generering av ny nyckel.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -852,10 +513,6 @@ Var vänlig och försök igen.</translation>
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>version</translation>
</message>
@@ -864,8 +521,8 @@ Var vänlig och försök igen.</translation>
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Om Bitcoin Core</translation>
+ <source>About %1</source>
+ <translation>Om %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -879,6 +536,34 @@ Var vänlig och försök igen.</translation>
<source>command-line options</source>
<translation>kommandoradsalternativ</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>UI-inställningar:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Välj datakatalog vid uppstart (standard: %u)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Ange språk, till exempel "de_DE" (standard: systemspråk)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Starta minimerad</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Ange SSL rotcertifikat för betalningsansökan (standard: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Visa startbild vid uppstart (standard: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Återställ alla inställningar som gjorts i GUI</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -887,16 +572,16 @@ Var vänlig och försök igen.</translation>
<translation>Välkommen</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Välkommen till Bitcoin Core.</translation>
+ <source>Welcome to %1.</source>
+ <translation>Välkommen till %1.</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>Eftersom detta är första gången programmet startas får du välja var Bitcoin Core skall lagra sina data.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Eftersom detta är första gången programmet startas får du välja var %1 skall lagra sitt data.</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 kommer att ladda ner och spara en kopia av Bitcoin-blockkedjan. Åtminstone %1GB av data kommer att sparas i denna katalog, och den kommer att växa över tiden. Plånboken kommer också att sparas i denna katalog.</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 kommer att ladda ner och spara en kopia av Bitcoin blockkedjan. Åtminstone %2GB av data kommer att sparas i denna katalog, och den kommer att växa över tiden. Plånboken kommer också att sparas i denna katalog.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -907,10 +592,6 @@ Var vänlig och försök igen.</translation>
<translation>Använd en anpassad datakatalog:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Fel: Den angivna datakatalogen "%1" kan inte skapas.</translation>
</message>
@@ -945,10 +626,6 @@ Var vänlig och försök igen.</translation>
<source>Select payment request file</source>
<translation>Välj betalningsbegäransfil</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Välj betalningsbegäransfil att öppna</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -961,6 +638,14 @@ Var vänlig och försök igen.</translation>
<translation>&amp;Allmänt</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Starta %1 automatiskt efter inloggningen.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Starta %1 vid systemlogin</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>Storleken på &amp;databascache</translation>
</message>
@@ -989,10 +674,6 @@ Var vänlig och försök igen.</translation>
<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 blockutforskare) 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>
@@ -1017,14 +698,6 @@ Var vänlig och försök igen.</translation>
<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>
@@ -1109,6 +782,14 @@ Var vänlig och försök igen.</translation>
<translation>&amp;Fönster</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;Göm ikonen från systemfältet.</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Göm systemfältsikonen</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Visa endast en systemfältsikon vid minimering.</translation>
</message>
@@ -1129,6 +810,10 @@ Var vänlig och försök igen.</translation>
<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 %1.</source>
+ <translation>Användargränssnittets språk kan ställas in här. Denna inställning träder i kraft efter en omstart av %1.</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;MÃ¥ttenhet att visa belopp i: </translation>
</message>
@@ -1253,97 +938,6 @@ Var vänlig och försök igen.</translation>
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI hantering</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Felaktig betalningsadress %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Betalningsbegäran avslogs</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Betalningsbegärans nätverk matchar inte klientens nätverk.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Betalningsbegäran är inte initierad.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Begärd betalning av %1 är för liten (betraktas som damm).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Fel vid betalningsbegäran</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Kan inte starta bitcoin: klicka-och-betala handhavare</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Betalningsbegärans hämta URL är felaktig: %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 går inte att tolkas! Detta kan orsakas av en ogiltig Bitcoin-adress eller felaktiga URI parametrar.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Hantering av betalningsbegäransfil</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <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>Error communicating with %1: %2</source>
- <translation>Kommunikationsfel med %1: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Betalningsbegäran kan inte behandlas!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>Dåligt svar från server %1</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Betalningen bekräftad</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Fel vid närverksbegäran</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1398,31 +992,8 @@ Var vänlig och försök igen.</translation>
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>&amp;Spara Bild...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>&amp;Kopiera Bild</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>Spara QR-kod</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG-bild (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Klientnamn</translation>
- </message>
- <message>
<source>N/A</source>
<translation>ej tillgänglig</translation>
</message>
@@ -1443,14 +1014,14 @@ Var vänlig och försök igen.</translation>
<translation>Generell</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Använder OpenSSL version</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Använder BerkeleyDB versionen</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Datakatalog</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Uppstartstid</translation>
</message>
@@ -1475,8 +1046,16 @@ Var vänlig och försök igen.</translation>
<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>
+ <source>Memory Pool</source>
+ <translation>Minnespool</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Nuvarande antal transaktioner</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Minnesåtgång</translation>
</message>
<message>
<source>Received</source>
@@ -1527,6 +1106,18 @@ Var vänlig och försök igen.</translation>
<translation>Användaragent</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Öppna %1 debug-loggfilen från aktuell datakatalog. Detta kan ta några sekunder för stora loggfiler.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>Minska fontstorleken</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Öka fontstorleken</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Tjänster</translation>
</message>
@@ -1595,10 +1186,6 @@ Var vänlig och försök igen.</translation>
<translation>Ut:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Kompileringsdatum</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Debugloggfil</translation>
</message>
@@ -1635,8 +1222,8 @@ Var vänlig och försök igen.</translation>
<translation>&amp;Ta bort ban från nod</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Välkommen till RPC-konsolen för Bitcoin Core.</translation>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>Välkommen till %1 RPC-konsolen.</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>
@@ -1698,6 +1285,10 @@ Var vänlig och försök igen.</translation>
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation>&amp;Belopp:</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Etikett:</translation>
</message>
@@ -1761,18 +1352,6 @@ Var vänlig och försök igen.</translation>
<source>Remove</source>
<translation>Ta bort</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Kopiera etikett</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Kopiera meddelande</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiera belopp</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1792,73 +1371,6 @@ Var vänlig och försök igen.</translation>
<source>&amp;Save Image...</source>
<translation>&amp;Spara Bild...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>Begär betalning till %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Betalningsinformation</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adress</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Mängd</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etikett</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Meddelande</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI:n är för lång, försöka minska texten för etikett / meddelande.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Fel vid skapande av QR-kod från URI.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etikett</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Meddelande</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Mängd</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Ingen etikett)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(inget meddelande)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(ingen summa)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1979,14 +1491,6 @@ Var vänlig och försök igen.</translation>
<translation>snabb</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <translation>Sänd som nollavgiftstransaktion om möjligt</translation>
- </message>
- <message>
- <source>(confirmation may take longer)</source>
- <translation>(bekräftelse kan ta längre tid)</translation>
- </message>
- <message>
<source>Send to multiple recipients at once</source>
<translation>Skicka till flera mottagare samtidigt</translation>
</message>
@@ -2018,118 +1522,6 @@ Var vänlig och försök igen.</translation>
<source>S&amp;end</source>
<translation>&amp;Skicka</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Bekräfta skickade mynt</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 till %2</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Kopiera kvantitet</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiera belopp</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Kopiera avgift</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Kopiera efter avgift</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Kopiera byte</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Kopiera prioritet</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Kopiera växel</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>Total summa %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>eller</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Värdet överstiger ditt saldo.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Totalvärdet överstiger ditt saldo när transaktionsavgiften %1 är pålagd.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Transaktionen gick inte att skapa!</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>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 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>
- <source>Pay only the required fee of %1</source>
- <translation>Betala endast den nödvändiga avgiften på %1</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>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>
- <translation>Varning: Felaktig Bitcoinadress</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Ingen etikett)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Varning: Okänd växeladress</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Kopiera damm</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Är du säker på att du vill skicka?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>adderad som transaktionsavgift</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2142,10 +1534,6 @@ Var vänlig och försök igen.</translation>
<translation>Betala &amp;Till:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Ange ett namn för den här adressen och lägg till den i din adressbok</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etikett:</translation>
</message>
@@ -2182,6 +1570,10 @@ Var vänlig och försök igen.</translation>
<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>S&amp;ubtract fee from amount</source>
+ <translation>S&amp;ubtrahera avgiften från beloppet</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Meddelande:</translation>
</message>
@@ -2213,8 +1605,8 @@ Var vänlig och försök igen.</translation>
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core stängs av...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 stängs av...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2307,70 +1699,10 @@ Var vänlig och försök igen.</translation>
<source>Reset all verify message fields</source>
<translation>Rensa alla fält</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>Klicka "Signera Meddelande" för att få en signatur</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Den angivna adressen är ogiltig.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Vad god kontrollera adressen och försök igen.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Den angivna adressen refererar inte till en nyckel.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Upplåsningen av plånboken avbröts.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Privata nyckel för den angivna adressen är inte tillgänglig.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Signeringen av meddelandet misslyckades.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Meddelandet är signerat.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>Signaturen kunde inte avkodas.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Kontrollera signaturen och försök igen.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>Signaturen matchade inte meddelandesammanfattningen.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Meddelandet verifikation misslyckades.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Meddelandet är verifierad.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Kärna</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Bitcoin Core-utvecklarna</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2383,422 +1715,13 @@ Var vänlig och försök igen.</translation>
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Öppet till %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>konflikterade</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/nerkopplad</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/obekräftade</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 bekräftelser</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Status</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, sänd genom %n nod</numerusform><numerusform>, sänd genom %n noder</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Källa</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Genererad</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Från</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Till</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>egen adress</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>granska-bara</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etikett</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Kredit</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>mognar om %n fler block</numerusform><numerusform>mognar om %n fler block</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>inte accepterad</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Belasta</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Total skuld</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Total kredit</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Transaktionsavgift</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Nettobelopp</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Meddelande</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Kommentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Transaktions-ID</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Handlare</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>Genererade mynt måste vänta %1 block innan de kan användas. När du skapade detta block sändes det till nätverket för att läggas till i blockkedjan. Om blocket inte kommer in i kedjan kommer dess status att ändras till "accepteras inte" och kommer ej att gå att spendera. Detta kan ibland hända om en annan nod genererar ett block nästan samtidigt som dig.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Debug information</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Transaktion</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Inputs</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Mängd</translation>
- </message>
- <message>
- <source>true</source>
- <translation>sant</translation>
- </message>
- <message>
- <source>false</source>
- <translation>falsk</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, har inte lyckats skickas ännu</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Öppet för %n mer block</numerusform><numerusform>Öppet för %n mer block</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>okänd</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Transaktionsdetaljer</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Den här panelen visar en detaljerad beskrivning av transaktionen</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation>Omogen (%1 konfirmeringar, blir tillgänglig efter %2)</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Öppet för %n mer block</numerusform><numerusform>Öppet för %n mer block</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>Öppet till %1</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Bekräftad (%1 bekräftelser)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Det här blocket togs inte emot av några andra noder och kommer antagligen inte att bli godkänt.</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Genererad men inte accepterad</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Nerkopplad</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etikett</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Okonfirmerade</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Konfirmerar (%1 of %2 konfirmeringar)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Konflikterade</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Mottagen med</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Mottaget från</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Skickad till</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Betalning till dig själv</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Genererade</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>granska-bara</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(n/a)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Transaktionsstatus. Håll muspekaren över för att se antal bekräftelser.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Tidpunkt då transaktionen mottogs.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Transaktionstyp.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Anger om granska-bara--adresser är involverade i denna transaktion.</translation>
- </message>
- <message>
- <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>
- <translation>Belopp draget eller tillagt till balans.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Alla</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Idag</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Denna vecka</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Denna månad</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Föregående månad</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Det här året</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Period...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Mottagen med</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Skickad till</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Till dig själv</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Genererade</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Övriga</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Sök efter adress eller etikett </translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Minsta mängd</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Kopiera adress</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Kopiera etikett</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Kopiera belopp</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Kopiera transaktions ID</translation>
- </message>
- <message>
- <source>Copy raw transaction</source>
- <translation>Kopiera rå transaktion</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Ändra etikett</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Visa transaktionsdetaljer</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Exportera Transaktionshistoriken</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Granska-bara</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Exporteringen misslyckades</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Det inträffade ett fel när transaktionshistoriken skulle sparas till %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation>Exporteringen lyckades</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Transaktionshistoriken sparades utan problem till %1.</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Kommaseparerad fil (*.csv)</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation>Bekräftad</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Typ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etikett</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adress</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Intervall:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>till</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2806,55 +1729,6 @@ Var vänlig och försök igen.</translation>
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Ingen plånbok har laddats in.</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Skicka pengar</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Exportera</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Exportera informationen i den nuvarande fliken till en fil</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Säkerhetskopiera Plånbok</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Plånboks-data (*.dat)</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation>Säkerhetskopiering misslyckades</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Det inträffade ett fel när plånbokens data skulle sparas till %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Plånbokens data sparades utan problem till %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation>Säkerhetskopiering lyckades</translation>
- </message>
-</context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2881,14 +1755,6 @@ Var vänlig och försök igen.</translation>
<translation>Om &lt;kategori&gt; inte anges eller om &lt;category&gt; = 1, visa all avlusningsinformation.</translation>
</message>
<message>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
- <translation>Maximal total avgift (i %s) att använda i en plånbokstransaktion. Sätts denna för lågtkan stora transaktioner komma att avbrytas (förvalt: %s)</translation>
- </message>
- <message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
- <translation>Vänligen kontrollera att din dators datum och tid är korrekt! Om din klocka går fel kommer Bitcoin Core inte att fungera ordentligt.</translation>
- </message>
- <message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation>Beskärning konfigurerad under miniminivån %d MiB. Vänligen använd ett högre värde.</translation>
</message>
@@ -2929,10 +1795,30 @@ Var vänlig och försök igen.</translation>
<translation>Acceptera anslutningar utifrån (förvalt: 1 om ingen -proxy eller -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee är satt väldigt högt! Detta är avgiften du kan komma att betala om uppskattad avgift inte finns tillgänglig.</translation>
+ </message>
+ <message>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>En avgiftskurs (i %s/kB) som används när det inte finns tillräcklig data för att uppskatta avgiften (förvalt: %s)</translation>
+ </message>
+ <message>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Acceptera vidarebefodrade transaktioner från vitlistade noder även när transaktioner inte vidarebefodras (förvalt: %d)</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>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>Kan inte låsa data-mappen %s. %s körs förmodligen redan.</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>
@@ -2941,10 +1827,38 @@ Var vänlig och försök igen.</translation>
<translation>Distribuerad under MIT mjukvarulicens, se den bifogade filen COPYING eller &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
+ <source>Error loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>Fel vid laddning av %s: Du kan inte aktivera HD på en existerande icke-HD plånbok</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>Fel vid läsning av %s! Alla nycklar lästes korrekt, men transaktionsdatat eller adressbokens poster kanske saknas eller är felaktiga.</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>
<message>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Vidarebefodra alltid transaktioner från vitlistade noder även om de bryter mot lokala reläpolicyn (förvalt: %d)</translation>
+ </message>
+ <message>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>Maximalt tillåten median-peer tidsoffset justering. Lokalt perspektiv av tiden kan bli påverkad av partners, framåt eller bakåt denna tidsrymd. (förvalt: %u sekunder)</translation>
+ </message>
+ <message>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Maximal total avgift (i %s) att använda i en plånbokstransaktion eller råa transaktioner. Sätts denna för lågt kan stora transaktioner avbrytas (förvalt: %s)</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>Vänligen kolla så att din dators datum och tid är korrekt! Om din klocka går fel kommer %s inte att fungera korrekt.</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>Var snäll och bidra om du finner %s användbar. Besök %s för mer information om mjukvaran.</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>
@@ -2957,22 +1871,14 @@ Var vänlig och försök igen.</translation>
<translation>Detta är ett förhands testbygge - använd på egen risk - använd inte för mining eller handels applikationer</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Det går inte att binda till %s på den här datorn. Bitcoin Core är förmodligen redan igång.</translation>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
+ <translation>Kan inte spola tillbaka databasen till obeskärt läge. Du måste ladda ner blockkedjan igen</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>Använd UPnP för att mappa den lyssnande porten (förvalt: 1 när lyssning aktiverat och utan -proxy)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>Varning: Onormalt antal block block genererade. %d block mottagna senaste %d timmarna (%d förväntade)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>Varning: Kontrollera din närverksanslutning. %d block mottagna senaste %d timmarna, (%d förväntade)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Varning: Nätverket verkar inte vara helt överens! Några miners verkar ha problem.</translation>
</message>
@@ -2981,14 +1887,18 @@ Var vänlig och försök igen.</translation>
<translation>Varning: Vi verkar inte helt överens med våra peers! Du kan behöva uppgradera, eller andra noder kan behöva uppgradera.</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>Varning: wallet.dat korrupt, datan har räddats! Den ursprungliga wallet.dat har sparas som wallet.{timestamp}.bak i %s; om ditt saldo eller transaktioner är felaktiga ska du återställa från en säkerhetskopia.</translation>
- </message>
- <message>
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
<translation>Vitlista klienter som ansluter från angivna nätmasker eller IP-adresser. Kan specificeras flera gånger.</translation>
</message>
<message>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>Du måste återskapa databasen med -reindex-chainstate för att ändra -txindex</translation>
+ </message>
+ <message>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s är korrupt, räddning misslyckades</translation>
+ </message>
+ <message>
<source>-maxmempool must be at least %d MB</source>
<translation>-maxmempool måste vara minst %d MB</translation>
</message>
@@ -2997,10 +1907,26 @@ Var vänlig och försök igen.</translation>
<translation>&lt;category&gt; Kan vara:</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>Lägg till kommentar till user-agent-strängen</translation>
+ </message>
+ <message>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Försök att rädda privata nycklar från en korrupt plånbok vid uppstart</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>Block skapande inställningar:</translation>
</message>
<message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>Kan inte matcha -%s adress: '%s'</translation>
+ </message>
+ <message>
+ <source>Change index out of range</source>
+ <translation>Förändringsindexet utom räckhåll</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>Koppla enbart upp till den/de specificerade noden/noder</translation>
</message>
@@ -3009,6 +1935,10 @@ Var vänlig och försök igen.</translation>
<translation>Anslutningsalternativ:</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Copyright (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>Korrupt blockdatabas har upptäckts</translation>
</message>
@@ -3041,6 +1971,10 @@ Var vänlig och försök igen.</translation>
<translation>Aktivera publicering av råa transaktioner i &lt;adress&gt;</translation>
</message>
<message>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>Aktivera byte av transaktioner i minnespoolen (förvalt: %u)</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Fel vid initiering av blockdatabasen</translation>
</message>
@@ -3049,6 +1983,22 @@ Var vänlig och försök igen.</translation>
<translation>Fel vid initiering av plånbokens databasmiljö %s!</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>Fel vid inläsning av %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>Fel vid inläsningen av %s: Plånboken är koruppt</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>Fel vid inläsningen av %s: Plånboken kräver en senare version av %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: You can't disable HD on a already existing HD wallet</source>
+ <translation>Fel vid laddning av %s: Du kan inte avaktivera HD på en redan existerande HD plånbok</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>Fel vid inläsning av blockdatabasen</translation>
</message>
@@ -3073,14 +2023,38 @@ Var vänlig och försök igen.</translation>
<translation>Felaktig eller inget genesisblock hittades. Fel datadir för nätverket?</translation>
</message>
<message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>Initieringschecken fallerade. %s stängs av.</translation>
+ </message>
+ <message>
<source>Invalid -onion address: '%s'</source>
<translation>Ogiltig -onion adress:'%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>Ogiltigt belopp för -%s=&lt;belopp&gt;:'%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>Ogiltigt belopp för -fallbackfee=&lt;belopp&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
<translation>Håll minnespoolen över transaktioner under &lt;n&gt; megabyte (förvalt: %u)</translation>
</message>
<message>
+ <source>Loading banlist...</source>
+ <translation>Laddar svarta listan...</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>Plats för authcookie (förvalt: datamapp)</translation>
+ </message>
+ <message>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Minimum antal byte per sigop i transaktioner som vi reläar och bryter (förvalt: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>Inte tillräckligt med filbeskrivningar tillgängliga.</translation>
</message>
@@ -3089,6 +2063,14 @@ Var vänlig och försök igen.</translation>
<translation>Anslut enbart till noder i nätverket &lt;net&gt; (IPv4, IPv6 eller onion)</translation>
</message>
<message>
+ <source>Print this help message and exit</source>
+ <translation>Visa denna hjälptext och avsluta</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>Visa version och avsluta</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>Beskärning kan inte konfigureras med ett negativt värde.</translation>
</message>
@@ -3097,10 +2079,26 @@ Var vänlig och försök igen.</translation>
<translation>Beskärningsläge är inkompatibel med -txindex.</translation>
</message>
<message>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>Återskapa blockkedjans status och index från blk*.dat filer på disken</translation>
+ </message>
+ <message>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>Återskapa blockkedjans status från aktuella indexerade block</translation>
+ </message>
+ <message>
+ <source>Rewinding blocks...</source>
+ <translation>Spolar tillbaka blocken...</translation>
+ </message>
+ <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Sätt databasens cachestorlek i megabyte (%d till %d, förvalt: %d)</translation>
</message>
<message>
+ <source>Set maximum block cost (default: %d)</source>
+ <translation>Sätt maximal blockkostnad (förvalt: %d)</translation>
+ </message>
+ <message>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>Sätt maximal blockstorlek i byte (förvalt: %d)</translation>
</message>
@@ -3109,6 +2107,14 @@ Var vänlig och försök igen.</translation>
<translation>Ange plånboksfil (inom datakatalogen)</translation>
</message>
<message>
+ <source>The source code is available from %s.</source>
+ <translation>Källkoden är tillgänglig från %s.</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>Det går inte att binda till %s på den här datorn. %s är förmodligen redan igång.</translation>
+ </message>
+ <message>
<source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Argumentet -benchmark stöds inte och ignoreras, använd -debug=bench.</translation>
</message>
@@ -3141,16 +2147,16 @@ Var vänlig och försök igen.</translation>
<translation>Plånbok %s ligger utanför datakatalogen %s</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>Plånboksinställningar:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Plånbokens Avlusnings/Testnings optioner:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>Varning: Denna version är föråldrad; uppgradering krävs!</translation>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>Plånboken behöver sparas om: Starta om %s för att fullfölja</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>
+ <source>Wallet options:</source>
+ <translation>Plånboksinställningar:</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>
@@ -3165,10 +2171,6 @@ Var vänlig och försök igen.</translation>
<translation>Bind till angiven adress för att lyssna på JSON-RPC-anslutningar. Använd [värd]:port-format for IPv6. Detta alternativ kan anges flera gånger (förvalt: bind till alla gränssnitt)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Kan inte låsa data-mappen %s. Bitcoin Core körs förmodligen redan.</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>
@@ -3221,6 +2223,10 @@ Var vänlig och försök igen.</translation>
<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>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation>Använd hierarkisk deterministisk nyckel generering (HD) efter BIP32. Har bara effekt under plånbokens skapande/första användning.</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>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>
@@ -3237,38 +2243,14 @@ Var vänlig och försök igen.</translation>
<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>Always relay transactions received from whitelisted peers (default: %d)</source>
- <translation>Vidarebefordra alltid transaktioner från vitlistade noder (förval: %d)</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>Försök att rädda privata nycklar från en korrupt wallet.dat vid uppstart</translation>
- </message>
- <message>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation>Skapa automatiskt dold tjänst i Tor (förval: %d)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Kan inte matcha -whitebind adress: '%s'</translation>
- </message>
- <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Anslut genom SOCKS5 proxy</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Copyright (C) 2009-%i Bitcoin Core Utvecklarna</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>
@@ -3281,22 +2263,6 @@ Var vänlig och försök igen.</translation>
<translation>Information</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ogiltigt belopp för -mintxfee=&lt;belopp&gt;: '%s'</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>Ogiltigt belopp för -paytxfee=&lt;belopp&gt;:'%s' (måste vara minst %s)</translation>
</message>
@@ -3321,14 +2287,6 @@ Var vänlig och försök igen.</translation>
<translation>RPC-serveralternativ:</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>Receive and display P2P network alerts (default: %u)</source>
- <translation>Mottag och visa P2P nätverksvarningar (förvalt: %u)</translation>
- </message>
- <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation>Minskar -maxconnections från %d till %d, på grund av systembegränsningar.</translation>
</message>
@@ -3401,14 +2359,14 @@ Var vänlig och försök igen.</translation>
<translation>Användarnamn för JSON-RPC-anslutningar</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Kontot behöver sparas om: Starta om Bitcoin Core för att fullfölja</translation>
- </message>
- <message>
<source>Warning</source>
<translation>Varning</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Varning: okända nya regler aktiverade (versionsbit %i)</translation>
+ </message>
+ <message>
<source>Whether to operate in a blocks only mode (default: %u)</source>
<translation>Ska allt göras i endast block-läge (förval: %u)</translation>
</message>
@@ -3421,10 +2379,6 @@ Var vänlig och försök igen.</translation>
<translation>ZeroMQ-alternativ för notiser:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat korrupt, räddning misslyckades</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Lösenord för JSON-RPC-anslutningar</translation>
</message>
@@ -3433,10 +2387,6 @@ Var vänlig och försök igen.</translation>
<translation>Exekvera kommando när det bästa blocket ändras (%s i cmd är utbytt av blockhash)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Det här hjälp medelandet</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Tillåt DNS-sökningar för -addnode, -seednode och -connect</translation>
</message>
@@ -3445,10 +2395,6 @@ Var vänlig och försök igen.</translation>
<translation>Laddar adresser...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>Fel vid inläsningen av wallet.dat: Plånboken är skadad</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 = spara tx metadata t.ex. kontoägare och betalningsbegäransinformation, 2 = släng tx metadata)</translation>
</message>
@@ -3465,8 +2411,8 @@ Var vänlig och försök igen.</translation>
<translation>Håll inte transaktioner i minnespoolen längre än &lt;n&gt; timmar (förvalt: %u)</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Fel vid läsning av wallet.dat! Alla nycklar lästes korrekt, men transaktionsdata eller adressbokens poster kanske saknas eller är felaktiga.</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Avgifter (i %s/kB) mindre än detta anses vara nollavgifter vid skapande av transaktion (standard: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3485,6 +2431,10 @@ Var vänlig och försök igen.</translation>
<translation>Skriv ut avlusningsinformation (förvalt: %u, att ange &lt;category&gt; är frivilligt)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Stöd filtrering av block och transaktioner med bloomfilter (standard: %u)</translation>
+ </message>
+ <message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<translation>Total längd på strängen för nätverksversion (%i) överskrider maxlängden (%i). Minska numret eller storleken på uacomments.</translation>
</message>
@@ -3497,24 +2447,32 @@ Var vänlig och försök igen.</translation>
<translation>Argumentet -socks hittades och stöds inte. Det är inte längre möjligt att sätta SOCKS-version längre, bara SOCKS5-proxy stöds.</translation>
</message>
<message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Argumentet -whitelistalwaysrelay stöds inte utan ignoreras, använd -whitelistrelay och/eller -whitelistforcerelay.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Använd separat SOCKS5 proxy för att nå kollegor via dolda tjänster i Tor (förvalt: -%s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(förvalt: %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Användarnamn och hashat lösenord för JSON-RPC-anslutningar. Fältet &lt;userpw&gt; kommer i formatet: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Ett kanoniskt pythonskript finns inkluderat i share/rpcuser. Detta alternativ kan anges flera gånger</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Sök alltid efter klientadresser med DNS sökningen (förvalt: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>Varning: Okända blockversioner bryts! Det är möjligt att okända regler används</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Fel vid inläsning av plånboksfilen wallet.dat</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Varning: Plånboksfilen var korrupt, datat har räddats! Den ursprungliga %s har sparas som %s i %s. Om ditt saldo eller transaktioner är felaktiga bör du återställa från en säkerhetskopia.</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Generera mynt (förvalt: %u)</translation>
+ <source>(default: %s)</source>
+ <translation>(förvalt: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Sök alltid efter klientadresser med DNS sökningen (förvalt: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3601,18 +2559,6 @@ Var vänlig och försök igen.</translation>
<translation>Okänt nätverk som anges i -onlynet: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Kan inte matcha -bind adress: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Kan inte matcha -externalip adress: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Ogiltigt belopp för -paytxfee=&lt;belopp&gt;:'%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Otillräckligt med bitcoins</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ta.ts b/src/qt/locale/bitcoin_ta.ts
new file mode 100644
index 0000000000..921171c544
--- /dev/null
+++ b/src/qt/locale/bitcoin_ta.ts
@@ -0,0 +1,688 @@
+<TS language="ta" version="2.1">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Create a new address</source>
+ <translation>ஒர௠பà¯à®¤à®¿à®¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;பà¯à®¤à®¿à®¯</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;நகலà¯</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>&amp;மூடà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>&amp;à®à®±à¯à®±à¯à®®à®¤à®¿</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;அழி</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ </context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation>IP/Netmask</translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Overview</source>
+ <translation>&amp;கணà¯à®£à¯‡à®¾à®Ÿà¯à®Ÿà®®à¯</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation>&amp;பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®•à®³à¯</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation>&amp;வெளியேறà¯</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation>விலகà¯</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>&amp;Qt-஠பறà¯à®±à®¿</translation>
+ </message>
+ <message>
+ <source>&amp;Options...</source>
+ <translation>&amp;விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯...</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet...</source>
+ <translation>&amp;எனà¯à®•à¯à®°à®¿à®ªà¯à®Ÿà¯ பணபà¯à®ªà¯ˆ...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI...</source>
+ <translation>&amp;URI-஠திற</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message...</source>
+ <translation>&amp;செயà¯à®¤à®¿à®¯à¯ˆ சரிசெயà¯...</translation>
+ </message>
+ <message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>பணபà¯à®ªà¯ˆ</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;அனà¯à®ªà¯à®ªà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation>&amp;பெறà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <translation>&amp;காடà¯à®Ÿà¯/மறை</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;கோபà¯à®ªà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation>&amp;அமைபà¯à®ªà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;உதவி</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation><numerusform>%n மணி</numerusform><numerusform>%n மணி</numerusform></translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation>%1 மறà¯à®±à¯à®®à¯ %2</translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation>%1 பினà¯à®©à®¾à®²à¯</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>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>Address: %1
+</source>
+ <translation>à®®à¯à®•à®µà®°à®¿: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation>அனà¯à®ªà¯à®ªà®¿à®¯ பரிவரà¯à®¤à¯à®¤à®©à¯ˆ</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Quantity:</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>
+ <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>
+</context>
+<context>
+ <name>EditAddressDialog</name>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ <message>
+ <source>name</source>
+ <translation>பெயரà¯</translation>
+ </message>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</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>
+ <message>
+ <source>URI:</source>
+ <translation>URI:</translation>
+ </message>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Options</source>
+ <translation>விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Main</source>
+ <translation>&amp;தலைமை</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation>MB</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>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation>&amp;சாளரமà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation>&amp;காடà¯à®Ÿà¯</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;சரி</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;ரதà¯à®¤à¯</translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation>இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>none</translation>
+ </message>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ <message>
+ <source>Form</source>
+ <translation>படிவமà¯</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation>கிடைகà¯à®•à®•à¯‚டிய:</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation>நிலà¯à®µà¯ˆà®¯à®¿à®²à¯:</translation>
+ </message>
+ <message>
+ <source>Immature:</source>
+ <translation>à®®à¯à®¤à®¿à®°à®¾à®¤:</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation>மீதி</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation>மொதà¯à®¤à®®à¯:</translation>
+ </message>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ <message>
+ <source>User Agent</source>
+ <translation>பயனர௠மà¯à®•à®µà®°à¯</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>பிங௠நேரமà¯</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Amount</source>
+ <translation>விலை</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation>%1 d</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation>%1 h</translation>
+ </message>
+ <message>
+ <source>%1 s</source>
+ <translation>%1 s</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation>N/A</translation>
+ </message>
+ <message>
+ <source>%1 ms</source>
+ <translation>%1 ms</translation>
+ </message>
+</context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>N/A</source>
+ <translation>N/A</translation>
+ </message>
+ <message>
+ <source>Client version</source>
+ <translation>வாடிகà¯à®•à¯ˆà®¯à®¾à®³à®°à¯ பதிபà¯à®ªà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Information</source>
+ <translation>&amp;தகவலà¯</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>பிணையமà¯</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>பெயரà¯</translation>
+ </message>
+ <message>
+ <source>Memory Pool</source>
+ <translation>நினைவக கà¯à®³à®®à¯</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>நினைவக பயனà¯à®ªà®¾à®Ÿà¯</translation>
+ </message>
+ <message>
+ <source>Sent</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>Ping 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;Clear</source>
+ <translation>&amp;வழà¯à®¨à¯€à®•à¯à®•à¯</translation>
+ </message>
+ <message>
+ <source>Totals</source>
+ <translation>மொதà¯à®¤à®®à¯</translation>
+ </message>
+ <message>
+ <source>In:</source>
+ <translation>உளà¯à®³à¯‡:</translation>
+ </message>
+ <message>
+ <source>Out:</source>
+ <translation>வெளியே:</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;மணி</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;நாளà¯</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;வாரமà¯</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;ஆணà¯à®Ÿà¯</translation>
+ </message>
+ <message>
+ <source>%1 B</source>
+ <translation>%1 B</translation>
+ </message>
+ <message>
+ <source>%1 KB</source>
+ <translation>%1 KB</translation>
+ </message>
+ <message>
+ <source>%1 MB</source>
+ <translation>%1 MB</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation>%1 GB</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation>via %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>Yes</source>
+ <translation>ஆமà¯</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>மறà¯</translation>
+ </message>
+ <message>
+ <source>Unknown</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>Clear</source>
+ <translation>நீகà¯à®•à¯</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation>காணà¯à®ªà®¿</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>நீகà¯à®•à¯</translation>
+ </message>
+</context>
+<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>நகலை விலாசமà¯</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image...</source>
+ <translation>&amp;படதà¯à®¤à¯ˆ சேமி...</translation>
+ </message>
+</context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message>
+ <source>Quantity:</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>Choose...</source>
+ <translation>தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯...</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation>மறை</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>இயலà¯à®ªà®¾à®©</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>வேகமாக</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation>மீதி:</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation>&amp;அனà¯à®ªà¯à®ªà¯</translation>
+ </message>
+</context>
+<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation>&amp;தொகை:</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation>&amp;சிடà¯à®Ÿà¯ˆ:</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation>செயà¯à®¤à®¿:</translation>
+ </message>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation>கையொபà¯à®ªà®®à¯</translation>
+ </message>
+ </context>
+<context>
+ <name>SplashScreen</name>
+ </context>
+<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>KB/s</source>
+ <translation>KB/s</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
+ </context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin மையமà¯</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(default: %u)</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>தகவலà¯</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(default: %s)</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>தவறà¯</translation>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_th_TH.ts b/src/qt/locale/bitcoin_th_TH.ts
index 75fdfc5bdf..34c7526341 100644
--- a/src/qt/locale/bitcoin_th_TH.ts
+++ b/src/qt/locale/bitcoin_th_TH.ts
@@ -2,40 +2,53 @@
<context>
<name>AddressBookPage</name>
<message>
+ <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>&amp;สร้างใหม่</translation>
+ </message>
+ <message>
<source>Copy the currently selected address to the system clipboard</source>
<translation>คัดลอà¸à¸—ี่อยู่ที่ถูà¸à¹€à¸¥à¸·à¸­à¸à¹„ปยัง คลิปบอร์ดของระบบ</translation>
</message>
<message>
- <source>&amp;Delete</source>
- <translation>&amp;ลบ</translation>
+ <source>&amp;Copy</source>
+ <translation>&amp;คัดลอà¸</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>คั่นไฟล์ด้วยเครื่องหมายจุลภาค (*.csv)</translation>
+ <source>C&amp;lose</source>
+ <translation>&amp;ปิด</translation>
</message>
- </context>
-<context>
- <name>AddressTableModel</name>
<message>
- <source>Label</source>
- <translation>ชื่อ</translation>
+ <source>Delete the currently selected address from the list</source>
+ <translation>ลบที่อยู่ที่เลือà¸à¹„ว้ในขณะนี้จาà¸à¸£à¸²à¸¢à¸à¸²à¸£</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>ส่งออà¸à¸‚้อมูลที่อยู่ในà¹à¸—็บไปที่ไฟล์</translation>
</message>
<message>
- <source>Address</source>
- <translation>ที่อยู่</translation>
+ <source>&amp;Export</source>
+ <translation>&amp;ส่งออà¸</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(ไม่มีชื่อ)</translation>
+ <source>&amp;Delete</source>
+ <translation>&amp;ลบ</translation>
</message>
</context>
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation>ช่องสำหรับ รหัสผ่าน</translation>
+ </message>
+ <message>
<source>Enter passphrase</source>
<translation>ใส่รหัสผ่าน</translation>
</message>
@@ -47,101 +60,169 @@
<source>Repeat new passphrase</source>
<translation>à¸à¸£à¸¸à¸“าà¸à¸£à¸­à¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¹ƒà¸«à¸¡à¹ˆà¸­à¸µà¸à¸„รั้งหนึ่ง</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์ที่เข้ารหัส</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/Netmask (ตัวà¸à¸£à¸­à¸‡ IP)</translation>
</message>
<message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>à¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£à¸™à¸µà¹‰à¸•à¹‰à¸­à¸‡à¸¡à¸µà¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¸‚องคุณเพื่อปลดล็อคà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™</translation>
+ <source>Banned Until</source>
+ <translation>ห้าม จนถึง</translation>
</message>
+</context>
+<context>
+ <name>BitcoinGUI</name>
<message>
- <source>Unlock wallet</source>
- <translation>เปิดà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์</translation>
+ <source>Sign &amp;message...</source>
+ <translation>เซ็นต์ชื่อด้วย &amp;ข้อความ...</translation>
</message>
<message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>à¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£à¸™à¸µà¹‰à¸•à¹‰à¸­à¸‡à¸¡à¸µà¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¸‚องคุณในà¸à¸²à¸£à¸–อดรหัสà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™</translation>
+ <source>Synchronizing with network...</source>
+ <translation>à¸à¸³à¸¥à¸±à¸‡à¸—ำข้อมูลให้ตรงà¸à¸±à¸™à¸à¸±à¸šà¹€à¸„รือข่าย ...</translation>
</message>
<message>
- <source>Decrypt wallet</source>
- <translation>ถอดรหัสà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์</translation>
+ <source>&amp;Overview</source>
+ <translation>&amp;ภาพรวม</translation>
</message>
<message>
- <source>Change passphrase</source>
- <translation>เปลี่ยนรหัสผ่าน</translation>
+ <source>Node</source>
+ <translation>Node/โหนด</translation>
</message>
<message>
- <source>Confirm wallet encryption</source>
- <translation>ยืนยันà¸à¸²à¸£à¹€à¸‚้ารหัสà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์</translation>
+ <source>Show general overview of wallet</source>
+ <translation>à¹à¸ªà¸”งภาพรวมทั่วไปของà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™</translation>
</message>
<message>
- <source>Wallet encrypted</source>
- <translation>à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์ถูà¸à¹€à¸‚้ารหัสเรียบร้อยà¹à¸¥à¹‰à¸§</translation>
+ <source>&amp;Transactions</source>
+ <translation>&amp;à¸à¸²à¸£à¸—ำรายà¸à¸²à¸£</translation>
</message>
<message>
- <source>Wallet encryption failed</source>
- <translation>à¸à¸²à¸£à¹€à¸‚้ารหัสà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์ผิดพลาด</translation>
+ <source>Browse transaction history</source>
+ <translation>เรียà¸à¸”ูประวัติà¸à¸²à¸£à¸—ำธุรà¸à¸£à¸£à¸¡</translation>
</message>
<message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¹€à¸‚้ารหัสล้มเหลวเนื่องจาà¸à¸‚้อผิดพลาดภายใน à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¸‚องคุณไม่ได้เข้ารหัส</translation>
+ <source>E&amp;xit</source>
+ <translation>&amp;ออà¸</translation>
</message>
<message>
- <source>The supplied passphrases do not match.</source>
- <translation>รหัสผ่านที่คุณà¸à¸£à¸­à¸à¹„ม่ตรงà¸à¸±à¸™</translation>
+ <source>Quit application</source>
+ <translation>ออà¸à¸ˆà¸²à¸à¹‚ปรà¹à¸à¸£à¸¡</translation>
</message>
<message>
- <source>Wallet unlock failed</source>
- <translation>ปลดล็อคà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¸¥à¹‰à¸¡à¹€à¸«à¸¥à¸§</translation>
+ <source>&amp;About %1</source>
+ <translation>&amp;เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š %1</translation>
</message>
<message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>ป้อนรหัสผ่านสำหรับà¸à¸²à¸£à¸–อดรหัสà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¹„ม่ถูà¸à¸•à¹‰à¸­à¸‡</translation>
+ <source>Show information about %1</source>
+ <translation>à¹à¸ªà¸”งข้อมูล เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š %1</translation>
</message>
<message>
- <source>Wallet decryption failed</source>
- <translation>ถอดรหัสà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¸¥à¹‰à¸¡à¹€à¸«à¸¥à¸§</translation>
+ <source>About &amp;Qt</source>
+ <translation>เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š &amp;Qt</translation>
</message>
- </context>
-<context>
- <name>BanTableModel</name>
- </context>
-<context>
- <name>BitcoinGUI</name>
<message>
- <source>Synchronizing with network...</source>
- <translation>à¸à¸³à¸¥à¸±à¸‡à¸—ำข้อมูลให้ตรงà¸à¸±à¸™à¸à¸±à¸šà¹€à¸„รือข่าย ...</translation>
+ <source>Show information about Qt</source>
+ <translation>à¹à¸ªà¸”งข้อมูล เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š Qt</translation>
</message>
<message>
- <source>&amp;Overview</source>
- <translation>&amp;ภาพรวม</translation>
+ <source>&amp;Options...</source>
+ <translation>&amp;ตัวเลือà¸...</translation>
</message>
<message>
- <source>Show general overview of wallet</source>
- <translation>à¹à¸ªà¸”งภาพรวมทั่วไปของà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™</translation>
+ <source>Modify configuration options for %1</source>
+ <translation>ปรับปรุง ข้อมูลà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าตัวเลือภสำหรับ %1</translation>
</message>
<message>
- <source>&amp;Transactions</source>
- <translation>&amp;à¸à¸²à¸£à¸—ำรายà¸à¸²à¸£</translation>
+ <source>&amp;Encrypt Wallet...</source>
+ <translation>&amp;à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¹€à¸‚้ารหัส</translation>
</message>
<message>
- <source>Browse transaction history</source>
- <translation>เรียà¸à¸”ูประวัติà¸à¸²à¸£à¸—ำธุรà¸à¸£à¸£à¸¡</translation>
+ <source>&amp;Backup Wallet...</source>
+ <translation>&amp;สำรองà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™...</translation>
</message>
<message>
- <source>Quit application</source>
- <translation>ออà¸à¸ˆà¸²à¸à¹‚ปรà¹à¸à¸£à¸¡</translation>
+ <source>&amp;Change Passphrase...</source>
+ <translation>&amp;เปลี่ยนรหัสผ่าน...</translation>
</message>
<message>
- <source>&amp;Options...</source>
- <translation>&amp;ตัวเลือà¸...</translation>
+ <source>&amp;Sending addresses...</source>
+ <translation>&amp;ที่เà¸à¹‡à¸šà¹€à¸‡à¸´à¸™ ที่จะส่ง bitcoin</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>&amp;ที่เà¸à¹‡à¸šà¹€à¸‡à¸´à¸™ ที่จะรับ bitcoin</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI...</source>
+ <translation>เปิด &amp;URI</translation>
+ </message>
+ <message>
+ <source>Reindexing blocks on disk...</source>
+ <translation>à¸à¸³à¸¥à¸±à¸‡à¸—ำดัชนี ที่เà¸à¹‡à¸šà¸šà¸¥à¹‡à¸­à¸ ใหม่ ในดิสà¸à¹Œ...</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation>ส่ง coins ไปยัง ที่เà¸à¹‡à¸š Bitcoin</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;หน้าต่าง Debug</translation>
+ </message>
+ <message>
+ <source>Open debugging and diagnostic console</source>
+ <translation>เปิด à¹à¸œà¸¥à¸‡à¸„วบคุม debugging à¹à¸¥à¸° diagnostic</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message...</source>
+ <translation>&amp;ยืนยันข้อความ...</translation>
+ </message>
+ <message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;ส่ง</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation>&amp;รับ</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <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>เข้ารหัส private keys/ รหัสส่วนตัว สำหรับà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™à¸‚องท่าน</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation>เซ็นชื่อด้วยข้อความ ที่เà¸à¹‡à¸š Bitcoin เพื่อà¹à¸ªà¸”งว่าท่านเป็นเจ้าของ bitcoin นี้จริง</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation>ตรวจสอบ ข้อความ เพื่อให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸² à¸à¸²à¸£à¹€à¸‹à¹‡à¸™à¸•à¹Œà¸Šà¸·à¹ˆà¸­ ด้วยที่เà¸à¹‡à¸š Bitcoin à¹à¸¥à¹‰à¸§</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation>&amp;ไฟล์</translation>
</message>
@@ -157,17 +238,135 @@
<source>Tabs toolbar</source>
<translation>à¹à¸–บเครื่องมือ</translation>
</message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation>เรียà¸à¹€à¸à¹‡à¸š à¸à¸²à¸£à¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™ (สร้าง QR codes à¹à¸¥à¸° bitcoin: URIs)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation>à¹à¸ªà¸”งรายà¸à¸²à¸£ ที่เà¸à¹‡à¸šà¹€à¸‡à¸´à¸™à¸—ี่จะส่ง bitcoin ออภà¹à¸¥à¸°à¸›à¹‰à¸²à¸¢à¸Šà¸·à¹ˆà¸­ ที่ใช้ไปà¹à¸¥à¹‰à¸§</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation>à¹à¸ªà¸”งรายà¸à¸²à¸£ ที่เà¸à¹‡à¸šà¹€à¸‡à¸´à¸™à¸—ี่จะรับ bitcoin เข้า à¹à¸¥à¸°à¸›à¹‰à¸²à¸¢à¸Šà¸·à¹ˆà¸­ ที่ใช้ไปà¹à¸¥à¹‰à¸§</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;ตัวเลือภCommand-line</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n ที่ใช้งานà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­à¸à¸±à¸šà¹€à¸„รือข่าย Bitcoin</numerusform></translation>
+ <translation><numerusform>%n ช่องà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­à¸—ี่ใช้งานได้ เพื่อเชื่อมà¸à¸±à¸šà¹€à¸„รือข่าย Bitcoin</numerusform></translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk...</source>
+ <translation>à¸à¸²à¸£à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¸”ัชนีของบล็อภในดิสà¸à¹Œ...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>à¸à¸³à¸¥à¸±à¸‡à¸”ำเนินà¸à¸²à¸£à¸à¸±à¸šà¸šà¸¥à¹‡à¸­à¸à¹ƒà¸™à¸”ิสà¸à¹Œ...</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></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation><numerusform>%n ชั่วโมง</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation><numerusform>%n วัน</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation><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></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>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>à¹à¸ªà¸”ง %1 ข้อความช่วยเหลือ เพื่อà¹à¸ªà¸”งรายà¸à¸²à¸£ ตัวเลือà¸à¸—ี่เป็นไปได้สำหรับ Bitcoin command-line</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 ลูà¸à¸„้า</translation>
+ </message>
+ <message>
<source>Catching up...</source>
- <translation>จับได้...</translation>
+ <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>
@@ -187,15 +386,84 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
- <source>(no label)</source>
- <translation>(ไม่มีชื่อ)</translation>
+ <source>Coin Selection</source>
+ <translation>à¸à¸²à¸£à¹€à¸¥à¸·à¸­à¸ Coin</translation>
</message>
- </context>
+ <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>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>รับโดยป้ายชื่อ (label)</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>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -204,59 +472,323 @@
</message>
<message>
<source>&amp;Label</source>
- <translation>&amp;ชื่อ</translation>
+ <translation>&amp;ป้ายชื่อ</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;ที่อยู่</translation>
+ <translation>&amp;ที่เà¸à¹‡à¸š</translation>
+ </message>
+</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>Path already exists, and is not a directory.</source>
+ <translation>พาธ มีอยู่à¹à¸¥à¹‰à¸§ พาธนี่ไม่ใช่ไดเร็à¸à¸—อรี่</translation>
+ </message>
+ <message>
+ <source>Cannot create data directory here.</source>
+ <translation>ไม่สามารถสร้างไดเร็à¸à¸—อรี่ข้อมูลที่นี่</translation>
+ </message>
+</context>
+<context>
+ <name>HelpMessageDialog</name>
+ <message>
+ <source>version</source>
+ <translation>เวอร์ชั่น</translation>
+ </message>
+ <message>
+ <source>(%1-bit)</source>
+ <translation>(%1-บิท)</translation>
</message>
<message>
- <source>New receiving address</source>
- <translation>ที่อยู่ผู้รับใหม่</translation>
+ <source>About %1</source>
+ <translation>เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š %1</translation>
</message>
<message>
- <source>New sending address</source>
- <translation>ที่อยู่ผู้ส่งใหม่</translation>
+ <source>Command-line options</source>
+ <translation>ตัวเลือภCommand-line</translation>
</message>
<message>
- <source>Edit receiving address</source>
- <translation>à¹à¸à¹‰à¹„ขที่อยู่ผู้รับ</translation>
+ <source>Usage:</source>
+ <translation>วิธีใช้งาน:</translation>
</message>
<message>
- <source>Edit sending address</source>
- <translation>à¹à¸à¹‰à¹„ขที่อยู่ผู้ส่ง</translation>
+ <source>command-line options</source>
+ <translation>ตัวเลือภcommand-line</translation>
</message>
<message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>ป้อนที่อยู่ "%1" ที่มีอยู่à¹à¸¥à¹‰à¸§à¹ƒà¸™à¸ªà¸¡à¸¸à¸”ที่อยู่</translation>
+ <source>UI Options:</source>
+ <translation>ตัวเลือภUI:</translation>
</message>
<message>
- <source>Could not unlock wallet.</source>
- <translation>ไม่สามารถปลดล็อคà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™</translation>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>เลือà¸à¹„ดเร็à¸à¸—อรี่ข้อมูลตั้งà¹à¸•à¹ˆà¹€à¸£à¸´à¹ˆà¸¡à¸•à¹‰à¸™à¸ªà¸•à¸²à¸£à¹Œà¸—อัพ (ค่าเริ่มต้น: %u)</translation>
</message>
<message>
- <source>New key generation failed.</source>
- <translation>สร้างà¸à¸¸à¸à¹à¸ˆà¹ƒà¸«à¸¡à¹ˆà¸¥à¹‰à¸¡à¹€à¸«à¸¥à¸§</translation>
+ <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 สำหรับเรียà¸à¸à¸²à¸£à¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™ (ค่าเริ่มต้น: -system-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>à¹à¸ªà¸”ง splash screen ตอนเริ่มต้น (ค่าเริ่มต้น: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>รีเซตà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าทั้งหมดใน GUI</translation>
</message>
</context>
<context>
- <name>FreespaceChecker</name>
- </context>
-<context>
- <name>HelpMessageDialog</name>
- </context>
-<context>
<name>Intro</name>
- </context>
+ <message>
+ <source>Welcome</source>
+ <translation>ยินดีต้อนรับ</translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation>ยินดีต้องรับสู่ %1</translation>
+ </message>
+ <message>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>นี่เป็นà¸à¸²à¸£à¸£à¸±à¸™à¹‚ปรà¹à¸à¸£à¸¡à¸„รั้งà¹à¸£à¸ ท่านสามารถเลือภว่าจะเà¸à¹‡à¸šà¸‚้อมูลไว้ที่ %1</translation>
+ </message>
+ <message>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 จะดาวน์โหลดà¹à¸¥à¸°à¹€à¸à¹‡à¸šà¸à¸­à¸›à¸›à¸µà¹‰à¸Šà¸¸à¸”หนึ่งของ บล็อà¸à¹€à¸Šà¸™ Bitcoin ไว้ ข้อมูลขนานอย่างน้อย %2GB จะเà¸à¹‡à¸šà¹„ว้ในไดเร็à¸à¸—อรี่นี้ à¹à¸¥à¸°à¸‚้อมูลจะมีขนาดใหà¸à¹ˆà¸‚ึ้นเรื่อยๆ à¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™ จะเà¸à¹‡à¸šà¹„ว้ในไดเร็à¸à¸—อรี่นี้ด้วย</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>Error: Specified data directory "%1" cannot be created.</source>
+ <translation>ข้อผิดพลาด: ไดเร็à¸à¸—อรี่ข้อมูลที่ต้องà¸à¸²à¸£ "%1" ไม่สามารถสร้างได้</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>ข้อผิดพลาด</translation>
+ </message>
+ <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>
- </context>
+ <message>
+ <source>Open URI</source>
+ <translation>เปิด URI</translation>
+ </message>
+ <message>
+ <source>Open payment request from URI or file</source>
+ <translation>เปิด à¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¸à¸²à¸£à¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™ จาภURI หรือ ไฟล์</translation>
+ </message>
+ <message>
+ <source>URI:</source>
+ <translation>URI:</translation>
+ </message>
+ <message>
+ <source>Select payment request file</source>
+ <translation>เลือภไฟล์à¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¸à¸²à¸£à¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
<source>Options</source>
<translation>ตัวเลือà¸</translation>
</message>
+ <message>
+ <source>&amp;Main</source>
+ <translation>&amp;หลัà¸</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>เริ่มต้นอัตโนมัติ %1 หลังจาภล็อà¸à¸­à¸´à¸™ เข้าสู่ระบบà¹à¸¥à¹‰à¸§</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;เริ่ม %1 ในà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¸£à¸°à¸šà¸š</translation>
+ </message>
+ <message>
+ <source>Size of &amp;database cache</source>
+ <translation>ขนาดของ &amp;database cache</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation>จำนวนของสคริปท์ &amp;verification threads</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 à¹à¸­à¸”เดส ของ proxy (เช่น 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>มินิไมซ์à¹à¸­à¸ž à¹à¸—นà¸à¸²à¸£à¸­à¸­à¸à¸ˆà¸²à¸à¹à¸­à¸žà¸žà¸¥à¸´à¹€à¸„ชั่น เมื่อวินโดว์ได้รับà¸à¸²à¸£à¸›à¸´à¸” เมื่อเลือà¸à¸•à¸±à¸§à¹€à¸¥à¸·à¸­à¸à¸™à¸µà¹‰ à¹à¸­à¸žà¸žà¸¥à¸´à¹€à¸„ชั่น จะถูà¸à¸›à¸´à¸” à¸à¹‡à¸•à¹ˆà¸­à¹€à¸¡à¸·à¹ˆà¸­ มีà¸à¸²à¸£à¹€à¸¥à¸·à¸­à¸à¹€à¸¡à¸™à¸¹ Exit/ออà¸à¸ˆà¸²à¸à¸£à¸°à¸šà¸š เท่านั้น</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 à¹à¸šà¸šà¸­à¸·à¹ˆà¸™ (ยà¸à¸•à¸±à¸§à¸­à¸¢à¹ˆà¸²à¸‡ เอ็à¸à¸žà¸¥à¸­à¹€à¸¥à¸­à¸£à¹Œà¸šà¸¥à¹‡à¸­à¸) ที่อยู่ใน เมนูรายà¸à¸²à¸£ ลำดับ %s ใน URL จะถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸”้วย รายà¸à¸²à¸£à¹à¸®à¸Š URL ที่เป็นà¹à¸šà¸šà¸«à¸¥à¸²à¸¢à¹†à¸­à¸±à¸™ จะถูà¸à¹à¸¢à¸ โดย เครื่องหมายเส้นบาร์ตั้ง |</translation>
+ </message>
+ <message>
+ <source>Third party transaction URLs</source>
+ <translation>URI รายà¸à¸²à¸£ à¹à¸šà¸šà¸‚องเจ้าอื่นๆ</translation>
+ </message>
+ <message>
+ <source>Active command-line options that override above options:</source>
+ <translation>ตัวเลือภcommand-line à¹à¸­à¸à¸—ีฟอยู่นี้ จะà¹à¸—นที่ ตัวเลือà¸à¸”้านบนนี้:</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>(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>
+ <message>
+ <source>Expert</source>
+ <translation>ผู้เชี่ยวชาà¸</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation>เปิดใช้ coin &amp; รูปà¹à¸šà¸šà¸à¸²à¸£à¸„วบคุม</translation>
+ </message>
+ <message>
+ <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
+ <translation>หาà¸à¸—่านไม่เปิดใช้ à¸à¸²à¸£à¹ƒà¸Šà¹‰à¹€à¸‡à¸´à¸™à¸—อนที่ยังไม่ยืนยัน เงินทอนจาà¸à¸à¸²à¸£à¸—ำรายà¸à¸²à¸£à¸ˆà¸°à¹„ม่สามารถใช้ได้ จนà¸à¸§à¹ˆà¸²à¸£à¸²à¸¢à¸à¸²à¸£à¸—ี่ทำà¸à¸²à¸£ จะได้รับà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸«à¸™à¸¶à¹ˆà¸‡à¸„รั้ง à¹à¸¥à¸°à¸ˆà¸°à¸à¸£à¸°à¸—บà¸à¸²à¸£à¸„ำนวณยอดคงเหลือของท่านด้วย</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 ไคล์เอ็นท์พอร์ต/client port บน router โดยอัตโนมัติ วิธีนี้ใช้ได้เมื่อ router สนับสนุน UPnP à¹à¸¥à¸°à¸ªà¸–านะเปิดใช้งาน</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation>จองพอร์ต โดยใช้ &amp;UPnP</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>เชื่อมต่อà¸à¸±à¸š Bitcoin เน็ตเวิร์ภผ่านพร็อà¸à¸‹à¸µà¹ˆà¹à¸šà¸š 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;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation>&amp;พอร์ต</translation>
+ </message>
+ <message>
+ <source>Port of the proxy (e.g. 9050)</source>
+ <translation>พอร์ตของพร็อà¸à¸‹à¸µà¹ˆ (ตัวอย่าง 9050)</translation>
+ </message>
+ <message>
+ <source>Used for reaching peers via:</source>
+ <translation>ใช้ในà¸à¸²à¸£à¹€à¸‚้าถึงอีà¸à¸à¹ˆà¸²à¸¢à¸«à¸™à¸¶à¹ˆà¸‡ peer โดย:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>à¹à¸ªà¸”ง หาà¸à¹ƒà¸Šà¹‰à¸žà¸£à¹‡à¸­à¸à¸‹à¸µà¹ˆ SOCKS5 ที่เป็นค่าเริ่มต้น เพื่อเข้าถึง peer อีà¸à¸à¹ˆà¸²à¸¢ ผ่านทางเน็ตเวิร์à¸à¸Šà¸™à¸´à¸”นี้</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>เชื่อมต่อà¸à¸±à¸š เครือข่าย Bitcoin ผ่านทาง พร้อà¸à¸‹à¸µà¹ˆ SOCKS5 à¹à¸¢à¸à¸•à¹ˆà¸²à¸‡à¸«à¸²à¸ สำหรับ Tor เซอร์วิส</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>ใช้ พร็อà¸à¸‹à¸µà¹ˆ SOCKS5 à¹à¸¢à¸ เพื่อเข้าถึง peers ผ่าน Tor เซอร์วิสซ่อน:</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation>&amp;วันโดว์</translation>
+ </message>
+ <message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>&amp;ซ่อนไอคอน จาà¸à¹€à¸—รย์ระบบ</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>ซ่อนไอคอนเทรย์</translation>
+ </message>
+ <message>
+ <source>Show only a tray icon after minimizing the window.</source>
+ <translation>à¹à¸ªà¸”งเทรย์ไอคอน หลังมืนิไมส์วินโดว์ เท่านั้น</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
@@ -266,58 +798,73 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
- </context>
-<context>
- <name>QRImageWidget</name>
+ <message>
+ <source>Amount</source>
+ <translation>จำนวน</translation>
+ </message>
</context>
<context>
<name>RPCConsole</name>
</context>
<context>
<name>ReceiveCoinsDialog</name>
+ <message>
+ <source>&amp;Label:</source>
+ <translation>&amp;ชื่อ:</translation>
+ </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
<message>
- <source>Address</source>
- <translation>ที่อยู่</translation>
+ <source>Send Coins</source>
+ <translation>ส่งเหรียà¸</translation>
</message>
<message>
- <source>Label</source>
- <translation>ชื่อ</translation>
+ <source>Quantity:</source>
+ <translation>จำนวน:</translation>
</message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
<message>
- <source>Label</source>
- <translation>ชื่อ</translation>
+ <source>Bytes:</source>
+ <translation>ไบต์:</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(ไม่มีชื่อ)</translation>
+ <source>Amount:</source>
+ <translation>จำนวน:</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation>ส่งเหรียà¸</translation>
+ <source>Priority:</source>
+ <translation>ความเร่งด่วน</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>ค่าธรรมเนียม:</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(ไม่มีชื่อ)</translation>
+ <source>After Fee:</source>
+ <translation>ส่วนที่เหลือจาà¸à¸„่าธรรมเนียม:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>เงินทอน:</translation>
+ </message>
+ <message>
+ <source>Dust:</source>
+ <translation>เศษ:</translation>
</message>
</context>
<context>
<name>SendCoinsEntry</name>
+ <message>
+ <source>&amp;Label:</source>
+ <translation>&amp;ชื่อ:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -336,54 +883,28 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Label</source>
- <translation>ชื่อ</translation>
- </message>
+ <name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>TransactionView</name>
- <message>
- <source>Today</source>
- <translation>วันนี้</translation>
- </message>
+ <name>bitcoin-core</name>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>คั่นไฟล์ด้วยเครื่องหมายจุลภาค (*.csv)</translation>
+ <source>Options:</source>
+ <translation>ตัวเลือà¸:</translation>
</message>
<message>
- <source>Label</source>
- <translation>ชื่อ</translation>
+ <source>Information</source>
+ <translation>ข้อมูล</translation>
</message>
<message>
- <source>Address</source>
- <translation>ที่อยู่</translation>
+ <source>Warning</source>
+ <translation>คำเตือน</translation>
</message>
- </context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- </context>
-<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>ส่งเหรียà¸</translation>
+ <source>Error</source>
+ <translation>ข้อผิดพลาด</translation>
</message>
</context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
- <name>bitcoin-core</name>
- </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts
index 36ca1ab6fe..e3a811b504 100644
--- a/src/qt/locale/bitcoin_tr.ts
+++ b/src/qt/locale/bitcoin_tr.ts
@@ -26,10 +26,6 @@
<translation>K&amp;apat</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Adresi Kopyala</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Seçili adresi listeden sil</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Sil</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Bitcoin yollanacak adresi seç</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Bitcoin alınacak adresi seç</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>S&amp;eç</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>&amp;Gönderme adresleri...</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Alım adresleri</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>Bunlar ödemeleri göndermek için kullanacağınız Bitcoin adreslerinizdir. Bitcoin yollamadan önce miktarı ve alıcının alım adresini daima kontrol ediniz.</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>Bunlar ödemeleri almak için kullanacağınız Bitcoin adreslerinizdir. Her işlem için yeni bir alım adresi kullanmanız tavsiye edilir.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>&amp;Etiketi kopyala</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Düzenle</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Adres listesini dışa aktar</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Virgülle ayrılmış değerler dosyası (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Dışa aktarım başarısız oldu</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Adres listesinin %1 konumuna kaydedilmesi sırasında bir hata meydana geldi. Lütfen tekrar deneyin.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(etiket yok)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,99 +60,19 @@
<source>Repeat new passphrase</source>
<translation>Yeni parolayı tekrarlayınız</translation>
</message>
+</context>
+<context>
+ <name>BanTableModel</name>
<message>
- <source>Encrypt wallet</source>
- <translation>Cüzdanı şifrele</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Bu işlem cüzdan kilidini açmak için cüzdan parolanızı gerektirir.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Cüzdan kilidini aç</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Bu işlem cüzdanın şifrelemesini açmak için cüzdan parolasını gerektirir.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Cüzdanın şifrelemesini aç</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Parolayı değiştir</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation>Cüzdanın şifrelemesini teyit eder</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>Uyarı: Eğer cüzdanınızı şifrelerseniz ve parolanızı kaybederseniz, &lt;b&gt;TÜM BİTCOİNLERİNİZİ KAYBEDERSİNİZ&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Uyarı: Caps Lock tuşu faal durumda!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Cüzdan şifrelendi</translation>
- </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>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>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>
- <translation>Cüzdan şifrelemesi başarısız oldu</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Dahili bir hata sebebiyle cüzdan şifrelemesi başarısız oldu. Cüzdanınız şifrelenmedi.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Girilen parolalar birbirleriyle uyumlu deÄŸil.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Cüzdan kilidinin açılması başarısız oldu</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Cüzdan şifresinin açılması için girilen parola yanlıştı.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Cüzdan şifresinin açılması başarısız oldu</translation>
+ <source>IP/Netmask</source>
+ <translation>IP/AÄŸ maskesi</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Cüzdan parolası başarılı bir şekilde değiştirildi.</translation>
+ <source>Banned Until</source>
+ <translation>Şu vakte kadar yasaklı:</translation>
</message>
</context>
<context>
- <name>BanTableModel</name>
- </context>
-<context>
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
@@ -262,6 +111,14 @@
<translation>Uygulamadan çık</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>%1 &amp;hakkında</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>%1 hakkında bilgi göster</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>&amp;Qt hakkında</translation>
</message>
@@ -274,6 +131,10 @@
<translation>&amp;Seçenekler...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>%1 için yapılandırma ayarlarını değiştir</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>Cüzdanı &amp;şifrele...</translation>
</message>
@@ -298,14 +159,6 @@
<translation>&amp;URI aç...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Çekirdeği istemcisi</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>Bloklar diskten içe aktarılıyor...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>Diskteki bloklar yeniden endeksleniyor...</translation>
</message>
@@ -350,10 +203,6 @@
<translation>&amp;Al</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>Bitcoin Çekirdeği hakkında bilgi göster</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Göster / Sakla</translation>
</message>
@@ -390,22 +239,10 @@
<translation>Sekme araç çubuğu</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Çekirdeği</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>Ödeme talep et (QR kodu ve bitcoin URI'si oluşturur)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
@@ -421,15 +258,19 @@
<source>&amp;Command-line options</source>
<translation>&amp;Komut satırı seçenekleri</translation>
</message>
- <message>
- <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Bitcoin komut satırı seçeneklerinin listesini elde etmek için Bitcoin Çekirdeği yardım mesajını göster</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>Bitcoin şebekesine %n faal bağlantı</numerusform><numerusform>Bitcoin şebekesine %n faal bağlantı</numerusform></translation>
</message>
<message>
+ <source>Indexing blocks on disk...</source>
+ <translation>Bloklar diske indeksleniyor...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>Bloklar diske yazıdırılıyor...</translation>
+ </message>
+ <message>
<source>No block source available...</source>
<translation>Hiçbir blok kaynağı mevcut değil...</translation>
</message>
@@ -486,6 +327,14 @@
<translation>Güncel</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Olası Bitcoin komut satırı seçeneklerinin listesini görmek için %1 yardım mesajını göster</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 istemcisi</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>Aralık kapatılıyor...</translation>
</message>
@@ -537,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Şebeke hakkında uyarı</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -621,150 +463,6 @@
<source>Priority</source>
<translation>Öncelik</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Adresi kopyala</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Etiketi kopyala</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Meblağı kopyala</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Muamele kimliÄŸini kopyala</translation>
- </message>
- <message>
- <source>Lock unspent</source>
- <translation>Harcanmamışı kilitle</translation>
- </message>
- <message>
- <source>Unlock unspent</source>
- <translation>Harcanmamışın kilidini aç</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Miktarı kopyala</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Ãœcreti kopyala</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Ãœcretten sonrakini kopyala</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Baytları kopyala</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Önceliği kopyala</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Tozu kopyala</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Para üstünü kopyala</translation>
- </message>
- <message>
- <source>highest</source>
- <translation>azami</translation>
- </message>
- <message>
- <source>higher</source>
- <translation>daha yüksek</translation>
- </message>
- <message>
- <source>high</source>
- <translation>yüksek</translation>
- </message>
- <message>
- <source>medium-high</source>
- <translation>orta-yüksek</translation>
- </message>
- <message>
- <source>medium</source>
- <translation>orta</translation>
- </message>
- <message>
- <source>low-medium</source>
- <translation>düşük-orta</translation>
- </message>
- <message>
- <source>low</source>
- <translation>düşük</translation>
- </message>
- <message>
- <source>lower</source>
- <translation>daha düşük</translation>
- </message>
- <message>
- <source>lowest</source>
- <translation>asgari</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation>(%1 kilitlendi)</translation>
- </message>
- <message>
- <source>none</source>
- <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>
- <message>
- <source>yes</source>
- <translation>evet</translation>
- </message>
- <message>
- <source>no</source>
- <translation>hayır</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>
- <message>
- <source>Can vary +/- 1 byte per input.</source>
- <translation>Girdi başına +/- 1 bayt değişebilir.</translation>
- </message>
- <message>
- <source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Yüksek öncelikli muamelelerin bir bloğa dahil olmaları daha olasıdır.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(boÅŸ etiket)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation>%1 unsurundan para üstü (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(para üstü)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -788,38 +486,6 @@
<source>&amp;Address</source>
<translation>&amp;Adres</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Yeni alım adresi</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Yeni gönderi adresi</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Alım adresini düzenle</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Gönderi adresini düzenle</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Girilen "%1" adresi hâlihazırda adres defterinde mevcuttur.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Girilen "%1" adresi geçerli bir Bitcoin adresi değildir.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Cüzdan kilidi açılamadı.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Yeni anahtar oluşturulması başarısız oldu.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -847,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Çekirdeği</translation>
- </message>
- <message>
<source>version</source>
<translation>sürüm</translation>
</message>
@@ -859,8 +521,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Bitcoin Çekirdeği hakkında</translation>
+ <source>About %1</source>
+ <translation>%1 Hakkında</translation>
</message>
<message>
<source>Command-line options</source>
@@ -874,6 +536,34 @@
<source>command-line options</source>
<translation>komut satırı seçenekleri</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>Arayüz Seçenekleri:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Başlangıçta veri klasörü seç (varsayılan: %u)</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: %u)</source>
+ <translation>Başlatıldığında başlangıç ekranını göster (varsayılan: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>Grafik arayüzde yapılan tüm seçenek değişikliklerini sıfırla</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -882,16 +572,16 @@
<translation>HoÅŸ geldiniz</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>Bitcoin Çekirdeğine hoş geldiniz.</translation>
+ <source>Welcome to %1.</source>
+ <translation>%1'a hoÅŸ geldiniz.</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>Bu programı ilk kez başlattığınızdan dolayı Bitcoin Çekirdeğinin verilerini nereye saklayacağını seçebilirsiniz.</translation>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>Bu programın ilk kez başlatılmasından dolayı %1 yazılımının verilerini nerede saklayacağını seçebilirsiniz.</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 çekirdeği Bitcoin blok zincirinin bir kopyasını indirip saklayacaktır. Asgari %1GB bouyutunda veri bu klasörde saklanacak ve zamanla bu boyut artacaktır. Cüzdan da bu klasörde saklanacaktır. </translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1, Bitcoin blok zincirinin bir kopyasını indirecek ve saklayacaktır. Bu klasörde en az %2GB veri saklanacak ve bu zamanla artacaktır. Cüzdan da bu klasörde saklanacaktır.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -902,10 +592,6 @@
<translation>Özel bir veri klasörü kullan:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Çekirdeği</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Hata: belirtilen "%1" veri klasörü oluşturulamaz.</translation>
</message>
@@ -940,10 +626,6 @@
<source>Select payment request file</source>
<translation>Ödeme talebi dosyasını seç</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Açılacak ödeme talebi dosyasını seç</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -956,6 +638,14 @@
<translation>&amp;Esas ayarlar</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>Sistemde oturum açıldığında %1 programını otomatik olarak başlat.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>&amp;Açılışta %1 açılsın</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>&amp;Veritabanı tamponunun boyutu</translation>
</message>
@@ -984,10 +674,6 @@
<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>
@@ -1012,14 +698,6 @@
<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>
@@ -1072,10 +750,46 @@
<translation>Vekil sunucunun portu (mesela 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>Eşlere ulaşmak için kullanılır, şu yoluyla:</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Bu şebeke türü yoluyla eşlere bağlanmak için belirtilen varsayılan SOCKS5 vekil sunucusunun kullanılıp kullanılmadığını gösterir.</translation>
+ </message>
+ <message>
+ <source>IPv4</source>
+ <translation>IPv4</translation>
+ </message>
+ <message>
+ <source>IPv6</source>
+ <translation>IPv6</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation>Tor</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>Bitcoin şebekesine gizli Tor servisleri için ayrı bir SOCKS5 vekil sunucusu vasıtasıyla bağlan.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>Eşlere gizli Tor servisleri ile ulaşmak için ayrı SOCKS5 vekil sunucusu kullan:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>&amp;Pencere</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>İkonu sistem çekmecesinden &amp;sakla</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>Sistem çekmecesi ikonunu sakla</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Küçültüldükten sonra sadece çekmece ikonu göster.</translation>
</message>
@@ -1096,6 +810,10 @@
<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 %1.</source>
+ <translation>Kullanıcı arayüzünün dili burada belirtilebilir. Bu ayar %1 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>
@@ -1220,97 +938,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- <message>
- <source>URI handling</source>
- <translation>URI yönetimi</translation>
- </message>
- <message>
- <source>Invalid payment address %1</source>
- <translation>Geçersiz ödeme adresi %1</translation>
- </message>
- <message>
- <source>Payment request rejected</source>
- <translation>Ödeme talebi reddedildi</translation>
- </message>
- <message>
- <source>Payment request network doesn't match client network.</source>
- <translation>Ödeme talebi şebekesi istemci şebekesine denk gelmiyor.</translation>
- </message>
- <message>
- <source>Payment request is not initialized.</source>
- <translation>Ödeme talebi başlatılmamış.</translation>
- </message>
- <message>
- <source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Talep edilen %1 meblağında ödeme çok düşüktür (toz olarak kabul edilir).</translation>
- </message>
- <message>
- <source>Payment request error</source>
- <translation>Ödeme talebi hatası</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Bitcoin başlatılamadı: tıkla-ve-öde yöneticisi</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <translation>Ödeme talebini alma URL'i geçersiz: %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 okunamadı! Sebebi geçersiz bir Bitcoin adresi veya hatalı URI parametreleri olabilir.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation>Ödeme talebi dosyası yönetimi</translation>
- </message>
- <message>
- <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <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>Error communicating with %1: %2</source>
- <translation>%1 ile iletiÅŸimde hata: %2</translation>
- </message>
- <message>
- <source>Payment request cannot be parsed!</source>
- <translation>Ödeme talebi ayrıştırılamaz!</translation>
- </message>
- <message>
- <source>Bad response from server %1</source>
- <translation>%1 sunucusundan hatalı cevap</translation>
- </message>
- <message>
- <source>Payment acknowledged</source>
- <translation>Ödeme teyit edildi</translation>
- </message>
- <message>
- <source>Network request error</source>
- <translation>Şebeke talebi hatası</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1365,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>Resmi k&amp;aydet...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>Resmi &amp;kopyala</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>QR kodu kaydet</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG resim (*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>Ä°stemci ismi</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Mevcut deÄŸil</translation>
</message>
@@ -1410,14 +1014,14 @@
<translation>Genel</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Kullanılan OpenSSL sürümü</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Kullanılan BerkeleyDB sürümü</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation>Veri konumu</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Başlama zamanı</translation>
</message>
@@ -1442,8 +1046,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>Bellek Alanı</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Güncel muamele sayısı</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>Bellek kullanımı</translation>
</message>
<message>
<source>Received</source>
@@ -1458,10 +1070,18 @@
<translation>&amp;EÅŸler</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>Yasaklı eşler</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>Ayrıntılı bilgi görmek için bir eş seçin.</translation>
</message>
<message>
+ <source>Whitelisted</source>
+ <translation>Beyaz listedekiler</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Yön</translation>
</message>
@@ -1470,10 +1090,34 @@
<translation>Sürüm</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>Başlangıç Bloku</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation>Eşleşmiş Başlıklar</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation>EÅŸleÅŸmiÅŸ Bloklar</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>Kullanıcı Yazılımı</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Güncel veri klasöründen %1 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>Decrease font size</source>
+ <translation>Font boyutunu küçült</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>Yazıtipi boyutunu büyült</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Servisler</translation>
</message>
@@ -1498,6 +1142,14 @@
<translation>Ping Süresi</translation>
</message>
<message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation>Güncel olarak göze çarpan bir ping'in süresi.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation>Ping Beklemesi</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>Saat Farkı</translation>
</message>
@@ -1534,10 +1186,6 @@
<translation>Dışarı:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Derleme tarihi</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Hata ayıklama kütük dosyası</translation>
</message>
@@ -1546,8 +1194,36 @@
<translation>Konsolu temizle</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Bitcoin Çekirdeği RPC konsoluna hoş geldiniz.</translation>
+ <source>&amp;Disconnect Node</source>
+ <translation>Düğümle Bağlantıyı &amp;Kes</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>Düğümü şu süre için yasakla:</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation>1 &amp;saat</translation>
+ </message>
+ <message>
+ <source>1 &amp;day</source>
+ <translation>1 &amp;gün</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation>1 &amp;hafta</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation>1 &amp;yıl</translation>
+ </message>
+ <message>
+ <source>&amp;Unban Node</source>
+ <translation>Düğümün Yasağını Kald&amp;ır</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>%1 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>
@@ -1574,6 +1250,10 @@
<translation>%1 GB</translation>
</message>
<message>
+ <source>(node id: %1)</source>
+ <translation>(düğüm kimliği: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation>%1 vasıtasıyla</translation>
</message>
@@ -1672,18 +1352,6 @@
<source>Remove</source>
<translation>Kaldır</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Etiketi kopyala</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Mesajı kopyala</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Meblağı kopyala</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1703,73 +1371,6 @@
<source>&amp;Save Image...</source>
<translation>Resmi ka&amp;ydet...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>%1 unsuruna ödeme talep et</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>Ödeme bilgisi</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>MeblaÄŸ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaj</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Sonuç URI çok uzun, etiket ya da mesaj metnini kısaltmayı deneyiniz.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>URI'nin QR koduna kodlanmasında hata oluştu.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Tarih</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaj</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>MeblaÄŸ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(boÅŸ etiket)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(boÅŸ mesaj)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(boÅŸ meblaÄŸ)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1890,14 +1491,6 @@
<translation>çabuk</translation>
</message>
<message>
- <source>Send as zero-fee transaction if possible</source>
- <translation>Mümkünse ücretsiz muamele olarak gönder</translation>
- </message>
- <message>
- <source>(confirmation may take longer)</source>
- <translation>(teyit daha uzun süre alabilir)</translation>
- </message>
- <message>
<source>Send to multiple recipients at once</source>
<translation>Birçok alıcıya aynı anda gönder</translation>
</message>
@@ -1929,106 +1522,6 @@
<source>S&amp;end</source>
<translation>G&amp;önder</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Gönderiyi teyit ediniz</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 öğesinden %2 unsuruna</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation>Miktarı kopyala</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Meblağı kopyala</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation>Ãœcreti kopyala</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation>Ãœcretten sonrakini kopyala</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation>Baytları kopyala</translation>
- </message>
- <message>
- <source>Copy priority</source>
- <translation>Önceliği kopyala</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation>Para üstünü kopyala</translation>
- </message>
- <message>
- <source>or</source>
- <translation>veya</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>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation>Tutar bakiyenizden yüksektir.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Toplam, %1 muamele ücreti ilâve edildiğinde bakiyenizi geçmektedir.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation>Muamelenin oluşturulması başarısız oldu!</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>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 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>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>
- <translation>Uyarı: geçersiz Bitcoin adresi</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(boÅŸ etiket)</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation>Uyarı: geçersiz para üstü adresi</translation>
- </message>
- <message>
- <source>Copy dust</source>
- <translation>Tozu kopyala</translation>
- </message>
- <message>
- <source>Are you sure you want to send?</source>
- <translation>Göndermek istediğinizden emin misiniz?</translation>
- </message>
- <message>
- <source>added as transaction fee</source>
- <translation>muamele ücreti olarak eklendi</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2041,10 +1534,6 @@
<translation>&amp;Şu adrese öde:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Adres defterinize eklemek için bu adrese ilişik bir etiket giriniz</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Etiket:</translation>
</message>
@@ -2116,8 +1605,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Çekirdeği kapanıyor...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>%1 kapanıyor...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2210,70 +1699,10 @@
<source>Reset all verify message fields</source>
<translation>Tüm mesaj kontrolü alanlarını sıfırla</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>İmzayı oluşturmak için "Mesaj İmzala" unsurunu tıklayın</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Girilen adres geçersizdir.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation>Adresi kontrol edip tekrar deneyiniz.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation>Girilen adres herhangi bir anahtara iÅŸaret etmemektedir.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation>Cüzdan kilidinin açılması iptal edildi.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation>Girilen adres için özel anahtar mevcut değildir.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Mesajın imzalanması başarısız oldu.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>Mesaj imzalandı.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>İmzanın kodu çözülemedi.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>İmzayı kontrol edip tekrar deneyiniz.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>İmza mesajın hash değeri ile eşleşmedi.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Mesaj doğrulaması başarısız oldu.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>Mesaj doğrulandı.</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Çekirdeği</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>Bitcoin Çekirdeği geliştiricileri</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2286,656 +1715,430 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>%1 değerine dek açık</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>çakışma</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/çevrim dışı</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/doğrulanmadı</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 teyit</translation>
- </message>
- <message>
- <source>Status</source>
- <translation>Durum</translation>
- </message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, %n düğüm vasıtasıyla yayınlandı</numerusform><numerusform>, %n düğüm vasıtasıyla yayınlandı</numerusform></translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Tarih</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Kaynak</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>OluÅŸturuldu</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Gönderen</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Alıcı</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>kendi adresiniz</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>sadece-izlenen</translation>
- </message>
- <message>
- <source>label</source>
- <translation>etiket</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Gider</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>%n ek blok sonrasında olgunlaşacak</numerusform><numerusform>%n ek blok sonrasında olgunlaşacak</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>kabul edilmedi</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation>Gelir</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation>Toplam gider</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation>Toplam gelir</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Muamele ücreti</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation>Net meblaÄŸ</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Mesaj</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>Yorum</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>Muamele tanımlayıcı</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation>Tüccar</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>Oluşturulan bitcoin'lerin harcanabilmelerinden önce %1 blok beklemeleri gerekmektedir. Bu blok, oluşturduğunuzda, blok zincirine eklenmesi için ağda yayınlandı. Zincire eklenmesi başarısız olursa, durumu "kabul edilmedi" olarak değiştirilecek ve harcanamayacaktır. Bu, bazen başka bir düğüm sizden birkaç saniye önce ya da sonra blok oluşturursa meydana gelebilir.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation>Hata ayıklama verileri</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Muamele</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Girdiler</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>MeblaÄŸ</translation>
- </message>
- <message>
- <source>true</source>
- <translation>doÄŸru</translation>
- </message>
- <message>
- <source>false</source>
- <translation>yanlış</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, henüz başarılı bir şekilde yayınlanmadı</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>%n ilâve blok için açık</numerusform><numerusform>%n ilâve blok için açık</numerusform></translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>bilinmiyor</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Muamele detayları</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Bu pano muamelenin ayrıntılı açıklamasını gösterir</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Tarih</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Tür</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>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>%n ilâve blok için açık</numerusform><numerusform>%n ilâve blok için açık</numerusform></translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>%1 değerine dek açık</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Doğrulandı (%1 teyit)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Bu blok başka hiçbir düğüm tarafından alınmamıştır ve muhtemelen kabul edilmeyecektir!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>OluÅŸturuldu ama kabul edilmedi</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Çevrim dışı</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>Teyit edilmemiÅŸ</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Teyit ediliyor (tavsiye edilen %2 teyit üzerinden %1 doğrulama)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Çakışma</translation>
- </message>
+ <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Received with</source>
- <translation>Şununla alındı</translation>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Meblağları göstermek için birim. Başka bir birim seçmek için tıklayınız.</translation>
</message>
+</context>
+<context>
+ <name>bitcoin-core</name>
<message>
- <source>Received from</source>
- <translation>Alındığı kişi</translation>
+ <source>Options:</source>
+ <translation>Seçenekler:</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Gönderildiği adres</translation>
+ <source>Specify data directory</source>
+ <translation>Veri dizinini belirt</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation>Kendinize ödeme</translation>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Eş adresleri elde etmek için bir düğüme bağlan ve ardından bağlantıyı kes</translation>
</message>
<message>
- <source>Mined</source>
- <translation>Madenden çıkarılan</translation>
+ <source>Specify your own public address</source>
+ <translation>Kendi genel adresinizi tanımlayın</translation>
</message>
<message>
- <source>watch-only</source>
- <translation>sadece-izlenen</translation>
+ <source>Accept command line and JSON-RPC commands</source>
+ <translation>Komut satırı ve JSON-RPC komutlarını kabul et</translation>
</message>
<message>
- <source>(n/a)</source>
- <translation>(mevcut deÄŸil)</translation>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>Eğer &lt;kategori&gt; belirtilmemişse ya da &lt;kategori&gt; = 1 ise, tüm hata ayıklama verilerini dök.</translation>
</message>
<message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Muamele durumu. Doğrulama sayısını görüntülemek için imleci bu alanda tutunuz.</translation>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>Budama, asgari değer olan %d MiB'den düşük olarak ayarlanmıştır. Lütfen daha yüksek bir sayı kullanınız.</translation>
</message>
<message>
- <source>Date and time that the transaction was received.</source>
- <translation>Muamelenin alındığı tarih ve zaman.</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>Budama: son cüzdan eşleşmesi budanmış verilerin ötesine gitmektedir. -reindex kullanmanız gerekmektedir (Budanmış düğüm ise tüm blok zincirini tekrar indirmeniz gerekir.)</translation>
</message>
<message>
- <source>Type of transaction.</source>
- <translation>Muamele türü.</translation>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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ı budayarak (silerek) düşür. Bu kip -txindex ve -rescan 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 = MiB olarak blok dosyaları için kullanılacak hedef boyut)</translation>
</message>
<message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation>Bu muamelede sadece izlenen bir adresin bulunup bulunmadığı.</translation>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>Tekrar taramalar budanmış kipte mümkün değildir. Tüm blok zincirini tekrar indirecek olan -reindex seçeneğini kullanmanız gerekecektir.</translation>
</message>
<message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation>Muamelenin kullanıcı tanımlı niyeti/amacı.</translation>
+ <source>Error: A fatal internal error occurred, see debug.log for details</source>
+ <translation>Hata: Ölümcül dahili bir hata meydana geldi, ayrıntılar için debug.log dosyasına bakınız</translation>
</message>
<message>
- <source>Amount removed from or added to balance.</source>
- <translation>Bakiyeden alınan ya da bakiyeye eklenen meblağ.</translation>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>Yolladığınız muamelelere eklenecek ücret (%s/kB olarak) (varsayılan: %s)</translation>
</message>
-</context>
-<context>
- <name>TransactionView</name>
<message>
- <source>All</source>
- <translation>Hepsi</translation>
+ <source>Pruning blockstore...</source>
+ <translation>Blockstore budanıyor...</translation>
</message>
<message>
- <source>Today</source>
- <translation>Bugün</translation>
+ <source>Run in the background as a daemon and accept commands</source>
+ <translation>Arka planda daemon (servis) olarak çalış ve komutları kabul et</translation>
</message>
<message>
- <source>This week</source>
- <translation>Bu hafta</translation>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>HTTP sunucusu başlatılamadı. Ayrıntılar için debug.log dosyasına bakınız.</translation>
</message>
<message>
- <source>This month</source>
- <translation>Bu ay</translation>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <translation>Dışarıdan gelen bağlantıları kabul et (varsayılan: -proxy veya -connect yoksa 1)</translation>
</message>
<message>
- <source>Last month</source>
- <translation>Geçen ay</translation>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Çekirdeği</translation>
</message>
<message>
- <source>This year</source>
- <translation>Bu sene</translation>
+ <source>The %s developers</source>
+ <translation>%s geliÅŸtiricileri</translation>
</message>
<message>
- <source>Range...</source>
- <translation>Aralık...</translation>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfee çok yüksek bir değere ayarlanmış! Ücret tahminleri mevcut değilken ödeyebileceğiniz muamele ücretidir bu.</translation>
</message>
<message>
- <source>Received with</source>
- <translation>Şununla alınan</translation>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>Ücret tahmini için yetersiz veri bulunduğunda kullanılacak ücret oranı (%s/kB olarak) (varsayılan: %s)</translation>
</message>
<message>
- <source>Sent to</source>
- <translation>Gönderildiği adres</translation>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>Muameleler aktarılmadığında dahi beyaz listedeki eşlerden aktarılan muameleleri kabul et (varsayılan: %d)</translation>
</message>
<message>
- <source>To yourself</source>
- <translation>Kendinize</translation>
+ <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>Mined</source>
- <translation>OluÅŸturulan</translation>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>%s veri dizininde kilit elde edilemedi. %s muhtemelen hâlihazırda çalışmaktadır.</translation>
</message>
<message>
- <source>Other</source>
- <translation>DiÄŸer</translation>
+ <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>
<message>
- <source>Enter address or label to search</source>
- <translation>Aranacak adres ya da etiket giriniz</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 yazılım lisansı kapsamında yayınlanmıştır, ekteki COPYING dosyasına ya da &lt;http://www.opensource.org/licenses/mit-license.php&gt; adresine bakınız.</translation>
</message>
<message>
- <source>Min amount</source>
- <translation>Asgari meblaÄŸ</translation>
+ <source>Error loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>%s yüklenmesinde hata: zaten var olan ve HD olmayan bir cüzdanda HD etkinleştirilemez.</translation>
</message>
<message>
- <source>Copy address</source>
- <translation>Adresi kopyala</translation>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>%s dosyasının okunması sırasında bir hata meydana geldi! Tüm anahtarlar doğru bir şekilde okundu, ancak muamele verileri ya da adres defteri unsurları hatalı veya eksik olabilir.</translation>
</message>
<message>
- <source>Copy label</source>
- <translation>Etiketi kopyala</translation>
+ <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>
<message>
- <source>Copy amount</source>
- <translation>Meblağı kopyala</translation>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>Yerel aktarma politikasını ihlal ettiklerinde bile beyaz listedeki eşlerden gelen muamelelerin aktarılmasını zorla (varsayılan: %d)</translation>
</message>
<message>
- <source>Copy transaction ID</source>
- <translation>Muamele kimliÄŸini kopyala</translation>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>Müsaade edilen azami medyan eş zamanı değişiklik sınırının ayarlaması. Zamanın yerel perspektifi bu miktar kadar ileri ya da geri eşler tarafından etkilenebilir. (Varsayılan %u saniye)</translation>
</message>
<message>
- <source>Edit label</source>
- <translation>Etiketi düzenle</translation>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Tek cüzdan muamelesinde ya da ham muamelede kullanılacak azami toplam ücret (%s olarak); bunu çok düşük olarak ayarlamak büyük muameleleri iptal edebilir (varsayılan: %s)</translation>
</message>
<message>
- <source>Show transaction details</source>
- <translation>Muamele detaylarını göster</translation>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>Lütfen bilgisayarınızın saat ve tarihinin doğru olduğunu kontrol ediniz! Saatinizde gecikme varsa %s doğru şekilde çalışamaz.</translation>
</message>
<message>
- <source>Export Transaction History</source>
- <translation>Muamele tarihçesini dışa aktar</translation>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>%s programını faydalı buluyorsanız lütfen katkıda bulununuz. Yazılım hakkında daha fazla bilgi için %s adresini ziyaret ediniz.</translation>
</message>
<message>
- <source>Watch-only</source>
- <translation>Sadece izlenen</translation>
+ <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>
<message>
- <source>Exporting Failed</source>
- <translation>Dışa aktarım başarısız oldu</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>Blok veritabanı gelecekten gibi görünen bir blok içermektedir. Bu, bilgisayarınızın saat ve tarihinin yanlış ayarlanmış olmasından kaynaklanabilir. Blok veritabanını sadece bilgisayarınızın tarih ve saatinin doğru olduğundan eminseniz yeniden derleyin.</translation>
</message>
<message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Muamele tarihçesinin %1 konumuna kaydedilmesi sırasında bir hata meydana geldi.</translation>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation>Bu yayın öncesi bir deneme sürümüdür - tüm riski siz üstlenmiş olursunuz - bitcoin oluşturmak ya da ticari uygulamalar için kullanmayınız</translation>
</message>
<message>
- <source>Exporting Successful</source>
- <translation>Dışa aktarım başarılı oldu</translation>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
+ <translation>Veritabanını çatallama öncesi duruma geri sarmak mümkün değil. Blok zincirini tekrar indirmeniz gerekmektedir</translation>
</message>
<message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation>Muamele tarihçesi başarılı bir şekilde %1 konumuna kaydedildi.</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>Dinlenecek portu haritalamak için UPnP kullan (varsayılan: dinlenildiğinde ve -proxy olmadığında 1)</translation>
</message>
<message>
- <source>Comma separated file (*.csv)</source>
- <translation>Virgülle ayrılmış değerler dosyası (*.csv)</translation>
+ <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
+ <translation>Uyarı: şebeke tamamen mutabık değil gibi görünüyor! Bazı madenciler sorun yaşıyor gibi görünüyor.</translation>
</message>
<message>
- <source>Confirmed</source>
- <translation>Doğrulandı</translation>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation>Uyarı: eşlerimizle tamamen mutabık değiliz gibi görünüyor! Güncelleme yapmanız gerekebilir ya da diğer düğümlerin güncelleme yapmaları gerekebilir.</translation>
</message>
<message>
- <source>Date</source>
- <translation>Tarih</translation>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Belirtilen aÄŸ maskesi ya da IP adresinden baÄŸlanan eÅŸleri beyaz listeye al. Birden fazla kez belirtilebilir.</translation>
</message>
<message>
- <source>Type</source>
- <translation>Tür</translation>
+ <source>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>-txindex'i değiştirmek için veritabanını -reindex-chainstate kullanarak tekrar inşa etmeniz gerekmektedir</translation>
</message>
<message>
- <source>Label</source>
- <translation>Etiket</translation>
+ <source>%s corrupt, salvage failed</source>
+ <translation>%s bozuk, geri kazanım başarısız oldu</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adres</translation>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool asgari %d MB olmalıdır</translation>
</message>
<message>
- <source>ID</source>
- <translation>Tanımlayıcı</translation>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;kategori&gt; ÅŸunlar olabilir:</translation>
</message>
<message>
- <source>Range:</source>
- <translation>Aralık:</translation>
+ <source>Append comment to the user agent string</source>
+ <translation>Kullanıcı aracı zincirine yorumu ekle</translation>
</message>
<message>
- <source>to</source>
- <translation>ilâ</translation>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>Başlangıçta bozuk bir cüzdandan özel anahtarları geri kazanmayı dene</translation>
</message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
<message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation>Meblağları göstermek için birim. Başka bir birim seçmek için tıklayınız.</translation>
- </message>
-</context>
-<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Hiçbir cüzdan yüklenmemiştir.</translation>
+ <source>Block creation options:</source>
+ <translation>Blok oluşturma seçenekleri:</translation>
</message>
-</context>
-<context>
- <name>WalletModel</name>
<message>
- <source>Send Coins</source>
- <translation>Bitcoin yolla</translation>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>Çözümlenemedi - %s adres: '%s'</translation>
</message>
-</context>
-<context>
- <name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation>&amp;Dışa aktar</translation>
+ <source>Change index out of range</source>
+ <translation>Aralık dışında değişiklik endeksi</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation>Güncel sekmedeki verileri bir dosyaya aktar</translation>
+ <source>Connect only to the specified node(s)</source>
+ <translation>Sadece belirtilen düğüme veya düğümlere bağlan</translation>
</message>
<message>
- <source>Backup Wallet</source>
- <translation>Cüzdanı Yedekle</translation>
+ <source>Connection options:</source>
+ <translation>Bağlantı seçenekleri:</translation>
</message>
<message>
- <source>Wallet Data (*.dat)</source>
- <translation>Cüzdan verileri (*.dat)</translation>
+ <source>Copyright (C) %i-%i</source>
+ <translation>Telif hakkı (C) %i-%i</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation>Yedekleme başarısız oldu</translation>
+ <source>Corrupted block database detected</source>
+ <translation>Bozuk blok veritabanı tespit edildi</translation>
</message>
<message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation>Cüzdan verilerinin %1 konumuna kaydedilmesi sırasında bir hata meydana geldi.</translation>
+ <source>Debugging/Testing options:</source>
+ <translation>Hata ayıklama/deneme seçenekleri:</translation>
</message>
<message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation>Cüzdan verileri %1 konumuna başarıyla kaydedildi.</translation>
+ <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>
<message>
- <source>Backup Successful</source>
- <translation>Yedekleme başarılı</translation>
- </message>
-</context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>Options:</source>
- <translation>Seçenekler:</translation>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation>Blok veritabanını şimdi yeniden inşa etmek istiyor musunuz?</translation>
</message>
<message>
- <source>Specify data directory</source>
- <translation>Veri dizinini belirt</translation>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Blok karma değerinin &lt;adres&gt;te yayınlanmasını etkinleştir</translation>
</message>
<message>
- <source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Eş adresleri elde etmek için bir düğüme bağlan ve ardından bağlantıyı kes</translation>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Karma değer muamelesinin &lt;adres&gt;te yayınlanmasını etkinleştir</translation>
</message>
<message>
- <source>Specify your own public address</source>
- <translation>Kendi genel adresinizi tanımlayın</translation>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Ham blokun &lt;adres&gt;te yayınlanmasını etkinleştir</translation>
</message>
<message>
- <source>Accept command line and JSON-RPC commands</source>
- <translation>Komut satırı ve JSON-RPC komutlarını kabul et</translation>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Ham muamelenin &lt;adres&gt;te yayınlanmasını etkinleştir</translation>
</message>
<message>
- <source>Run in the background as a daemon and accept commands</source>
- <translation>Arka planda daemon (servis) olarak çalış ve komutları kabul et</translation>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>Bellek alanında muamele değiştirmeyi etkinleştir (varsayılan: %u)</translation>
</message>
<message>
- <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>Dışarıdan gelen bağlantıları kabul et (varsayılan: -proxy veya -connect yoksa 1)</translation>
+ <source>Error initializing block database</source>
+ <translation>Blok veritabanını başlatılırken bir hata meydana geldi</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>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation>%s cüzdan veritabanı ortamının başlatılmasında hata meydana geldi!</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>
+ <source>Error loading %s</source>
+ <translation>%s unsurunun yüklenmesinde hata oluştu</translation>
</message>
<message>
- <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 yazılım lisansı kapsamında yayınlanmıştır, ekteki COPYING dosyasına ya da &lt;http://www.opensource.org/licenses/mit-license.php&gt; adresine bakınız.</translation>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>%s unsurunun yüklenmesinde hata oluştu: bozuk cüzdan</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>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>%s unsurunun yüklenmesinde hata oluştu: cüzdan %s programının yeni bir sürümüne ihtiyaç duyuyor</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>
+ <source>Error loading %s: You can't disable HD on a already existing HD wallet</source>
+ <translation>%s yüklenmesinde hata: zaten var olan HD bir cüzdanda HD devre dışı bırakılamaz.</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>Bu yayın öncesi bir deneme sürümüdür - tüm riski siz üstlenmiş olursunuz - bitcoin oluşturmak ya da ticari uygulamalar için kullanmayınız</translation>
+ <source>Error loading block database</source>
+ <translation>Blok veritabanının yüklenmesinde hata</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Bu bilgisayarda %s unsuruna bağlanılamadı. Bitcoin Çekirdeği muhtemelen hâlihazırda çalışmaktadır.</translation>
+ <source>Error opening block database</source>
+ <translation>Blok veritabanının açılışı sırasında hata</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>İKAZ: anormal yüksek sayıda blok oluşturulmuştur, %d blok son %d saat içinde alınmıştır (%d bekleniyordu)</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Hata: Disk alanı düşük!</translation>
</message>
<message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>İKAZ: ağ bağlantınızı kontrol ediniz, %d blok son %d saat içinde alınmıştır (%d bekleniyordu)</translation>
+ <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>
<message>
- <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>Uyarı: şebeke tamamen mutabık değil gibi görünüyor! Bazı madenciler sorun yaşıyor gibi görünüyor.</translation>
+ <source>Importing...</source>
+ <translation>İçe aktarılıyor...</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>Uyarı: eşlerimizle tamamen mutabık değiliz gibi görünüyor! Güncelleme yapmanız gerekebilir ya da diğer düğümlerin güncelleme yapmaları gerekebilir.</translation>
+ <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <translation>Yanlış ya da bulunamamış doğuş bloku. Şebeke için yanlış veri klasörü mü?</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>Uyarı: wallet.dat bozuk, veriler geri kazanıldı! Özgün wallet.dat, wallet.{zamandamgası}.bak olarak %s klasörüne kaydedildi; bakiyeniz ya da muameleleriniz yanlışsa bir yedeklemeden tekrar yüklemeniz gerekir.</translation>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>Başlatma sınaması başarısız oldu. %s kapatılıyor.</translation>
</message>
<message>
- <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
- <translation>Belirtilen aÄŸ maskesi ya da IP adresinden baÄŸlanan eÅŸleri beyaz listeye al. Birden fazla kez belirtilebilir.</translation>
+ <source>Invalid -onion address: '%s'</source>
+ <translation>Geçersiz -onion adresi: '%s'</translation>
</message>
<message>
- <source>&lt;category&gt; can be:</source>
- <translation>&lt;kategori&gt; ÅŸunlar olabilir:</translation>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>-%s=&lt;meblağ&gt; için geçersiz meblağ: '%s'</translation>
</message>
<message>
- <source>Block creation options:</source>
- <translation>Blok oluşturma seçenekleri:</translation>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation> -fallbackfee=&lt;meblağ&gt; için geçersiz meblağ: '%s'</translation>
</message>
<message>
- <source>Connect only to the specified node(s)</source>
- <translation>Sadece belirtilen düğüme veya düğümlere bağlan</translation>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Muamele bellek alanını &lt;n&gt; megabayttan düşük tut (varsayılan: %u)</translation>
</message>
<message>
- <source>Connection options:</source>
- <translation>Bağlantı seçenekleri:</translation>
+ <source>Loading banlist...</source>
+ <translation>Yasaklama listesi yükleniyor...</translation>
</message>
<message>
- <source>Corrupted block database detected</source>
- <translation>Bozuk blok veritabanı tespit edildi</translation>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>auth çerezinin konumu (varsayılan: veri klasörü)</translation>
</message>
<message>
- <source>Debugging/Testing options:</source>
- <translation>Hata ayıklama/deneme seçenekleri:</translation>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>Aktardığımız ve oluşturduğumuz muamelelerdeki sigop başına asgari bayt (varsayılan: %u)</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>
+ <source>Not enough file descriptors available.</source>
+ <translation>Kafi derecede dosya tanımlayıcıları mevcut değil.</translation>
</message>
<message>
- <source>Do you want to rebuild the block database now?</source>
- <translation>Blok veritabanını şimdi yeniden inşa etmek istiyor musunuz?</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Sadece &lt;net&gt; şebekesindeki düğümlere bağlan (ipv4, ipv6 veya onion)</translation>
</message>
<message>
- <source>Error initializing block database</source>
- <translation>Blok veritabanını başlatılırken bir hata meydana geldi</translation>
+ <source>Print this help message and exit</source>
+ <translation>Bu yardım mesajını yaz ve çık</translation>
</message>
<message>
- <source>Error initializing wallet database environment %s!</source>
- <translation>%s cüzdan veritabanı ortamının başlatılmasında hata meydana geldi!</translation>
+ <source>Print version and exit</source>
+ <translation>Sürümü yaz ve çık</translation>
</message>
<message>
- <source>Error loading block database</source>
- <translation>Blok veritabanının yüklenmesinde hata</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Budama negatif bir değerle yapılandırılamaz.</translation>
</message>
<message>
- <source>Error opening block database</source>
- <translation>Blok veritabanının açılışı sırasında hata</translation>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Budama kipi -txindex ile uyumsuzdur.</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Hata: Disk alanı düşük!</translation>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>Zincir durumu ve blok endeksini diskteki blk*.dat dosyalarından yeniden derle</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>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>Zincir durumunu güncel olarak endekslenen bloklardan yeniden derle</translation>
</message>
<message>
- <source>Importing...</source>
- <translation>İçe aktarılıyor...</translation>
+ <source>Rewinding blocks...</source>
+ <translation>Bloklar geri sarılıyor...</translation>
</message>
<message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation>Yanlış ya da bulunamamış doğuş bloku. Şebeke için yanlış veri klasörü mü?</translation>
+ <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
+ <translation>Veritabanı önbellek boyutunu megabayt olarak belirt (%d ilâ %d, varsayılan: %d)</translation>
</message>
<message>
- <source>Invalid -onion address: '%s'</source>
- <translation>Geçersiz -onion adresi: '%s'</translation>
+ <source>Set maximum block cost (default: %d)</source>
+ <translation>Azami blok maliyetini ayarla (varsayılan: %d)</translation>
</message>
<message>
- <source>Not enough file descriptors available.</source>
- <translation>Kafi derecede dosya tanımlayıcıları mevcut değil.</translation>
+ <source>Set maximum block size in bytes (default: %d)</source>
+ <translation>Azami blok boyutunu bayt olarak ayarla (varsayılan: %d)</translation>
</message>
<message>
- <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
- <translation>Sadece &lt;net&gt; şebekesindeki düğümlere bağlan (ipv4, ipv6 veya onion)</translation>
+ <source>Specify wallet file (within data directory)</source>
+ <translation>Cüzdan dosyası belirtiniz (veri klasörünün içinde)</translation>
</message>
<message>
- <source>Prune cannot be configured with a negative value.</source>
- <translation>Prune negatif bir değerle yapılandırılamaz.</translation>
+ <source>The source code is available from %s.</source>
+ <translation>Kaynak kod ÅŸuradan elde edilebilir: %s.</translation>
</message>
<message>
- <source>Prune mode is incompatible with -txindex.</source>
- <translation>Prune kipi -txindex ile uyumsuzdur.</translation>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>Bu bilgisayarda %s unsuruna bağlanılamadı. %s muhtemelen hâlihazırda çalışmaktadır.</translation>
</message>
<message>
- <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
- <translation>Veritabanı önbellek boyutunu megabayt olarak belirt (%d ilâ %d, varsayılan: %d)</translation>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Desteklenmeyen -benchmark argümanı görmezden gelindi, -debug=bench kullanınız.</translation>
</message>
<message>
- <source>Set maximum block size in bytes (default: %d)</source>
- <translation>Azami blok boyutunu bayt olarak ayarla (varsayılan: %d)</translation>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Desteklenmeyen -debugnet argümanı görmezden gelindi, debug=net kullanınız.</translation>
</message>
<message>
- <source>Specify wallet file (within data directory)</source>
- <translation>Cüzdan dosyası belirtiniz (veri klasörünün içinde)</translation>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>Deskteklenmeyen -tor argümanı bulundu, -onion kullanınız.</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: %u)</source>
<translation>Dinleme portunu haritalamak için UPnP kullan (varsayılan: %u)</translation>
</message>
<message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>Kullanıcı Aracı açıklaması (%s) güvensiz karakterler içermektedir.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Bloklar kontrol ediliyor...</translation>
</message>
@@ -2948,16 +2151,16 @@
<translation>%s cüzdan %s veri klasörünün dışında bulunuyor</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>Cüzdan seçenekleri:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>Cüzdan hata ayıklama/test etme 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>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>Cüzdanın tekrar yazılması gerekiyordu: işlemi tamamlamak için %s programını yeniden başlatınız</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>
+ <source>Wallet options:</source>
+ <translation>Cüzdan seçenekleri:</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>
@@ -2972,10 +2175,6 @@
<translation>Belirtilen adrese bağlan ve JSON RPC bağlantıları için dinlemeye geç. IPv6 için [makine]:port imlasını kullanınız. Bu seçenek birden çok kez belirtilebilir (varsayılan: tüm arayüzlere bağlan)</translation>
</message>
<message>
- <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>%s veri dizininde kilit elde edilemedi. Bitcoin Çekirdeği muhtemelen hâlihazırda çalışmaktadır.</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>
@@ -2992,6 +2191,10 @@
<translation>İlgili bir uyarı alındığında ya da gerçekten uzun bir çatallama gördüğümüzde komutu çalıştır (komuttaki %s mesaj ile değiştirilir)</translation>
</message>
<message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>Bundan düşük ücretler (%s/kB olarak) aktarma, oluşturma ve muamele yaratma 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>
@@ -3016,10 +2219,6 @@
<translation>Yüksek öncelikli/düşük ücretli muamelelerin azami boyutunu bayt olarak ayarla (varsayılan: %d)</translation>
</message>
<message>
- <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
- <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>
@@ -3028,12 +2227,16 @@
<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>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation>BIP32'den sonra hiyerarşik determinist (HD) anahtar üretimini kullan. Sadece cüzdan oluşturulmasında/ilk başlamada etkiye sahiptir.</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>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>
+ <translation>Budama 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>
@@ -3044,48 +2247,24 @@
<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>Cannot resolve -whitebind address: '%s'</source>
- <translation>-whitebind adresi çözümlenemedi: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Otomatik olarak gizli Tor servisi oluştur (varsayılan: %d)</translation>
</message>
<message>
<source>Connect through SOCKS5 proxy</source>
<translation>SOCKS5 vekil sunucusu vasıtasıyla bağlan</translation>
</message>
<message>
- <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
- <translation>Telif hakkı 2009-%i Bitcoin Çekirdeği Geliştiricileri</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <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>Information</source>
- <translation>Bilgi</translation>
- </message>
- <message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Başlangıçta harici blk000??.dat dosyasından blokları içe aktarır</translation>
</message>
<message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>-mintxfee=&lt;amount&gt; için geçersiz meblağ: '%s'</translation>
+ <source>Information</source>
+ <translation>Bilgi</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3112,12 +2291,12 @@
<translation>RPC sunucu seçenekleri:</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>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation>Sistem sınırlamaları sebebiyle -maxconnections %d değerinden %d değerine düşürülmüştür.</translation>
</message>
<message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>P2P ağından gelen önemli uyarıları alın ve gösterin (önseçili değer: %u)</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Başlangıçta blok zincirini eksik cüzdan muameleleri için tekrar tara</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
@@ -3148,6 +2327,14 @@
<translation>Bu, deneysel bir yazılımdır.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Tor kontrol portu parolası (varsayılan: boş)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>Eğer onion dinlenmesi etkinse kullanılacak Tor kontrol portu (varsayılan: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Muamele meblağı çok düşük</translation>
</message>
@@ -3168,24 +2355,32 @@
<translation>Bu bilgisayarda %s unsuruna bağlanılamadı (bağlanma %s hatasını verdi)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>JSON-RPC bağlantıları için kullanıcı ismi</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Başlangıçta cüzdanı en yeni biçime güncelle</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Cüzdanın tekrar yazılması gerekmektedir: tamamlamak için Bitcoin Çekirdeğini yeniden başlatın</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>JSON-RPC bağlantıları için kullanıcı ismi</translation>
</message>
<message>
<source>Warning</source>
<translation>Uyarı</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>Ä°kaz: bilinmeyen yeni kurallar etkinleÅŸtirilmiÅŸtir (versionbit %i)</translation>
+ </message>
+ <message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Salt blok kipinde çalışılıp çalışılmayacağı (varsayılan: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Cüzdandaki tüm muameleler kaldırılıyor...</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat bozuk, geri kazanım başarısız oldu</translation>
+ <source>ZeroMQ notification options:</source>
+ <translation>ZeroMQ bildirim seçenekleri:</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -3196,10 +2391,6 @@
<translation>En iyi blok değiştiğinde komutu çalıştır (komut için %s parametresi blok hash değeri ile değiştirilecektir)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Bu yardım mesajı</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>-addnode, -seednode ve -connect için DNS aramalarına izin ver</translation>
</message>
@@ -3208,14 +2399,26 @@
<translation>Adresler yükleniyor...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>wallet.dat dosyasının yüklenmesinde hata oluştu: bozuk cüzdan</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 verilerini tut mesela hesap sahibi ve ödeme talebi bilgileri, 2 = tx meta verilerini at)</translation>
</message>
<message>
+ <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>-maxtxfee çok yüksek bir değere ayarlanmış! Bu denli yüksek ücretler tek bir muamelede ödenebilir.</translation>
+ </message>
+ <message>
+ <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
+ <translation>-paytxfee çok yüksek bir değere ayarlanmış! Bu, muamele gönderirseniz ödeyeceğiniz muamele ücretidir.</translation>
+ </message>
+ <message>
+ <source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
+ <translation>Muameleleri bellek alanında &lt;n&gt; saatten fazla tutma (varsayılan: %u)</translation>
+ </message>
+ <message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Bundan düşük ücretler (%s/kB olarak) muamele oluşturulması için sıfır değerinde ücret olarak kabul edilir (varsayılan: %s)</translation>
+ </message>
+ <message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
<translation>-checkblocks'un blok kontrolünün ne kadar kapsamlı olacağı (0 ilâ 4, varsayılan: %u)</translation>
</message>
@@ -3232,24 +2435,48 @@
<translation>Hata ayıklama bilgisi dök (varsayılan: %u, &lt;kategori&gt; sağlanması seçime dayalıdır)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Blokların ve muamelelerin bloom filtreleri ile süzülmesini destekle (varsayılan: %u)</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation>Şebeke sürümü zincirinin toplam boyutu (%i) azami boyutu geçmektedir (%i). Kullanıcı aracı açıklamasının sayısı veya boyutunu azaltınız.</translation>
+ </message>
+ <message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>Giden trafiği belirtilen hedefin altında tutmaya çalışır (24 saat başı MiB olarak), 0 = sınırsız (varsayılan: %d)</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Desteklenmeyen -socks argümanı bulundu. SOCKS sürümünün ayarlanması artık mümkün değildir, sadece SOCKS5 vekilleri desteklenmektedir.</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>Desteklenmeyen argüman -whitelistalwaysrelay görmezden gelindi, -whitelistrelay ve/veya -whitelistforcerelay kullanın.</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>Eşlere gizli Tor servisleri ile ulaşmak için ayrı SOCKS5 vekil sunucusu kullan (varsayılan: %s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(varsayılan: %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>JSON-RPC bağlantıları için kullanıcı ismi ve karmalanmış parola. &lt;userpw&gt; alanı şu biçimdedir: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. Kanonik bir Python betiği share/rpcuser klasöründe bulunabilir. Bu seçenek birden çok kez belirtilebilir.</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>Eş adresleri sorgulaması için daima DNS aramasını kullan (varsayılan: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>İkaz: bilinmeyen blok sürümü oluşturulmaya çalışılıyor. Bilinmeyen kuralların işlemesi mümkündür.</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>wallet.dat dosyasının yüklenmesinde hata oluştu</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>Uyarı: wallet.dat bozuk, veriler geri kazanıldı! Özgün %s, %s olarak %s klasörüne kaydedildi; bakiyeniz ya da muameleleriniz yanlışsa bir yedeklemeden tekrar yüklemeniz gerekir.</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>Bitcoin oluştur (varsayılan: %u)</translation>
+ <source>(default: %s)</source>
+ <translation>(varsayılan: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Eş adresleri sorgulaması için daima DNS aramasını kullan (varsayılan: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3336,18 +2563,6 @@
<translation>-onlynet için bilinmeyen bir şebeke belirtildi: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>-bind adresi çözümlenemedi: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>-externalip adresi çözümlenemedi: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>-paytxfee=&lt;meblağ&gt; için geçersiz meblağ: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Yetersiz bakiye</translation>
</message>
diff --git a/src/qt/locale/bitcoin_tr_TR.ts b/src/qt/locale/bitcoin_tr_TR.ts
index bca64ba05d..344309c25f 100644
--- a/src/qt/locale/bitcoin_tr_TR.ts
+++ b/src/qt/locale/bitcoin_tr_TR.ts
@@ -26,10 +26,6 @@
<translation>K&amp;apat</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Adresi Kopyala</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Seçili adresi listeden sil</translation>
</message>
@@ -45,69 +41,6 @@
<source>&amp;Delete</source>
<translation>&amp;Sil</translation>
</message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation>Para göndereceğiniz adresi seçin</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation>Parayı alacağınız adresi seçin</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation>S&amp;eç</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation>Gönderim adresleri</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation>Alış adresleri</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>Bunlar ödeme gönderebileceğiniz Bitcoin adreslerinizdir. Para göndermeden önce mutlaka alıcı adresini ve tutarı kontrol edin.</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>Bunlar ödeme alabileceğiniz Bitcoin adreslerinizdir. Her işlem için yeni bir adres kullanmanız önerilir.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Kopyala &amp;Etiketle</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Düzenle</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Adres Listesini Dışa Aktar</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Dışa Aktarma Başarısız Oldu</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Adres listesini %1'e kaydederken bir hata oluştu. Lütfen tekrar deneyin.</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(etiket yok)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -117,20 +50,25 @@
</context>
<context>
<name>BitcoinGUI</name>
- </context>
-<context>
- <name>ClientModel</name>
+ <message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Alış adresleri</translation>
+ </message>
</context>
<context>
<name>CoinControlDialog</name>
- <message>
- <source>(no label)</source>
- <translation>(etiket yok)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
- </context>
+ <message>
+ <source>&amp;Label</source>
+ <translation>Etiket</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation>Adres</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -150,18 +88,12 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -170,31 +102,12 @@
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(etiket yok)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Adresi Kopyala</translation>
</message>
</context>
<context>
<name>SendCoinsDialog</name>
- <message>
- <source>(no label)</source>
- <translation>(etiket yok)</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -212,54 +125,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Exporting Failed</source>
- <translation>Dışa Aktarma Başarısız Oldu</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Etiket</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;Dışa Aktar</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Seçili sekmedeki veriyi dosya olarak dışa aktar</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts
index 5e2a06c731..a06cc9e092 100644
--- a/src/qt/locale/bitcoin_uk.ts
+++ b/src/qt/locale/bitcoin_uk.ts
@@ -26,10 +26,6 @@
<translation>З&amp;акрити</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>&amp;Скопіювати адреÑу</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Вилучити вибрані адреÑи з переліку</translation>
</message>
@@ -45,73 +41,6 @@
<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>&amp;Обрати</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>Це ваші 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>Це ваша нова Bitcoin адреÑа Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð»Ð°Ñ‚ÐµÐ¶Ñ–Ð². Рекомендовано викориÑтовувати нову адреÑу Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— транзакції.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>Скопіювати &amp;мітку</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Редагувати</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>ЕкÑпортувати ÑпиÑок адреÑ</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>ЗначеннÑ, розділені комою (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Помилка екÑпорту</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(немає назви)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Повторіть пароль</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Зашифрувати гаманець</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” пароль Ð´Ð»Ñ Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Розблокувати гаманець</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” пароль Ð´Ð»Ñ Ð´ÐµÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Дешифрувати гаманець</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Змінити пароль</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Wallet encrypted</source>
- <translation>Гаманець зашифровано</translation>
- </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>Введіть нову кодову фразу Ð´Ð»Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ.&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>
- <translation>Ðе вдалоÑÑ Ð·Ð°ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ñ‚Ð¸ гаманець</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Виникла помилка під Ñ‡Ð°Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ. Ваш гаманець не було зашифровано.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Введені паролі не Ñпівпадають.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ гаманець</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Введений пароль є неправильним.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Ðе вдалоÑÑ Ñ€Ð¾Ð·ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ñ‚Ð¸ гаманець</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Пароль було уÑпішно змінено.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -270,6 +111,10 @@
<translation>Вийти</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>П&amp;ро %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>&amp;Про Qt</translation>
</message>
@@ -306,14 +151,6 @@
<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>
@@ -358,10 +195,6 @@
<translation>&amp;Отримати</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>
@@ -398,22 +231,10 @@
<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-код та bitcoin: URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>П&amp;ро 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>
@@ -429,10 +250,6 @@
<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>Показати довідку 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><numerusform>%n активних з'єднань з мережею Bitcoin</numerusform></translation>
@@ -545,13 +362,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ–</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -629,150 +439,6 @@
<source>Priority</source>
<translation>Пріоритет</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Скопіювати адреÑу</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Скопіювати мітку</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>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 Ñатоші за вхід</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>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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>решта з %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(решта)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -796,38 +462,6 @@
<source>&amp;Address</source>
<translation>&amp;ÐдреÑа</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Ðова адреÑа Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Ðова адреÑа Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Редагувати адреÑу Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Редагувати адреÑу Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Введена адреÑа «%1» вже приÑÑƒÑ‚Ð½Ñ Ð² адреÑній книзі.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Введена адреÑа «%1» не Ñ” коректною адреÑою в мережі Bitcoin.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ðеможливо розблокувати гаманець.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Ðе вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ нові ключі.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -855,10 +489,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>верÑÑ–Ñ—</translation>
</message>
@@ -867,10 +497,6 @@
<translation>(%1-бітний)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Про Bitcoin Core</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>Параметри командного Ñ€Ñдка</translation>
</message>
@@ -882,24 +508,36 @@
<source>command-line options</source>
<translation>параметри командного Ñ€Ñдка</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>ВітаннÑ</translation>
+ <source>UI Options:</source>
+ <translation>Параметри інтерфейÑу:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>Обирати каталог даних під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку (типово: %u)</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>ЛаÑкаво проÑимо в Bitcoin Core.</translation>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Ð’Ñтановити мову (наприклад: "de_DE") (типово: ÑиÑтемна)</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>
+ <source>Start minimized</source>
+ <translation>ЗапуÑкати згорнутим</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 завантажить та збереже копію ланцюжка блоків Bitcoin. Щонайменше %1ГБ даних буде збережено в цьому каталозі. Гаманець теж буде збережено в цьому каталозі.</translation>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Вказати кореневі SSL-Ñертифікати Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ платежу (типово: -ÑиÑтемні-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>Показувати заÑтавку під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку (типово: %u)</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>ВітаннÑ</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -910,10 +548,6 @@
<translation>ВикориÑтовувати Ñвій каталог даних:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Помилка: неможливо Ñтворити обраний каталог даних «%1».</translation>
</message>
@@ -948,10 +582,6 @@
<source>Select payment request file</source>
<translation>Виберіть файл запиту платежу</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Виберіть файл запиту платежу Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -992,10 +622,6 @@
<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 (наприклад, block explorer), що з'ÑвлÑÑ‚ÑŒÑÑ Ð½Ð° вкладці транзакцій у виглÑді пункту контекÑтного меню. %s в URL буде замінено на хеш транзакції. Ð”Ð»Ñ Ð²Ñ–Ð´Ð¾ÐºÑ€ÐµÐ¼Ð»ÐµÐ½Ð½Ñ URLів викориÑтовуйте вертикальну риÑку |.</translation>
</message>
@@ -1020,14 +646,6 @@
<translation>&amp;Мережа</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>&amp;ЗапуÑкати Bitcoin Core при вході до ÑиÑтеми</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = автоматично, &lt;0 = вказує кількіÑÑ‚ÑŒ вільних Ñдер)</translation>
</message>
@@ -1084,6 +702,10 @@
<translation>ПриєднуватиÑÑ Ð´Ð¾ учаÑників через:</translation>
</message>
<message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>Вказує на викориÑÑ‚Ð°Ð½Ð½Ñ Ð½Ð°Ñвного типового прокÑÑ– SOCKS5, що викориÑтувуєтьÑÑ Ð·Ð°Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð²'Ñзку з пірами через мережу такого типу.</translation>
+ </message>
+ <message>
<source>IPv4</source>
<translation>IPv4</translation>
</message>
@@ -1252,97 +874,6 @@
</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>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>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Ðеможливо запуÑтити bitcoin: обробник click-to-pay</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>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>
- <message>
- <source>Network request error</source>
- <translation>Помилка мережевого запиту</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1397,31 +928,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <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>
- <source>Client name</source>
- <translation>Ðазва клієнту</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Ð/Д</translation>
</message>
@@ -1442,10 +950,6 @@
<translation>Загальна</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>ВикориÑтовуєтьÑÑ OpenSSL верÑÑ–Ñ—</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>ВикориÑтовуєтьÑÑ BerkeleyDB верÑÑ–Ñ—</translation>
</message>
@@ -1474,8 +978,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>Пул пам'ÑÑ‚Ñ–</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>Поточне чиÑло транзакцій</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'ÑÑ‚Ñ–</translation>
</message>
<message>
<source>Received</source>
@@ -1594,10 +1106,6 @@
<translation>Вихідних:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Дата збираннÑ</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Файл звіту зневадженнÑ</translation>
</message>
@@ -1634,10 +1142,6 @@
<translation>&amp;Розблокувати Вузол</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>Вітаємо у RPC-конÑолі 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>ВикориÑтовуйте Ñтрілки вгору вниз Ð´Ð»Ñ Ð½Ð°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ— по Ñ–Ñторії, Ñ– &lt;b&gt;Ctrl-L&lt;/b&gt; Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ ÐµÐºÑ€Ð°Ð½Ð°.</translation>
</message>
@@ -1764,18 +1268,6 @@
<source>Remove</source>
<translation>Вилучити</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Скопіювати мітку</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Скопіювати повідомленнÑ</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Копіювати кількіÑÑ‚ÑŒ</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1795,73 +1287,6 @@
<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>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>КількіÑÑ‚ÑŒ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ðазва</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>ПовідомленнÑ</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>Кінцевий URI занадто довгий, Ñпробуйте зменшити текÑÑ‚ Ð´Ð»Ñ Ð¼Ñ–Ñ‚ÐºÐ¸ / повідомленнÑ.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>Помилка при кодуванні URI в QR-код.</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ðазва</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>ПовідомленнÑ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>КількіÑÑ‚ÑŒ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(немає назви)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(без повідомленнÑ)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(без Ñуми)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1982,14 +1407,6 @@
<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>
@@ -2021,110 +1438,6 @@
<source>S&amp;end</source>
<translation>&amp;Відправити</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Підтвердіть відправленнÑ</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 на %2</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>Copy change</source>
- <translation>Копіювати решту</translation>
- </message>
- <message>
- <source>or</source>
- <translation>або</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>КількіÑÑ‚ÑŒ монет Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° бути більше 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <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>
- </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><numerusform>Перше Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¾Ñ‡Ñ–ÐºÑƒÑ”Ñ‚ÑŒÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом %n блоків.</numerusform><numerusform>Перше Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¾Ñ‡Ñ–ÐºÑƒÑ”Ñ‚ÑŒÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом %n блоків.</numerusform></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>
- <message>
- <source>added as transaction fee</source>
- <translation>додано Ñк коміÑÑ–Ñ Ð·Ð° транзакцію</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2137,10 +1450,6 @@
<translation>&amp;Отримувач:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Введіть мітку Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— адреÑи Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ—Ñ— в адреÑну книгу</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Мітка:</translation>
</message>
@@ -2212,10 +1521,6 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core вимикаєтьÑÑ...</translation>
- </message>
- <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation>Ðе вимикайте комп’ютер до Ð·Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вікна.</translation>
</message>
@@ -2306,70 +1611,10 @@
<source>Reset all verify message fields</source>
<translation>Скинути вÑÑ– Ð¿Ð¾Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ повідомленнÑ</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>ÐатиÑніть кнопку «ПідпиÑати повідомленнÑ», Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>Введена нечинна адреÑа.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>Ðе вдалоÑÑ Ð¿Ñ–Ð´Ð¿Ð¸Ñати повідомленнÑ.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñано.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>ÐŸÑ–Ð´Ð¿Ð¸Ñ Ð½Ðµ можливо декодувати.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>Будь лаÑка, перевірте Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñ‚Ð° Ñпробуйте ще.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>ÐŸÑ–Ð´Ð¿Ð¸Ñ Ð½Ðµ збігаєтьÑÑ Ð· хешем повідомленнÑ.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ повідомленнÑ.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐµÐ½Ð¾.</translation>
- </message>
</context>
<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>
- <message>
<source>[testnet]</source>
<translation>[теÑтова мережа]</translation>
</message>
@@ -2382,418 +1627,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>Відкрито до %1</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>Ñуперечить</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1/поза інтернетом</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/не підтверджено</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 підтверджень</translation>
- </message>
- <message>
- <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>
- </message>
- <message>
- <source>Source</source>
- <translation>Джерело</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Згенеровано</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Відправник</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Отримувач</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>ВлаÑна адреÑа</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>тільки ÑпоÑтереженнÑ</translation>
- </message>
- <message>
- <source>label</source>
- <translation>Мітка</translation>
- </message>
- <message>
- <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>
- </message>
- <message>
- <source>Debit</source>
- <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>
- <message>
- <source>Net amount</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>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>ТранзакціÑ</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>Входи</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>КількіÑÑ‚ÑŒ</translation>
- </message>
- <message>
- <source>true</source>
- <translation>true</translation>
- </message>
- <message>
- <source>false</source>
- <translation>false</translation>
- </message>
- <message>
- <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>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>Деталі транзакції</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Даний діалог показує детальну ÑтатиÑтику по вибраній транзакції</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Type</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>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>Підтверджено (%1 підтверджень)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Цей блок не був отриманий жодними іншими вузлами Ñ–, ймовірно, не буде прийнÑтий!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Згенеровано, але не підтверджено</translation>
- </message>
- <message>
- <source>Offline</source>
- <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>ПідтверджуєтьÑÑ (%1 з %2 рекомендованих підтверджень)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>Суперечить</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Отримані на</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Отримано від</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Відправлені на</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Відправлено Ñобі</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Добуті</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>тільки ÑпоÑтереженнÑ</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(недоÑтупно)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—. Ðаведіть вказівник на це поле, щоб показати кількіÑÑ‚ÑŒ підтверджень.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Дата Ñ– чаÑ, коли транзакцію було отримано.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Тип транзакції.</translation>
- </message>
- <message>
- <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>
- <translation>Сума, додана чи знÑта з баланÑу.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Ð’ÑÑ–</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Сьогодні</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Ðа цьому тижні</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Ðа цьому міÑÑці</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Минулого міÑÑцÑ</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Цього року</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Проміжок...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Отримані на</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Відправлені на</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Відправлені Ñобі</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Добуті</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Інше</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Введіть адреÑу чи мітку Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Мінімальна Ñума</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Скопіювати адреÑу</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Скопіювати мітку</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <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>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>ЕкÑпортувати Ñ–Ñторію транзакцій</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>Ð”Ð»Ñ ÑпоÑтереженнÑ</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>Помилка екÑпорту</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>Виникла помилка при Ñпробі Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ–Ñторії транзакцій до %1.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>Підтверджені</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тип</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ðазва</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ÐдреÑа</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>Ідентифікатор</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Діапазон від:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>до</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2801,55 +1641,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Гаманець не завантажувавÑÑ</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Відправити</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;ЕкÑпорт</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>ЕкÑпортувати дані з поточної вкладки в файл</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>Зробити резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ</translation>
- </message>
- <message>
- <source>Wallet Data (*.dat)</source>
- <translation>Данi Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ (*.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>
<source>Options:</source>
@@ -2876,18 +1667,14 @@
<translation>Якщо &lt;category&gt; не задано, або ж Ñкщо &lt;category&gt; = 1, виводить вÑÑŽ налагоджувальну інформацію.</translation>
</message>
<message>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
- <translation>МакÑимальна загальна коміÑÑ–Ñ (в %s) за одну транзакцію; занадто низьке Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ ÑкаÑувати відправку великих транзакцій (типово: %s)</translation>
- </message>
- <message>
- <source>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>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation>Ð’Ñтановлений розмір ланцюжка блоків Ñ” замалим (меншим за %d МіБ). Будь лаÑка, виберіть більше чиÑло.</translation>
</message>
<message>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑіканнÑ: оÑÑ‚Ð°Ð½Ð½Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð²Ð¼Ñ–Ñту гаманцю не обмежуєтьÑÑ Ð´Ñ–Ñми над Ñкороченими данними. Вам необхідно зробити переіндекÑацію -reindex (заново завантажити веcÑŒ ланцюжок блоків в разі поÑви Ñкороченого ланцюга)</translation>
+ </message>
+ <message>
<source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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 та -rescan. Увага: при поверненні до типового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ñ– чаÑтини ланцюжка буде повторно завантажено. (типово: 0 = вимкнути ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ð»Ð°Ð½Ñ†ÑŽÐ¶ÐºÐ°, &gt;%u = очікуваний розмір файлів блоків в МіБ)</translation>
</message>
@@ -2920,6 +1707,10 @@
<translation>Приймати Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð·Ð·Ð¾Ð²Ð½Ñ– (типово: 1 за відÑутноÑÑ‚Ñ– -proxy чи -connect)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Прив'ÑзатиÑÑ Ð´Ð¾ даної адреÑи та проÑлуховувати Ñ—Ñ—. ВикориÑтовуйте Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸Ð´Ñƒ [хоÑÑ‚]:порт Ð´Ð»Ñ IPv6</translation>
</message>
@@ -2948,22 +1739,10 @@
<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>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>ВикориÑтовувати UPnP Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ, що проÑлуховуєтьÑÑ (типово: 1 при проÑлуховуванні та за відÑутноÑÑ‚Ñ– -proxy)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>УВÐГÐ: аномально виÑока кількіÑÑ‚ÑŒ згенерованих блоків, %d блок(ів) було отримано за оÑтанні %d годин(и) (має бути %d)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>УВÐГÐ: перевірте ваше мережеве з'єднаннÑ, %d блок(ів) було отримано за оÑтанні %d годин(и) (має бути %d)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
<translation>Увага: ЧаÑтина мережі викориÑтовує інший головний ланцюжок! ДеÑкі добувачі, можливо, зазнають проблем.</translation>
</message>
@@ -2972,10 +1751,6 @@
<translation>Увага: Ðаш ланцюжок блоків відрізнÑєтьÑÑ Ð²Ñ–Ð´ ланцюжків підключених учаÑників! Можливо, вам, або іншим вузлам, необхідно оновитиÑÑ.</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>Увага: файл 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>
@@ -3016,6 +1791,22 @@
<translation>Ви хочете перебудувати базу даних блоків зараз?</translation>
</message>
<message>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>Дозволено Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ…ÐµÑˆ блоку в Ñ€Ñдок &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>Дозволено Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ…ÐµÑˆ транзакції в Ñ€Ñдок &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>Дозволено Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ RAW блоку в Ñ€Ñдок &lt;address&gt;</translation>
+ </message>
+ <message>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>Дозволено Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ RAW транзакції в Ñ€Ñдок &lt;address&gt;</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>Помилка ініціалізації бази даних блоків</translation>
</message>
@@ -3064,6 +1855,10 @@
<translation>ПідключатиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ до вузлів в мережі &lt;net&gt; (ipv4, ipv6 або onion)</translation>
</message>
<message>
+ <source>Print version and exit</source>
+ <translation>ВерÑÑ–Ñ Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ Ñ– виходу</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>Розмір Ñкороченого ланцюжка блоків не може бути від'ємним. </translation>
</message>
@@ -3120,14 +1915,6 @@
<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>
- <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), IP-адреÑа та маÑка підмережі (наприклад, 1.2.3.4/255.255.255.0) або CIDR-адреÑа (наприклад, 1.2.3.4/24). Цей параметр можна вказувати декілька разів.</translation>
</message>
@@ -3140,10 +1927,6 @@
<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. 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>Створювати нові файли з типовими Ð´Ð»Ñ ÑиÑтеми атрибутами доÑтупу заміÑÑ‚ÑŒ маÑки 077 (діє тільки при вимкненому гаманці)</translation>
</message>
@@ -3160,6 +1943,10 @@
<translation>Виконати команду при надходженні важливого ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ при ÑпоÑтереженні тривалого Ñ€Ð¾Ð·Ð³Ð°Ð»ÑƒÐ¶ÐµÐ½Ð½Ñ Ð»Ð°Ð½Ñ†ÑŽÐ¶ÐºÐ° (заміÑÑ‚ÑŒ %s буде підÑтавлено повідомленнÑ)</translation>
</message>
<message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>КоміÑÑ–Ñ— (в %s/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>
@@ -3184,10 +1971,6 @@
<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>
@@ -3212,48 +1995,24 @@
<translation>Приймати публічні REST-запити (типово: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð½Ð°Ð¹ÐºÑ€Ð°Ñ‰Ð¾Ð³Ð¾ ланцюжка...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ адреÑу Ð´Ð»Ñ -whitebind: «%s»</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>Ðвтоматичне з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· прихованим ÑервіÑом Tor (типово: %d)</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 Розробники Bitcoin Core</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>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>
+ <source>Imports blocks from external blk000??.dat file on startup</source>
+ <translation>Спочатку імпортує блоки з зовнішнього файлу blk000??.dat </translation>
</message>
<message>
- <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Вказано некоректну Ñуму Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ -minrelaytxfee: «%s»</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Вказано некоректну Ñуму Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ -mintxfee: «%s»</translation>
+ <source>Information</source>
+ <translation>ІнформаціÑ</translation>
</message>
<message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -3280,18 +2039,14 @@
<translation>Параметри Ñервера RPC:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>При запуÑку перебудувати Ñ–Ð½Ð´ÐµÐºÑ Ð»Ð°Ð½Ñ†ÑŽÐ¶ÐºÐ° блоків з поточних файлів blk000??.dat</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>Отримувати та відображати Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð· мережі (типово: %u)</translation>
- </message>
- <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation>Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ -maxconnections з %d до %d із-за обмежень ÑиÑтеми.</translation>
</message>
<message>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>Спочатку переглÑнте ланцюжок блоків на наÑвніÑÑ‚ÑŒ втрачених транзакцій гаманцÑ</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>ВідÑилати налагоджувальну інформацію на конÑоль, а не у файл debug.log</translation>
</message>
@@ -3320,6 +2075,14 @@
<translation>Це програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ñ” екÑпериментальним.</translation>
</message>
<message>
+ <source>Tor control port password (default: empty)</source>
+ <translation>Пароль ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚ протоколом Tor (типово: empty)</translation>
+ </message>
+ <message>
+ <source>Tor control port to use if onion listening enabled (default: %s)</source>
+ <translation>СкориÑтайтеÑÑŒ управліннÑм порт протоколом Tor, в разі Ð¿ÐµÑ€ÐµÑ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ цибулевої маршрутизації (типово: %s)</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Сума транзакції занадто мала</translation>
</message>
@@ -3340,18 +2103,22 @@
<translation>Ðеможливо прив'ÑзатиÑÑ Ð´Ð¾ %s на цьому комп'ютері (bind повернув помилку: %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ JSON-RPC-з'єднань</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>Спочатку оновіть гаманець до оÑтанньої верÑÑ–Ñ—</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Потрібно перезапиÑати гаманець: перезапуÑÑ‚Ñ–Ñ‚ÑŒ Bitcoin Core Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ JSON-RPC-з'єднань</translation>
</message>
<message>
<source>Warning</source>
<translation>ПопередженнÑ</translation>
</message>
<message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>Чи Ñлід працювати в режимі тільки блоки (типово: %u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÑÑ–Ñ… транзакцій з гаманцÑ...</translation>
</message>
@@ -3360,10 +2127,6 @@
<translation>Параметри Ñповіщень ZeroMQ:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat пошкоджено, Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ вдалоÑÑ</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Пароль Ð´Ð»Ñ JSON-RPC-з'єднань</translation>
</message>
@@ -3372,10 +2135,6 @@
<translation>Виконати команду, коли з'ÑвитьÑÑ Ð½Ð¾Ð²Ð¸Ð¹ блок (%s в команді змінюєтьÑÑ Ð½Ð° хеш блоку)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Дана довідка</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Дозволити пошук в DNS Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ -addnode, -seednode та -connect</translation>
</message>
@@ -3384,10 +2143,6 @@
<translation>Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑ...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
@@ -3404,8 +2159,8 @@
<translation>Ðе тримати транзакції в пам'ÑÑ‚Ñ– довше &lt;n&gt; годин (типово: %u)</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ wallet.dat! Ð’ÑÑ– ключі прочитано коректно, але дані транзакцій чи запиÑи адреÑної книги можуть бути пропущені або пошкоджені.</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>КоміÑÑ–Ñ— (в %s/kB), що менші за вказану, вважатимутьÑÑ Ð½ÑƒÐ»ÑŒÐ¾Ð²Ð¸Ð¼Ð¸ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹ (типово: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3424,10 +2179,18 @@
<translation>Виводити налагоджувальну інформацію (типово: %u, Ð²ÐºÐ°Ð·Ð°Ð½Ð½Ñ &lt;category&gt; необов'Ñзкове)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>Ð¤Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð±Ð»Ð¾ÐºÑ–Ð² та транзакцій з допомогою фільтрів Блума (типово: %u)</translation>
+ </message>
+ <message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<translation>Загальна довжина Ñ€Ñдку мережевої верÑÑ–Ñ— (%i) перевищує макÑимально допуÑтиму (%i). Зменшіть чиÑло чи розмір коментарів клієнта кориÑтувача.</translation>
</message>
<message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>ÐамагаєтьÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ вихідний трафік відповідно до зданого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (в MIB за 24 години), 0 = без обмежень (типово: %d)</translation>
+ </message>
+ <message>
<source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
<translation>Параметр -socks не підтримуєтьÑÑ. МожливіÑÑ‚ÑŒ вказувати верÑÑ–ÑŽ SOCKS було видалено, так Ñк підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ SOCKS5.</translation>
</message>
@@ -3436,6 +2199,10 @@
<translation>ВикориÑтовувати окремий SOCKS5-прокÑÑ– Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· учаÑниками через приховані ÑервіÑи Tor (типово: %s)</translation>
</message>
<message>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>Логін та хешований пароль Ð´Ð»Ñ Ð·Ð²'Ñзків JSON-RPC. Поле &lt;userpw&gt; має формат: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. КлаÑичний Python script додано до share/rpcuser. Цей параметр може бути заÑтоÑований декілька разів.</translation>
+ </message>
+ <message>
<source>(default: %s)</source>
<translation>(типово: %s)</translation>
</message>
@@ -3444,14 +2211,6 @@
<translation>Завжди дізнаватиÑÑ Ð°Ð´Ñ€ÐµÑи учаÑників через DNS (типово: %u)</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>Помилка при завантаженні wallet.dat</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>
@@ -3536,18 +2295,6 @@
<translation>Ðевідома мережа вказана в -onlynet: «%s»</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ адреÑу Ð´Ð»Ñ -bind: «%s»</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ адреÑу Ð´Ð»Ñ -externalip: «%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_ur_PK.ts b/src/qt/locale/bitcoin_ur_PK.ts
index db5cca3cca..6b43bf63e5 100644
--- a/src/qt/locale/bitcoin_ur_PK.ts
+++ b/src/qt/locale/bitcoin_ur_PK.ts
@@ -26,10 +26,6 @@
<translation>بند</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>کاپی پتÛ</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>سلیکٹڈ پتے کو مٹائیں</translation>
</message>
@@ -45,37 +41,6 @@
<source>&amp;Delete</source>
<translation>مٹا</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>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Ú†Ù¹</translation>
- </message>
- <message>
- <source>Address</source>
- <translation> پتÛ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>چٹ کے بغیر</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -91,23 +56,7 @@
<source>Repeat new passphrase</source>
<translation>نیا پاس Ùریز دÛرائیں</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>بٹوے کی رمزنگاری</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>بٹوا ان لاک</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Ø®ÙÛŒÛ Ú©Ø´Ø§Ø¦ÛŒ کر یںبٹوے Ú©Û’</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>پاس Ùریز تبدیل کریں</translation>
- </message>
- </context>
+</context>
<context>
<name>BanTableModel</name>
</context>
@@ -119,11 +68,12 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
+ <source>Amount:</source>
+ <translation>رقم:</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>رقم</translation>
</message>
@@ -131,14 +81,18 @@
<source>Date</source>
<translation>تاریخ</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation>چٹ کے بغیر</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
- </context>
+ <message>
+ <source>&amp;Label</source>
+ <translation>Ú†Ù¹</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation> پتÛ</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -162,9 +116,6 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -175,9 +126,6 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -186,47 +134,24 @@
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation> پتÛ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>رقم</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ú†Ù¹</translation>
+ <source>Copy &amp;Address</source>
+ <translation>کاپی پتÛ</translation>
</message>
</context>
<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ú†Ù¹</translation>
- </message>
+ <name>SendCoinsDialog</name>
<message>
- <source>Amount</source>
- <translation>رقم</translation>
+ <source>Insufficient funds!</source>
+ <translation>ناکاÙÛŒ Ùنڈز</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>چٹ کے بغیر</translation>
+ <source>Amount:</source>
+ <translation>رقم:</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
<source>Balance:</source>
<translation>بیلنس:</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation>چٹ کے بغیر</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -244,120 +169,14 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>رقم</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>ٹائپ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ú†Ù¹</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>کو بھیجا</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(N / A)</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>تمام</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>آج</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>اس ÛÙتے</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>اس Ù…Ûینے</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Ù¾Ú†Ú¾Ù„Û’ Ù…Ûینے</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>اس سال</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>دیگر</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>کو بھیجا</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>تاریخ</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>ٹائپ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ú†Ù¹</translation>
- </message>
- <message>
- <source>Address</source>
- <translation> پتÛ</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<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>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
- <source>This help message</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 4350d0ac8a..0062abfc1d 100644
--- a/src/qt/locale/bitcoin_uz@Cyrl.ts
+++ b/src/qt/locale/bitcoin_uz@Cyrl.ts
@@ -26,10 +26,6 @@
<translation>&amp;Ðпиш</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>Манзилдан &amp;нуÑха олиш</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>Жорий танланган манзилни рўйхатдан ўчириш</translation>
</message>
@@ -45,73 +41,6 @@
<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>&amp;Танлаш</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>Улар тўловларни жўнатиш учун Ñизнинг 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>Улар тўловларни қабул қилиш учун Ñизнинг Bitcoin манзилларингиз. Ҳар бир ўтказма учун Ñнги қабул қилувчи манзилдан фойдаланиш тавÑÐ¸Ñ Ò›Ð¸Ð»Ð¸Ð½Ð°Ð´Ð¸.</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation>ÐуÑха олиш ва ёрлиқ</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>&amp;Таҳрирлаш</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>Манзил рўйхатини ÑкÑпорт қилиш</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Вергул билан ажратилган файл (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>ЭкÑпорт қилиб бўлмади</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>Манзил</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Ðрлиқ мавжуд ÑмаÑ)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,86 +60,6 @@
<source>Repeat new passphrase</source>
<translation>Янги махфий Ñузни такрорланг</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>Ҳамённи қодлаш</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Ушбу операциÑни амалга ошириш учун ҳамённи қулфдан чиқариш парол Ñўзини талаб қилади.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>Ҳамённи қулфдан чиқариш</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Ушбу операциÑни амалга ошириш учун ҳамённи коддан чиқариш парол Ñўзини талаб қилади.</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>Ҳамённи коддан чиқариш</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>Махфий Ñузни узгартириш</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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;БÐРЧРBITCOIN ПУЛЛÐРИÐГИЗÐИ ЙЎҚОТÐСИЗ&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>Диққат: Caps Lock тугмаÑи ёқилган!</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>Ҳамёни кодланган</translation>
- </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>Ҳамёнга Ñнги махфий Ñўз киритинг.&lt;br/&gt;ИлтимоÑ, &lt;b&gt;ўнта ёки таÑодифий белгили&lt;/b&gt; махфий Ñўздан фойдаланинг ёки &lt;b&gt;Ñаккизта ёки кўпроқ Ñўзлар&lt;/b&gt;дан фойдаланинг.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation>Ҳамённи кодлаш амалга ошмади</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Ҳамённи кодлаш ташқи хато туфайли амалга ошмади. Ҳамёнингиз кодланмади.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>Киритилган пароллар Ð¼Ð¾Ñ ÐºÐµÐ»Ð¼Ð°Ð´Ð¸.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>Ҳамённи қулфдан чиқариш амалга ошмади</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Ҳамённи коддан чиқариш учун киритилган парол нотўғри.</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>Ҳамённи коддан чиқариш амалга ошмади</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>Ҳамён пароли муваффақиÑтли алмаштирилди.</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -290,14 +139,6 @@
<translation>Интернет манзилни очиш</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin аÑÐ¾Ñ Ð¼Ð¸Ð¶Ð¾Ð·Ð¸</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>ДиÑкдан блоклар импорт қилинмоқда...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
<translation>ДиÑкдаги блоклар қайта индекÑланмоқда...</translation>
</message>
@@ -342,10 +183,6 @@
<translation>&amp;Қабул қилиш</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>
@@ -382,18 +219,10 @@
<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 кодлари ва bitcoin ёрдамида Ñратишлар: URI’лар) Ñўраш</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <translation>Bitcoin Core &amp;ҳақида</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Фойдаланилган жўнатилган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
</message>
@@ -409,10 +238,6 @@
<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>Мавжуд Bitcoin буйруқлар матни моÑламалари билан Bitcoin Core ёрдам хабарларини олиш рўйхатини кўрÑатиш</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n та Bitcoin тармоғига фаол уланиш мавжуд</numerusform></translation>
@@ -491,13 +316,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Тармоқ огоҳлантиргичи</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -563,138 +381,6 @@
<source>Priority</source>
<translation>Муҳимлиги</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>Манзилни нуÑхалаш</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Ðрликни нуÑхала</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Кийматни нуÑхала</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Ўтказам рақамидан нуÑха олиш</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>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Ҳар бир кирим +/- %1 Ñатоши(лар) билан ўзгариши мумкин.</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>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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>%1 (%2)дан ўзгартириш</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(ўзгартириш)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -718,38 +404,6 @@
<source>&amp;Address</source>
<translation>&amp;Манзил</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>Янги кабул килувчи манзил</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>Янги жунатилувчи манзил</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>Кабул килувчи манзилни тахрирлаш</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>Жунатилувчи манзилни тахрирлаш</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>Киритилган "%1" манзили аллақачон манзил китобида.</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>Киритилган "%1" манзили тўғри Bitcoin манзили ÑмаÑ.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>Ҳамён қулфдан чиқмади.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>Янги калит Ñратиш амалга ошмади.</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -777,10 +431,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>version</source>
<translation>верÑиÑÑи</translation>
</message>
@@ -789,8 +439,8 @@
<translation>(%1-bit)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>Bitcoin Core ҳақида</translation>
+ <source>Command-line options</source>
+ <translation>Буйруқлар Ñатри моÑламалари</translation>
</message>
<message>
<source>Usage:</source>
@@ -800,7 +450,7 @@
<source>command-line options</source>
<translation>буйруқлар қатори орқали моÑлаш</translation>
</message>
-</context>
+ </context>
<context>
<name>Intro</name>
<message>
@@ -808,18 +458,6 @@
<translation>Хуш келибÑиз</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>"Bitcoin Core"га хуш келибÑиз.</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 юклаб олинади ва Bitcoin блок занжири нуÑхаÑи жойлаштирилади. Камида %1GB маълумот ушбу директориÑга жойлаштирилади ва вақт давомида ÑžÑиб боради. Ҳамён ҳам ушбу директориÑда жойлашади.</translation>
- </message>
- <message>
<source>Use the default data directory</source>
<translation>Стандарт маълумотлар директориÑÑидан фойдаланиш</translation>
</message>
@@ -828,10 +466,6 @@
<translation>Бошқа маълумотлар директориÑÑида фойдаланинг:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>Хато: кўрÑатилган "%1" маълумотлар директориÑÑини Ñратиб бўлмайди.</translation>
</message>
@@ -858,10 +492,6 @@
<source>Select payment request file</source>
<translation>Тўлов Ñўрови файлини танлаш</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>Очиш учун тўлов Ñўрови файлини танлаш</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -906,6 +536,10 @@
<translation>Тармоқ</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>Ҳамён</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>ПрокÑи &amp;IP рақами:</translation>
</message>
@@ -1050,29 +684,6 @@
</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>Payment request error</source>
- <translation>Тўлов Ñўрови хато</translation>
- </message>
- </context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1115,31 +726,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <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>
- <source>Client name</source>
- <translation>Мижоз номи</translation>
- </message>
- <message>
<source>N/A</source>
<translation>Тўғри келмайди</translation>
</message>
@@ -1160,10 +748,6 @@
<translation>ÐÑоÑий</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>Фойдаланилаётган OpenSSL верÑиÑÑи</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>Фойдаланилаётган BerkeleyDB верÑиÑÑи</translation>
</message>
@@ -1256,10 +840,6 @@
<translation>Ташқарига:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>Тузилган ÑанаÑи</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>Тузатиш журнали файли</translation>
</message>
@@ -1382,18 +962,6 @@
<source>Remove</source>
<translation>Ўчириш</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>Ðрликни нуÑхала</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>Хабарни нуÑхала</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Кийматни нуÑхала</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1409,65 +977,6 @@
<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>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Манзил</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Миқдори</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ðрлик</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Хабар</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>Сана</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ðрлик</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>Хабар</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Миқдори</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(Ðрлик мавжуд ÑмаÑ)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(Хабар йўқ)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(Миқдор мавжуд ÑмаÑ)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1579,74 +1088,6 @@
<source>S&amp;end</source>
<translation>Жў&amp;натиш</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>Тангалар жўнаишни таÑдиқлаш</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 дан %2</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>Copy change</source>
- <translation>ÐуÑха қайтими</translation>
- </message>
- <message>
- <source>or</source>
- <translation>ёки</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>Тўлов миқдори 0. дан катта бўлиши керак. </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>
- <message>
- <source>added as transaction fee</source>
- <translation>ўтказма Ñолиғи қўшилди</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -1659,10 +1100,6 @@
<translation>&amp;Тўлов олувчи:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>Манзил китобингизга қўшиш учун ушбу манзил учун ёрлиқ киритинг</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>&amp;Ðрлиқ:</translation>
</message>
@@ -1690,6 +1127,10 @@
<source>Message:</source>
<translation>Хабар</translation>
</message>
+ <message>
+ <source>Pay To:</source>
+ <translation>Тўлов олувчи:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -1720,22 +1161,10 @@
<source>Clear &amp;All</source>
<translation>БарчаÑини &amp; Тозалаш</translation>
</message>
- <message>
- <source>Message verified.</source>
- <translation>Хабар таÑдиқланди.</translation>
- </message>
-</context>
+ </context>
<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>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -1744,354 +1173,16 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>%1 гача очиш</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/таÑдиқланмади</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 таÑдиқлашлар</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Сана</translation>
- </message>
- <message>
- <source>Source</source>
- <translation>Манба</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>Яратилган</translation>
- </message>
- <message>
- <source>From</source>
- <translation>Дан</translation>
- </message>
- <message>
- <source>To</source>
- <translation>Га</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>ўз манзили</translation>
- </message>
- <message>
- <source>label</source>
- <translation>ёрлиқ</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>Кредит (қарз)</translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>қабул қилинмади</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation>Ўтказма тўлови</translation>
- </message>
- <message>
- <source>Net amount</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>
- <message>
- <source>Merchant</source>
- <translation>Савдо</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation>Ўтказма</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Миқдори</translation>
- </message>
- <message>
- <source>true</source>
- <translation>роÑÑ‚</translation>
- </message>
- <message>
- <source>false</source>
- <translation>ёлғон</translation>
- </message>
- <message>
- <source>, has not been successfully broadcast yet</source>
- <translation>, ҳалигача транÑлÑÑ†Ð¸Ñ Ò›Ð¸Ð»Ð¸Ð½Ð³Ð°Ð½Ð¸ йўқ</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation>Ðомаълум</translation>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ð°Ñ„Ñилотлари</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>Ушбу ойна операциÑнинг батафÑил таърифини кўрÑатади</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>Сана</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Тури</translation>
- </message>
- <message>
- <source>Open until %1</source>
- <translation>%1 гача очиш</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>ТаÑдиқланди (%1 та таÑдиқ)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Ушбу Ñ‚ÑžÑиқ бирорта бошқа уланишлар томонидан қабул қилинмаган ва таÑдиқланмаган!</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>Яратилди, аммо қабул қилинмади</translation>
- </message>
- <message>
- <source>Offline</source>
- <translation>Оффлайн</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ðрлиқ</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation>ТаÑдиқланмаган</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ðрдамида қабул қилиш</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>Дан қабул қилиш</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Жўнатиш</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>Ўзингизга тўлов</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Фойда</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(Ò›/Ò›)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Ўтказма ҳолати. Ушбу майдон бўйлаб таÑдиқлашлар Ñонини кўрÑатиш.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>Ўтказма қабул қилинган Ñана ва вақт.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>Пул ўтказмаÑи тури</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation>Миқдор ўчирилган ёки баланÑга қўшилган.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>Барча</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>Бугун</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>Шу ҳафта</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>Шу ой</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>Ўтган хафта</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>Шу йил</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>Оралиқ...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>Ðрдамида қабул қилинган</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>Жўнатиш</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>Ўзингизга</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>Фойда</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>Бошка</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>Излаш учун манзил ёки ёрлиқни киритинг</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>Мин қиймат</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>Манзилни нуÑхалаш</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>Ðрликни нуÑхалаш</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Кийматни нуÑхала</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>Ўтказам рақамидан нуÑха олиш</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>Ðрликни тахрирлаш</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>Ўтказма тафÑилотларини кўрÑатиш </translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>Ўтказмалар тарихини ÑкÑпорт қилиш</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>ТаÑдиқланди</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>Сана</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>Туркум</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Ðрлик</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Манзил</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>Оралиқ:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>Кимга</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>Хали бирорта хамён юкланмади</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>Тангаларни жунат</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>&amp;ЭкÑпорт</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>Жорий ички ойна ичидаги маълумотларни файлга ÑкÑпорт қилиш</translation>
- </message>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
@@ -2110,6 +1201,10 @@
<translation>Демон Ñифатида орқа фонда ишга туширинг ва буйруқларга рози бўлинг</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>Connection options:</source>
<translation>Уланиш кўрÑаткичлари:</translation>
</message>
@@ -2130,14 +1225,14 @@
<translation>JSON-RPC уланишлари учун парол</translation>
</message>
<message>
- <source>This help message</source>
- <translation>Бу ёрдам хабари</translation>
- </message>
- <message>
<source>Loading addresses...</source>
<translation>Манзиллар юкланмоқда...</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation>Кам миқдор</translation>
+ </message>
+ <message>
<source>Loading block index...</source>
<translation>ТўÑиқ индекÑи юкланмоқда...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_vi.ts b/src/qt/locale/bitcoin_vi.ts
index 7a7c68c4b3..e8bf01ab1b 100644
--- a/src/qt/locale/bitcoin_vi.ts
+++ b/src/qt/locale/bitcoin_vi.ts
@@ -18,32 +18,9 @@
<translation>Sao chép</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>Sao chép địa chỉ</translation>
- </message>
- <message>
<source>&amp;Delete</source>
<translation>&amp;Xóa</translation>
</message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Tập tin tách biệt bởi dấu phẩy (*.csv)</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation>Nhãn dữ liệu</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Äịa chỉ</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(chưa có nhãn)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -55,22 +32,27 @@
<name>BitcoinGUI</name>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
- <source>Amount</source>
- <translation>Số lượng</translation>
+ <source>Amount:</source>
+ <translation>Số lượng:</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(chưa có nhãn)</translation>
+ <source>Amount</source>
+ <translation>Số lượng</translation>
</message>
</context>
<context>
<name>EditAddressDialog</name>
- </context>
+ <message>
+ <source>&amp;Label</source>
+ <translation>Nhãn dữ liệu</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation>Äịa chỉ</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
</context>
@@ -90,9 +72,6 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
@@ -103,9 +82,6 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -114,38 +90,15 @@
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Address</source>
- <translation>Äịa chỉ</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Số lượng</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nhãn dữ liệu</translation>
- </message>
- </context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Label</source>
- <translation>Nhãn dữ liệu</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>Số lượng</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(chưa có nhãn)</translation>
+ <source>Copy &amp;Address</source>
+ <translation>Sao chép địa chỉ</translation>
</message>
</context>
<context>
<name>SendCoinsDialog</name>
<message>
- <source>(no label)</source>
- <translation>(chưa có nhãn)</translation>
+ <source>Amount:</source>
+ <translation>Số lượng:</translation>
</message>
</context>
<context>
@@ -164,50 +117,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Amount</source>
- <translation>Số lượng</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Label</source>
- <translation>Nhãn dữ liệu</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>Tập tin tách biệt bởi dấu phẩy (*.csv)</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>Nhãn dữ liệu</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>Äịa chỉ</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_vi_VN.ts b/src/qt/locale/bitcoin_vi_VN.ts
index c55aecd82d..a4e1588c93 100644
--- a/src/qt/locale/bitcoin_vi_VN.ts
+++ b/src/qt/locale/bitcoin_vi_VN.ts
@@ -26,10 +26,6 @@
<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>
@@ -45,61 +41,6 @@
<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>
- <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>
@@ -119,23 +60,7 @@
<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>
<context>
<name>BanTableModel</name>
</context>
@@ -166,12 +91,12 @@
<translation>Xem thông tin vỠQt</translation>
</message>
<message>
- <source>Open &amp;URI...</source>
- <translation>Mở &amp;URI...</translation>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Äịa chỉ nhận</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>Bitcoin Core client</translation>
+ <source>Open &amp;URI...</source>
+ <translation>Mở &amp;URI...</translation>
</message>
<message>
<source>Bitcoin</source>
@@ -209,14 +134,6 @@
<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>
@@ -263,13 +180,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>Network Alert</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
@@ -315,46 +225,18 @@
<source>Priority</source>
<translation>Tầm quan trá»ng</translation>
</message>
+</context>
+<context>
+ <name>EditAddressDialog</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>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>
+ <source>&amp;Label</source>
+ <translation>Nhãn</translation>
</message>
<message>
- <source>(no label)</source>
- <translation>(không nhãn)</translation>
+ <source>&amp;Address</source>
+ <translation>Äịa chỉ</translation>
</message>
- </context>
-<context>
- <name>EditAddressDialog</name>
- </context>
+</context>
<context>
<name>FreespaceChecker</name>
<message>
@@ -365,17 +247,9 @@
<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>
@@ -384,10 +258,6 @@
<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>
@@ -418,6 +288,10 @@
<translation>MB</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>Ví</translation>
+ </message>
+ <message>
<source>&amp;Display</source>
<translation>&amp;Hiển thị</translation>
</message>
@@ -446,9 +320,6 @@
</message>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -463,11 +334,12 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
<message>
+ <source>&amp;Information</source>
+ <translation>Thông tin</translation>
+ </message>
+ <message>
<source>General</source>
<translation>Nhìn Chung</translation>
</message>
@@ -491,50 +363,23 @@
<context>
<name>ReceiveCoinsDialog</name>
<message>
- <source>Copy label</source>
- <translation>Copy nhãn</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>Lượng copy</translation>
+ <source>&amp;Amount:</source>
+ <translation>Lượng:</translation>
</message>
-</context>
+ </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>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Copy Äịa Chỉ</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>
+ <name>SendCoinsDialog</name>
<message>
- <source>(no label)</source>
- <translation>(không nhãn)</translation>
+ <source>Insufficient funds!</source>
+ <translation>Không đủ tiá»n</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
<source>Quantity:</source>
<translation>Lượng:</translation>
@@ -559,17 +404,13 @@
<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>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation>Lượng:</translation>
+ </message>
</context>
<context>
<name>ShutdownWindow</name>
@@ -579,100 +420,30 @@
</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>
+ <name>UnitDisplayStatusBarControl</name>
</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>
+ <name>bitcoin-core</name>
<message>
- <source>Label</source>
- <translation>Nhãn</translation>
+ <source>Options:</source>
+ <translation>Lá»±a chá»n:</translation>
</message>
<message>
- <source>Address</source>
- <translation>Äịa chỉ</translation>
- </message>
- </context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- </context>
-<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>X&amp;uất</translation>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</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>
+ <source>(default: %u)</source>
+ <translation>(mặc định: %u)</translation>
</message>
- </context>
-<context>
- <name>bitcoin-core</name>
<message>
<source>Information</source>
<translation>Thông tin</translation>
@@ -686,10 +457,6 @@
<translation>Chú ý</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>
diff --git a/src/qt/locale/bitcoin_zh.ts b/src/qt/locale/bitcoin_zh.ts
index 288c1c5f25..bceba9dfdd 100644
--- a/src/qt/locale/bitcoin_zh.ts
+++ b/src/qt/locale/bitcoin_zh.ts
@@ -3,9 +3,6 @@
<name>AddressBookPage</name>
</context>
<context>
- <name>AddressTableModel</name>
- </context>
-<context>
<name>AskPassphraseDialog</name>
</context>
<context>
@@ -23,9 +20,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- </context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Date</source>
@@ -58,18 +52,12 @@
<name>OverviewPage</name>
</context>
<context>
- <name>PaymentServer</name>
- </context>
-<context>
<name>PeerTableModel</name>
</context>
<context>
<name>QObject</name>
</context>
<context>
- <name>QRImageWidget</name>
- </context>
-<context>
<name>RPCConsole</name>
</context>
<context>
@@ -79,30 +67,15 @@
<name>ReceiveRequestDialog</name>
</context>
<context>
- <name>RecentRequestsTableModel</name>
+ <name>SendCoinsDialog</name>
<message>
- <source>Date</source>
- <translation>日期</translation>
+ <source>Insufficient funds!</source>
+ <translation>ä½™é¢ä¸è¶³</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
<source>Choose...</source>
<translation>选择...</translation>
</message>
- <message>
- <source>Pay only the required fee of %1</source>
- <translation>仅支付全é¢çš„%1</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation>收款人地å€æ— æ•ˆï¼Œè¯·å†æ¬¡ç¡®è®¤ã€‚</translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation>警告:比特å¸åœ°å€æ— æ•ˆ</translation>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -120,42 +93,12 @@
<name>TrafficGraphWidget</name>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- </context>
-<context>
<name>TransactionDescDialog</name>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- </context>
-<context>
<name>UnitDisplayStatusBarControl</name>
</context>
<context>
- <name>WalletFrame</name>
- </context>
-<context>
- <name>WalletModel</name>
- </context>
-<context>
- <name>WalletView</name>
- </context>
-<context>
<name>bitcoin-core</name>
<message>
<source>Transaction amounts must be positive</source>
@@ -174,26 +117,10 @@
<translation>警告</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat文件å—æŸï¼Œä¿®å¤å¤±è´¥</translation>
- </message>
- <message>
- <source>This help message</source>
- <translation>æ­¤æ¡å¸®åŠ©ä¿¡æ¯</translation>
- </message>
- <message>
<source>Loading addresses...</source>
<translation>正在载入地å€...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <translation>wallet.dat文件加载错误:钱包å—æŸ</translation>
- </message>
- <message>
- <source>Error loading wallet.dat</source>
- <translation>wallet.dat文件加载错误</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>ä½™é¢ä¸è¶³</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts
index 778462e681..92a7006d30 100644
--- a/src/qt/locale/bitcoin_zh_CN.ts
+++ b/src/qt/locale/bitcoin_zh_CN.ts
@@ -23,11 +23,7 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation>关闭(&amp;C)</translation>
- </message>
- <message>
- <source>&amp;Copy Address</source>
- <translation>å¤åˆ¶åœ°å€(&amp;C)</translation>
+ <translation>关闭(&amp;l)</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>删除(&amp;D)</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>选择(&amp;H)</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>
- <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;L)</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation>编辑(&amp;E)</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation>导出地å€åˆ—表</translation>
- </message>
- <message>
- <source>Comma separated file (*.csv)</source>
- <translation>逗å·åˆ†éš”文件 (*.csv)</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>导出失败</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>地å€</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(没有标签)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>é‡å¤æ–°å¯†ç </translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>钱包加密</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>æ­¤æ“作需è¦æ‚¨é¦–先使用密ç è§£é”该钱包。</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>解é”钱包</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>该æ“作需è¦æ‚¨é¦–先使用密ç è§£å¯†é’±åŒ…。</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>解密钱包</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>更改密ç </translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>警告:大写é”定键处于打开状æ€ï¼</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>钱包已加密</translation>
- </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>请输入新的钱包密ç . &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>
- <translation>钱包加密失败</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>由于一个本地错误,加密钱包的æ“作已ç»å¤±è´¥ã€‚您的钱包没能被加密。</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>密ç ä¸åŒ¹é…。</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>钱包解é”失败</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>用于解密钱包的密ç ä¸æ­£ç¡®ã€‚</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>钱包解密失败。</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>修改钱包密ç æˆåŠŸã€‚</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -226,7 +67,11 @@
<source>IP/Netmask</source>
<translation>IP/网络掩ç </translation>
</message>
- </context>
+ <message>
+ <source>Banned Until</source>
+ <translation>在此之å‰ç¦æ­¢ï¼š</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -266,8 +111,12 @@
<translation>退出程åº</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>&amp;关于 %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
- <translation>关于 &amp;Qt</translation>
+ <translation>关于Qt(&amp;Q)</translation>
</message>
<message>
<source>Show information about Qt</source>
@@ -302,16 +151,8 @@
<translation>打开 &amp;URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>比特å¸æ ¸å¿ƒé’±åŒ…</translation>
- </message>
- <message>
- <source>Importing blocks from disk...</source>
- <translation>正在从ç£ç›˜å¯¼å…¥æ•°æ®å—...</translation>
- </message>
- <message>
<source>Reindexing blocks on disk...</source>
- <translation>正在为数æ®å—建立索引...</translation>
+ <translation>正在为数æ®å—é‡å»ºç´¢å¼•...</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -354,10 +195,6 @@
<translation>接收(&amp;R)</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>显示有关比特å¸æ ¸å¿ƒé’±åŒ…ä¿¡æ¯</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>显示 / éšè—(&amp;S)</translation>
</message>
@@ -394,22 +231,10 @@
<translation>分页工具æ </translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>比特å¸æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation>请求支付(生æˆäºŒç»´ç å’Œ bitcoin: URI)</translation>
</message>
<message>
- <source>&amp;About Bitcoin Core</source>
- <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>
@@ -425,10 +250,6 @@
<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>显示比特å¸æ ¸å¿ƒ 程åºå¸®åŠ©ä¿¡æ¯ï¼ŒèŽ·å–å¯ç”¨çš„命令行选项 </translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n 个到比特å¸ç½‘络的活动连接</numerusform></translation>
@@ -541,13 +362,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>网络警报</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -625,150 +439,6 @@
<source>Priority</source>
<translation>优先级</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>å¤åˆ¶åœ°å€</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>å¤åˆ¶æ ‡ç­¾</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>å¤åˆ¶é‡‘é¢</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>å¤åˆ¶äº¤æ˜“ç¼–å·</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>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>
- <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>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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>æ¥è‡ª%1的零钱 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(零钱)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -792,38 +462,6 @@
<source>&amp;Address</source>
<translation>地å€(&amp;A)</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>新建接收地å€</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>新建å‘é€åœ°å€</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>编辑接收地å€</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>编辑å‘é€åœ°å€</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>输入的地å€â€œ%1â€å·²ç»å­˜åœ¨äºŽåœ°å€ç°¿ä¸­ã€‚</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>您输入的“%1â€ä¸æ˜¯æœ‰æ•ˆçš„比特å¸åœ°å€ã€‚</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>无法解é”钱包</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>新的密钥生æˆå¤±è´¥ã€‚</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -851,10 +489,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>比特å¸æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>version</source>
<translation>版本</translation>
</message>
@@ -863,10 +497,6 @@
<translation>(%1 ä½)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>关于比特å¸æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>Command-line options</source>
<translation>命令行选项</translation>
</message>
@@ -878,24 +508,36 @@
<source>command-line options</source>
<translation>命令行选项</translation>
</message>
-</context>
-<context>
- <name>Intro</name>
<message>
- <source>Welcome</source>
- <translation>欢迎</translation>
+ <source>UI Options:</source>
+ <translation>ç•Œé¢é€‰é¡¹ï¼š</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>在å¯åŠ¨æ—¶é€‰æ‹©ç›®å½•ï¼ˆé»˜è®¤%u)</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>欢迎使用 比特å¸æ ¸å¿ƒ 程åºã€‚</translation>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>设置语言, 例如“zh-CNâ€ï¼ˆé»˜è®¤ï¼šç³»ç»Ÿè¯­è¨€ï¼‰</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>
+ <source>Start minimized</source>
+ <translation>å¯åŠ¨æ—¶æœ€å°åŒ–</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>比特å¸æ ¸å¿ƒ 程åºä¼šä¸‹è½½å‚¨å­˜ä¸€ä»½æ•°æ®å—链(blockchain)ã€‚è‡³å°‘éœ€è¦ %1 GB的存储空间,éšç€æ—¶é—´æŽ¨ç§»ä¼šéœ€è¦æ›´å¤šçš„存储空间。钱包文件也储存在该目录。</translation>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>设置付款请求的SSLæ ¹è¯ä¹¦ï¼ˆé»˜è®¤ï¼š-系统-)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: %u)</source>
+ <translation>显示å¯åŠ¨ç”»é¢ï¼ˆé»˜è®¤ï¼š%u)</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>欢迎</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -906,10 +548,6 @@
<translation>使用自定义的数æ®ç›®å½•ï¼š</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>比特å¸æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>错误:无法创建 指定的数æ®ç›®å½• "%1" </translation>
</message>
@@ -944,10 +582,6 @@
<source>Select payment request file</source>
<translation>选择付款请求文件 </translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>选择需è¦æ‰“开的付款请求文件 </translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -988,10 +622,6 @@
<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>
@@ -1016,14 +646,6 @@
<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>
@@ -1076,6 +698,14 @@
<translation>代ç†ç«¯å£ï¼ˆä¾‹å¦‚ 9050)</translation>
</message>
<message>
+ <source>Used for reaching peers via:</source>
+ <translation>连接到åŒä¼´çš„æ–¹å¼ï¼š</translation>
+ </message>
+ <message>
+ <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation>如果默认的SOCKS5代ç†è¢«ç”¨äºŽåœ¨è¯¥ç½‘络下连接åŒä¼´ï¼Œåˆ™æ˜¾ç¤º</translation>
+ </message>
+ <message>
<source>IPv4</source>
<translation>IPv4</translation>
</message>
@@ -1088,6 +718,14 @@
<translation>Tor</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
+ <translation>在Tor匿å网络下通过ä¸åŒçš„SOCKS5代ç†è¿žæŽ¥æ¯”特å¸ç½‘络</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
+ <translation>通过Toréšè—æœåŠ¡è¿žæŽ¥èŠ‚点时 使用ä¸åŒçš„SOCKS5代ç†</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation>窗å£(&amp;W)</translation>
</message>
@@ -1236,97 +874,6 @@
</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>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>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>暂时无法å¯åŠ¨æ¯”特å¸ï¼šç‚¹å‡»æ”¯ä»˜åŠŸèƒ½</translation>
- </message>
- <message>
- <source>Payment request fetch URL is invalid: %1</source>
- <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>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>
- <message>
- <source>Network request error</source>
- <translation>网络请求出错</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1381,31 +928,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>ä¿å­˜å›¾ç‰‡(&amp;S)...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>å¤åˆ¶å›¾ç‰‡(&amp;C)</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>ä¿å­˜äºŒç»´ç </translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG图片(*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>客户端å称</translation>
- </message>
- <message>
<source>N/A</source>
<translation>ä¸å¯ç”¨</translation>
</message>
@@ -1426,10 +950,6 @@
<translation>常规</translation>
</message>
<message>
- <source>Using OpenSSL version</source>
- <translation>使用 OpenSSL 版本</translation>
- </message>
- <message>
<source>Using BerkeleyDB version</source>
<translation>使用的 BerkeleyDB 版本</translation>
</message>
@@ -1458,8 +978,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>资金池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>当å‰äº¤æ˜“æ•°é‡</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>内存使用</translation>
</message>
<message>
<source>Received</source>
@@ -1474,6 +1002,10 @@
<translation>åŒä¼´(&amp;P)</translation>
</message>
<message>
+ <source>Banned peers</source>
+ <translation>节点黑åå•</translation>
+ </message>
+ <message>
<source>Select a peer to view detailed information.</source>
<translation>选择节点查看详细信æ¯ã€‚</translation>
</message>
@@ -1490,6 +1022,10 @@
<translation>版本</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation>正在å¯åŠ¨æ•°æ®å—</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation>åŒæ­¥åŒºå—头</translation>
</message>
@@ -1526,6 +1062,10 @@
<translation>Ping 时间</translation>
</message>
<message>
+ <source>Ping Wait</source>
+ <translation>Ping等待</translation>
+ </message>
+ <message>
<source>Time Offset</source>
<translation>时间å移</translation>
</message>
@@ -1562,10 +1102,6 @@
<translation>输出:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>创建时间</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>调试日志文件</translation>
</message>
@@ -1574,6 +1110,14 @@
<translation>清空控制å°</translation>
</message>
<message>
+ <source>&amp;Disconnect Node</source>
+ <translation>(&amp;D)断开节点连接</translation>
+ </message>
+ <message>
+ <source>Ban Node for</source>
+ <translation>ç¦æ­¢èŠ‚点连接时长:</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation>1 å°æ—¶(&amp;H)</translation>
</message>
@@ -1590,8 +1134,8 @@
<translation>1 å¹´(&amp;Y)</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>欢迎使用 比特å¸æ ¸å¿ƒ RPC 控制å°ã€‚</translation>
+ <source>&amp;Unban Node</source>
+ <translation>(&amp;U)å…许节点连接</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>
@@ -1720,18 +1264,6 @@
<source>Remove</source>
<translation>移除</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>å¤åˆ¶æ ‡ç­¾</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>å¤åˆ¶æ¶ˆæ¯ </translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>å¤åˆ¶é‡‘é¢</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1751,73 +1283,6 @@
<source>&amp;Save Image...</source>
<translation>ä¿å­˜å›¾ç‰‡(&amp;S)...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>请求付款到 %1</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>付款信æ¯</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>地å€</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>金é¢</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>标签</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>消æ¯</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI 太长,请试ç€ç²¾ç®€æ ‡ç­¾æˆ–消æ¯æ–‡æœ¬ã€‚</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>å°† URI 转为二维ç å¤±è´¥ã€‚</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>标签</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>消æ¯</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>金é¢</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(没有标签)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(无消æ¯)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(无金é¢) </translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1938,14 +1403,6 @@
<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>
@@ -1977,110 +1434,6 @@
<source>S&amp;end</source>
<translation>å‘é€(&amp;E)</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>确认å‘é€è´§å¸</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 到 %2</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>Copy change</source>
- <translation>å¤åˆ¶é›¶é’±</translation>
- </message>
- <message>
- <source>or</source>
- <translation>或</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>支付金é¢å¿…须大于0。</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <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>
- </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>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>
- <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>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2093,10 +1446,6 @@
<translation>付给(&amp;T):</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>为这个地å€è¾“入一个标签,以便将它添加到您的地å€ç°¿</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>标签(&amp;L):</translation>
</message>
@@ -2168,10 +1517,6 @@
<context>
<name>ShutdownWindow</name>
<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>
@@ -2262,70 +1607,10 @@
<source>Reset all verify message fields</source>
<translation>清空所有验è¯æ¶ˆæ¯æ </translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>å•å‡»â€œç­¾å消æ¯â€œäº§ç”Ÿç­¾å。</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>输入的地å€éžæ³•ã€‚</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>消æ¯ç­¾å失败。</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>消æ¯å·²ç­¾å。</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>ç­¾å无法解ç ã€‚</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>请检查签ååŽé‡è¯•ã€‚</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>ç­¾å与消æ¯æ‘˜è¦ä¸åŒ¹é…。</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>消æ¯éªŒè¯å¤±è´¥ã€‚</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>消æ¯éªŒè¯æˆåŠŸã€‚</translation>
- </message>
</context>
<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>[测试网络]</translation>
</message>
@@ -2338,418 +1623,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>至 %1 个数æ®å—时开å¯</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>å‘现冲çª</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1 / 离线</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1/未确认</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>%1 已确认</translation>
- </message>
- <message>
- <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>
- </message>
- <message>
- <source>Source</source>
- <translation>æº</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>生æˆ</translation>
- </message>
- <message>
- <source>From</source>
- <translation>æ¥è‡ª</translation>
- </message>
- <message>
- <source>To</source>
- <translation>到</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>自己的地å€</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>观察地å€(watch-only) </translation>
- </message>
- <message>
- <source>label</source>
- <translation>标签</translation>
- </message>
- <message>
- <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>
- </message>
- <message>
- <source>Debit</source>
- <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>
- <message>
- <source>Net amount</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>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>交易</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>输入</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>金é¢</translation>
- </message>
- <message>
- <source>true</source>
- <translation>正确</translation>
- </message>
- <message>
- <source>false</source>
- <translation>错误</translation>
- </message>
- <message>
- <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>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>交易细节</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>当å‰é¢æ¿æ˜¾ç¤ºäº†äº¤æ˜“的详细信æ¯</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- <message>
- <source>Type</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>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>已确认 (%1 æ¡ç¡®è®¤ä¿¡æ¯)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>此数æ®å—未被任何其他节点接收,å¯èƒ½ä¸è¢«æŽ¥å—ï¼</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>已生æˆä½†æœªè¢«æŽ¥å—</translation>
- </message>
- <message>
- <source>Offline</source>
- <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>
- <message>
- <source>Received from</source>
- <translation>收款æ¥è‡ª</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>å‘é€ç»™</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>付款给自己</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>挖矿所得</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>观察地å€(watch-only) </translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(ä¸å¯ç”¨ï¼‰</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>交易状æ€ã€‚ 鼠标移到此区域å¯æ˜¾ç¤ºç¡®è®¤é¡¹æ•°é‡ã€‚</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>接收到交易的时间</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>交易类别。</translation>
- </message>
- <message>
- <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>
- <translation>从余é¢æ·»åŠ æˆ–移除的金é¢ã€‚</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>全部</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>今天</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>本周</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>本月</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>上月</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>今年</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>范围...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>接收于</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>å‘é€ç»™</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>到自己</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>挖矿所得</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>其他</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>输入地å€æˆ–标签进行æœç´¢</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>最å°é‡‘é¢</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>å¤åˆ¶åœ°å€</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>å¤åˆ¶æ ‡ç­¾</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>å¤åˆ¶é‡‘é¢</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>å¤åˆ¶äº¤æ˜“ç¼–å·</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>编辑标签</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>显示交易详情</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>导出交易历å²</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>观察地å€(Watch-only) </translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>导出失败</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>导出交易历å²åˆ° %1 æ—¶å‘生错误。</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>已确认</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>类别</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>标签</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>地å€</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>ID</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>范围:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>到</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2757,55 +1637,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>没有载入钱包。</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>å‘é€æ¯”特å¸</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation>导出(&amp;E)</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation>导出当å‰æ•°æ®åˆ°æ–‡ä»¶</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation>备份钱包</translation>
- </message>
- <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>
<source>Options:</source>
@@ -2831,10 +1662,34 @@
</translation>
</message>
<message>
+ <source>If &lt;category&gt; is not supplied or if &lt;category&gt; = 1, output all debugging information.</source>
+ <translation>如果&lt;category&gt;未æ供或&lt;category&gt; = 1,输出所有调试信æ¯ã€‚</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation>修剪值被设置为低于最å°å€¼%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation>修剪:最åŽçš„钱包åŒæ­¥è¶…过了修剪的数æ®ã€‚你需è¦é€šè¿‡ -reindex (é‡æ–°ä¸‹è½½æ•´ä¸ªåŒºå—链以防修剪节点)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. 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 å’Œ -rescanä¸å…¼å®¹ã€‚警告:还原此设置需è¦é‡æ–°ä¸‹è½½æ•´ä¸ªåŒºå—链。(默认: 0 = ç¦ç”¨ä¿®å‰ªæ•°æ®å—, &gt;%u = æ•°æ®å—文件目标大å°ï¼Œå•ä½ MiB)</translation>
+ </message>
+ <message>
+ <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source>
+ <translation>无法在开å¯ä¿®å‰ªçš„状æ€ä¸‹é‡æ‰«æ,请使用 -reindexé‡æ–°ä¸‹è½½å®Œæ•´çš„区å—链。</translation>
+ </message>
+ <message>
<source>Error: A fatal internal error occurred, see debug.log for details</source>
<translation>错误:å‘ç”Ÿäº†è‡´å‘½çš„å†…éƒ¨é”™è¯¯ï¼Œè¯¦æƒ…è§ debug.log 文件</translation>
</message>
<message>
+ <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source>
+ <translation>为付款交易添加交易费 (%s/kB) (默认: %s) </translation>
+ </message>
+ <message>
<source>Pruning blockstore...</source>
<translation>正在修剪区å—存储...</translation>
</message>
@@ -2845,10 +1700,30 @@
</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation>无法å¯åŠ¨HTTPæœåŠ¡ï¼ŒæŸ¥çœ‹æ—¥å¿—获å–更多信æ¯</translation>
+ </message>
+ <message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>接å—æ¥è‡ªå¤–部的连接 (缺çœ: 如果ä¸å¸¦ -proxy or -connect å‚数设置为1)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>比特å¸æ ¸å¿ƒ</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>-fallbackfree 交易费设置得很高ï¼è¿™æ˜¯åœ¨è´¹ç”¨ä¼°è®¡ä¸å¯ç”¨æ—¶ä½ å¯èƒ½ä¼šæ”¯ä»˜çš„交易费。</translation>
+ </message>
+ <message>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>当费用估计数æ®(default: %s)ä¸è¶³æ—¶å°†ä¼šå¯ç”¨çš„费率 (in %s/kB) </translation>
+ </message>
+ <message>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>å³ä½¿åœ¨æ— å…³è”交易(默认: %d)时也接å—æ¥è‡ªç™½åå•åŒè¡Œçš„å…³è”交易</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>
@@ -2865,24 +1740,24 @@
<translation>当最佳区å—å˜åŒ–时执行命令 (命令行中的 %s 会被替æ¢æˆåŒºå—哈希值)</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>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>强制关è”æ¥è‡ªç™½åå•åŒè¡Œçš„交易å³ä½¿ä»–们è¿å本地关è”政策(默认: %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>
+ <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>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>无法 %s的绑定到电脑上,比特å¸æ ¸å¿ƒé’±åŒ…å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation>区å—æ•°æ®åº“包å«æœªæ¥çš„交易,这å¯èƒ½æ˜¯ç”±æœ¬æœºé”™è¯¯çš„日期时间引起。若确认本机日期时间正确,请é‡æ–°å»ºç«‹åŒºå—æ•°æ®åº“。</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>警告:数æ®å—生æˆæ•°é‡å¼‚常,最近 %d å°æ—¶æ”¶åˆ°äº† %d 个数æ®å—(预期为 %d 个)</translation>
+ <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>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>警告:请检查您的网络连接,最近 %d å°æ—¶æ”¶åˆ°äº† %d 个数æ®å—(预期为 %d 个)</translation>
+ <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
+ <translation>使用UPnP暴露本机监å¬ç«¯å£ï¼ˆé»˜è®¤ï¼š1 当正在监å¬ä¸”ä¸ä½¿ç”¨ä»£ç†ï¼‰</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
@@ -2893,18 +1768,22 @@
<translation>警告:我们的åŒè¡Œä¼¼ä¹Žä¸å®Œå…¨åŒæ„ï¼æ‚¨å¯èƒ½éœ€è¦å‡çº§ï¼Œæˆ–者其他节点å¯èƒ½éœ€è¦å‡çº§ã€‚</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>警告:钱包文件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>-maxmempool must be at least %d MB</source>
+ <translation>-maxmempool 最å°ä¸º%d MB</translation>
+ </message>
+ <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;category&gt; å¯èƒ½æ˜¯ï¼š</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>为用户代ç†å­—符串附加说明</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>æ•°æ®å—创建选项:</translation>
</message>
@@ -2933,6 +1812,26 @@
<translation>你想现在就é‡å»ºå—æ•°æ®åº“å—?</translation>
</message>
<message>
+ <source>Enable publish hash block in &lt;address&gt;</source>
+ <translation>å…许在&lt;address&gt;广播哈希区å—</translation>
+ </message>
+ <message>
+ <source>Enable publish hash transaction in &lt;address&gt;</source>
+ <translation>å…许在&lt;address&gt;广播哈希交易</translation>
+ </message>
+ <message>
+ <source>Enable publish raw block in &lt;address&gt;</source>
+ <translation>å…许在&lt;address&gt;广播原始区å—</translation>
+ </message>
+ <message>
+ <source>Enable publish raw transaction in &lt;address&gt;</source>
+ <translation>å…许在&lt;address&gt;广播原始交易</translation>
+ </message>
+ <message>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>ä¿è¯å†…存池中的交易更æ¢(默认:%u)</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>åˆå§‹åŒ–æ•°æ®å—æ•°æ®åº“出错</translation>
</message>
@@ -2969,6 +1868,22 @@
<translation>无效的 -onion 地å€ï¼šâ€œ%sâ€</translation>
</message>
<message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>-fallbackfee 的无效数é¢=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
+ <translation>ä¿æŒäº¤æ˜“内存池大å°ä½ŽäºŽ&lt;n&gt;MB(默认:%u)</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>认è¯Cookieçš„ä½ç½® (默认: data目录)</translation>
+ </message>
+ <message>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>我们关è”和挖掘的æ¯sigop的最低交易字节(默认: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>没有足够的文件æ述符å¯ç”¨ã€‚</translation>
</message>
@@ -2977,6 +1892,10 @@
<translation>åªè¿žæŽ¥ &lt;net&gt;网络中的节点 (ipv4, ipv6 或 onion) </translation>
</message>
<message>
+ <source>Print version and exit</source>
+ <translation>打å°ç‰ˆæœ¬ä¿¡æ¯å¹¶é€€å‡º</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>修剪ä¸èƒ½é…置一个负数。</translation>
</message>
@@ -2997,10 +1916,26 @@
<translation>指定钱包文件(数æ®ç›®å½•å†…)</translation>
</message>
<message>
+ <source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>忽略ä¸æ”¯æŒçš„选项 -benchmark,使用 -debug=bench</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>忽略ä¸æ”¯æŒçš„选项 -debugnet,使用 -debug=net。</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -tor found, use -onion.</source>
+ <translation>忽略ä¸æ”¯æŒçš„选项 -tor,使用 -oinon</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: %u)</source>
<translation>使用UPnp映射监å¬ç«¯å£ (默认: %u) </translation>
</message>
<message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation>用户代ç†è¯„论(%s)包å«ä¸å®‰å…¨çš„字符。</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>正在验è¯æ•°æ®åº“的完整性...</translation>
</message>
@@ -3017,14 +1952,6 @@
<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>
- <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>
@@ -3037,10 +1964,6 @@
<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>
@@ -3057,6 +1980,10 @@
<translation>当收到相关æ醒或者我们看到一个长分å‰æ—¶æ‰§è¡Œå‘½ä»¤ï¼ˆ%s 将替æ¢ä¸ºæ¶ˆæ¯ï¼‰</translation>
</message>
<message>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source>
+ <translation>交易费(in %s/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>
@@ -3081,10 +2008,6 @@
<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>
@@ -3109,26 +2032,14 @@
<translation>接å—公共 REST 请求 (默认: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>正在激活最佳数æ®é“¾...</translation>
- </message>
- <message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>æ— æ³•è§£æž -whitebind 地å€: '%s'</translation>
+ <source>Automatically create Tor hidden service (default: %d)</source>
+ <translation>自动建立Toréšè—æœåŠ¡ (默认:%d)</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 Bitcoin Core å¼€å‘者</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <translation>加载wallet.dat错误:需è¦æ–°ç‰ˆçš„比特å¸æ ¸å¿ƒé’±åŒ…</translation>
- </message>
- <message>
<source>Error reading from database, shutting down.</source>
<translation>读å–æ•°æ®åº“出错,关闭中。</translation>
</message>
@@ -3137,22 +2048,6 @@
<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>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>-mintxfee=&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>
@@ -3161,6 +2056,10 @@
<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>
@@ -3173,12 +2072,8 @@
<translation>RPC æœåŠ¡å™¨é€‰é¡¹ï¼š</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>å¯åŠ¨æ—¶é‡æ–°ä¸ºå½“å‰çš„ blk000??.dat 文件建立索引</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>收到并且显示P2P网络的告警(默认:%u)</translation>
+ <source>Rescan the block chain for missing wallet transactions on startup</source>
+ <translation>é‡æ–°æ‰«æ区å—链以查找é—æ¼çš„钱包交易</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
@@ -3229,18 +2124,22 @@
<translation>无法在此计算机上绑定 %s (绑定返回错误 %s)</translation>
</message>
<message>
- <source>Username for JSON-RPC connections</source>
- <translation>JSON-RPC 连接用户å</translation>
+ <source>Upgrade wallet to latest format on startup</source>
+ <translation>程åºå¯åŠ¨æ—¶å‡çº§é’±åŒ…到最新格å¼</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>钱包需è¦è¢«æ”¹å†™ï¼šé‡æ–°å¯åŠ¨æ ¸å¿ƒé’±åŒ…æ¥å®Œæˆ</translation>
+ <source>Username for JSON-RPC connections</source>
+ <translation>JSON-RPC 连接用户å</translation>
</message>
<message>
<source>Warning</source>
<translation>警告</translation>
</message>
<message>
+ <source>Whether to operate in a blocks only mode (default: %u)</source>
+ <translation>是å¦ç”¨å—方进行 (%u)</translation>
+ </message>
+ <message>
<source>Zapping all transactions from wallet...</source>
<translation>Zapping all transactions from wallet...</translation>
</message>
@@ -3249,10 +2148,6 @@
<translation>ZeroMQ 通知选项:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>钱包文件wallet.datæŸå,抢救备份失败</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>JSON-RPC 连接密ç 
</translation>
@@ -3262,11 +2157,6 @@
<translation>当最佳数æ®å—å˜åŒ–时执行命令 (命令行中的 %s 会被替æ¢æˆæ•°æ®å—哈希值)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>本帮助信æ¯
-</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>使用 -addnode, -seednode å’Œ -connect 选项时å…许查询DNS</translation>
</message>
@@ -3275,10 +2165,6 @@
<translation>正在加载地å€ç°¿...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
@@ -3299,20 +2185,28 @@
<translation>è¾“å‡ºè°ƒè¯•ä¿¡æ¯ (默认: %u, æä¾› &lt;category&gt; 是å¯é€‰é¡¹)</translation>
</message>
<message>
+ <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source>
+ <translation>å°è¯•ä¿æŒä¸Šä¼ å¸¦å®½ä½ŽäºŽï¼ˆMiB/24h),0=æ— é™åˆ¶ï¼ˆé»˜è®¤ï¼š%d)</translation>
+ </message>
+ <message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>一个ä¸è¢«æ”¯æŒçš„å‚æ•° -whitelistalwaysrelay 被忽略了。请使用 -whitelistrelay 或者 -whitelistforcerelay.</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>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>警告: 未知的区å—版本被挖掘ï¼æœªçŸ¥è§„则å¯èƒ½å·²ç”Ÿæ•ˆ</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>wallet.dat 钱包文件加载出错</translation>
+ <source>(default: %s)</source>
+ <translation>(默认: %s) </translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>生æˆæ¯”ç‰¹å¸ (默认: %u)</translation>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>始终通过 DNS æŸ¥è¯¢èŠ‚ç‚¹åœ°å€ (默认: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3399,18 +2293,6 @@
<translation>-onlynet 指定的是未知网络:%s</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>æ— æ³•è§£æž -bind 端å£åœ°å€: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>æ— æ³•è§£æž -externalip 地å€: '%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_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts
new file mode 100644
index 0000000000..aa014db0bd
--- /dev/null
+++ b/src/qt/locale/bitcoin_zh_HK.ts
@@ -0,0 +1,268 @@
+<TS language="zh_HK" version="2.1">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <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>新增 &amp;N</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>複製目å‰é¸æ“‡çš„ä½å€åˆ°ç³»çµ±å‰ªè²¼ç°¿</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>複製 &amp;C</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>關閉 &amp;l</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>把目å‰é¸æ“‡çš„ä½å€å¾žåˆ—表中刪除</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>把目å‰åˆ†é çš„資料匯出至檔案</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>匯出 &amp;E</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>刪除 &amp;D</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation>複雜密碼å°è©±æ–¹å¡Š</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation>請輸入密碼</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation>新密碼</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>é‡è¤‡æ–°å¯†ç¢¼</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation>IPä½å€/é®ç½©</translation>
+ </message>
+ <message>
+ <source>Banned Until</source>
+ <translation>å°éŽ–至</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>Sign &amp;message...</source>
+ <translation>簽署訊æ¯... &amp;m</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network...</source>
+ <translation>與網絡åŒæ­¥ä¸­...</translation>
+ </message>
+ <message>
+ <source>&amp;Overview</source>
+ <translation>總覽 &amp;O</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;T</translation>
+ </message>
+ <message>
+ <source>Browse transaction history</source>
+ <translation>ç€è¦½äº¤æ˜“紀錄</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation>çµæŸ &amp;x</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation>çµæŸæ‡‰ç”¨ç¨‹å¼</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>關於 Qt &amp;Q</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation>顯示 Qt 相關資訊</translation>
+ </message>
+ <message>
+ <source>&amp;Options...</source>
+ <translation>é¸é …... &amp;O</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet...</source>
+ <translation>加密錢包... &amp;E</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet...</source>
+ <translation>備份錢包... &amp;B</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase...</source>
+ <translation>改變密碼... &amp;C</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses...</source>
+ <translation>付款ä½å€... &amp;S</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>收款ä½å€... &amp;R</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI...</source>
+ <translation>開啓網å€... &amp;U</translation>
+ </message>
+ <message>
+ <source>Reindexing blocks on disk...</source>
+ <translation>正在為ç£ç¢Ÿå€å¡Šé‡å»ºç´¢å¼•...</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation>付款至一個 Bitcoin ä½å€</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;D</translation>
+ </message>
+ <message>
+ <source>Open debugging and diagnostic console</source>
+ <translation>開啓除錯和診斷主控å°</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message...</source>
+ <translation>驗證訊æ¯... &amp;V</translation>
+ </message>
+ <message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>錢包</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>付款 &amp;S</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation>收款 &amp;R</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <translation>顯示 / éš±è— &amp;S</translation>
+ </message>
+ <message>
+ <source>Show or hide the main Window</source>
+ <translation>顯示或隱è—主視窗</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ </context>
+<context>
+ <name>Intro</name>
+ </context>
+<context>
+ <name>OpenURIDialog</name>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ </context>
+<context>
+ <name>QObject</name>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ </context>
+<context>
+ <name>SendCoinsEntry</name>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ </context>
+<context>
+ <name>SplashScreen</name>
+ </context>
+<context>
+ <name>TrafficGraphWidget</name>
+ </context>
+<context>
+ <name>TransactionDescDialog</name>
+ </context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_zh_TW.ts b/src/qt/locale/bitcoin_zh_TW.ts
index 67fb692ea1..ab56f96795 100644
--- a/src/qt/locale/bitcoin_zh_TW.ts
+++ b/src/qt/locale/bitcoin_zh_TW.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation>新增新的ä½å€</translation>
+ <translation>產生一個新ä½å€</translation>
</message>
<message>
<source>&amp;New</source>
@@ -26,10 +26,6 @@
<translation>關閉</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation>複製ä½å€</translation>
- </message>
- <message>
<source>Delete the currently selected address from the list</source>
<translation>把目å‰é¸æ“‡çš„ä½å€å¾žåˆ—表中刪掉</translation>
</message>
@@ -45,73 +41,6 @@
<source>&amp;Delete</source>
<translation>刪掉</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>
- <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>
- <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>
- <message>
- <source>Exporting Failed</source>
- <translation>匯出失敗</translation>
- </message>
- <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>
- </message>
- <message>
- <source>Address</source>
- <translation>ä½å€</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(無標記)</translation>
- </message>
</context>
<context>
<name>AskPassphraseDialog</name>
@@ -131,94 +60,6 @@
<source>Repeat new passphrase</source>
<translation>é‡è¤‡æ–°å¯†ç¢¼</translation>
</message>
- <message>
- <source>Encrypt wallet</source>
- <translation>加密錢包</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>這個動作需è¦ä½ çš„錢包密碼來解鎖錢包。</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation>解鎖錢包</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>這個動作需è¦ä½ çš„錢包密碼來把錢包解密。</translation>
- </message>
- <message>
- <source>Decrypt wallet</source>
- <translation>解密錢包</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation>改變密碼</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <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>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <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>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation>警告: 大寫字æ¯éŽ–定作用中ï¼</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation>錢包已加密</translation>
- </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>輸入錢包的新密碼。&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>
- <translation>錢包加密失敗</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>因為內部錯誤導致錢包加密失敗。你的錢包還是沒加密。</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation>æ供的密碼ä¸ä¸€æ¨£ã€‚</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation>錢包解鎖失敗</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>輸入è¦ç”¨ä¾†è§£å¯†éŒ¢åŒ…的密碼ä¸å°ã€‚</translation>
- </message>
- <message>
- <source>Wallet decryption failed</source>
- <translation>錢包解密失敗</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation>錢包密碼改æˆåŠŸäº†ã€‚</translation>
- </message>
</context>
<context>
<name>BanTableModel</name>
@@ -270,6 +111,14 @@
<translation>çµæŸæ‡‰ç”¨ç¨‹å¼</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation>關於%1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation>顯示 %1 的相關資訊</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation>關於 &amp;Qt</translation>
</message>
@@ -282,6 +131,10 @@
<translation>é¸é …...</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation>修改 %1 的設定é¸é …</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet...</source>
<translation>加密錢包...</translation>
</message>
@@ -306,20 +159,12 @@
<translation>é–‹å•“ URI...</translation>
</message>
<message>
- <source>Bitcoin Core client</source>
- <translation>ä½å…ƒå¹£æ ¸å¿ƒå®¢æˆ¶ç«¯è»Ÿé«”</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>
+ <translation>付錢給一個 Bitcoin ä½å€</translation>
</message>
<message>
<source>Backup wallet to another location</source>
@@ -343,7 +188,7 @@
</message>
<message>
<source>Bitcoin</source>
- <translation>ä½å…ƒå¹£</translation>
+ <translation>Bitcoin</translation>
</message>
<message>
<source>Wallet</source>
@@ -358,10 +203,6 @@
<translation>收款</translation>
</message>
<message>
- <source>Show information about Bitcoin Core</source>
- <translation>顯示ä½å…ƒå¹£æ ¸å¿ƒçš„相關資訊</translation>
- </message>
- <message>
<source>&amp;Show / Hide</source>
<translation>顯示或隱è—</translation>
</message>
@@ -375,11 +216,11 @@
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation>用ä½å…ƒå¹£ä½å€ç°½ç½²è¨Šæ¯ä¾†è­‰æ˜Žä½å€æ˜¯ä½ çš„</translation>
+ <translation>用 Bitcoin ä½å€ç°½ç½²è¨Šæ¯ä¾†è­‰æ˜Žä½å€æ˜¯ä½ çš„</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation>驗證訊æ¯æ˜¯ç”¨ä¾†ç¢ºå®šè¨Šæ¯æ˜¯ç”¨æŒ‡å®šçš„ä½å…ƒå¹£ä½å€ç°½ç½²çš„</translation>
+ <translation>驗證訊æ¯æ˜¯ç”¨ä¾†ç¢ºå®šè¨Šæ¯æ˜¯ç”¨æŒ‡å®šçš„ Bitcoin ä½å€ç°½ç½²çš„</translation>
</message>
<message>
<source>&amp;File</source>
@@ -398,20 +239,8 @@
<translation>分é å·¥å…·åˆ—</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>ä½å…ƒå¹£æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation>è¦æ±‚付款(產生 QR Code å’Œä½å…ƒå¹£ä»˜æ¬¾å”議的資æºè­˜åˆ¥ç¢¼: URI)</translation>
- </message>
- <message>
- <source>&amp;About Bitcoin Core</source>
- <translation>關於ä½å…ƒå¹£æ ¸å¿ƒ</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin Core</source>
- <translation>修改ä½å…ƒå¹£æ ¸å¿ƒçš„設定é¸é …</translation>
+ <translation>è¦æ±‚付款(產生 QR Code å’Œ bitcoin 付款å”議的資æºè­˜åˆ¥ç¢¼: URI)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -429,13 +258,17 @@
<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>顯示ä½å…ƒå¹£æ ¸å¿ƒçš„說明訊æ¯ï¼Œä¾†å–å¾—å¯ç”¨å‘½ä»¤åˆ—é¸é …的列表</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n 個é‹ä½œä¸­çš„ä½å…ƒå¹£ç¶²è·¯é€£ç·š</numerusform></translation>
+ <translation><numerusform>%n 個é‹ä½œä¸­çš„ Bitcoin 網路連線</numerusform></translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk...</source>
+ <translation>正在為ç£ç¢Ÿè£¡çš„å€å¡Šå»ºç«‹ç´¢å¼•...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk...</source>
+ <translation>正在處ç†ç£ç¢Ÿè£¡çš„å€å¡Šè³‡æ–™...</translation>
</message>
<message>
<source>No block source available...</source>
@@ -494,6 +327,14 @@
<translation>最新狀態</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation>顯示 %1 的說明訊æ¯ï¼Œä¾†å–å¾—å¯ç”¨å‘½ä»¤åˆ—é¸é …的列表</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation>%1 客戶端軟體</translation>
+ </message>
+ <message>
<source>Catching up...</source>
<translation>正在趕進度...</translation>
</message>
@@ -545,13 +386,6 @@
</message>
</context>
<context>
- <name>ClientModel</name>
- <message>
- <source>Network Alert</source>
- <translation>網路警報</translation>
- </message>
-</context>
-<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -629,150 +463,6 @@
<source>Priority</source>
<translation>優先度</translation>
</message>
- <message>
- <source>Copy address</source>
- <translation>複製ä½å€</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>複製標記</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>複製金é¡</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>複製交易識別碼</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>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>
- <message>
- <source>no</source>
- <translation>å¦</translation>
- </message>
- <message>
- <source>This means a fee of at least %1 per kB is required.</source>
- <translation>表示æ¯ä¸€åƒä½å…ƒçµ„(kB)需è¦è‡³å°‘ %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>
- <message>
- <source>change from %1 (%2)</source>
- <translation>找零å‰æ˜¯ %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation>(找零)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -796,38 +486,6 @@
<source>&amp;Address</source>
<translation>ä½å€</translation>
</message>
- <message>
- <source>New receiving address</source>
- <translation>造新的收款ä½å€</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation>造新的付款ä½å€</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation>編輯收款ä½å€</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation>編輯付款ä½å€</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book.</source>
- <translation>輸入的ä½å€ %1 在ä½å€ç°¿ä¸­å·²ç¶“有了。</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>輸入的ä½å€ %1 並ä¸æ˜¯æœ‰æ•ˆçš„ä½å…ƒå¹£ä½å€ã€‚</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation>沒辦法把錢包解鎖。</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation>產生新的密鑰失敗了。</translation>
- </message>
</context>
<context>
<name>FreespaceChecker</name>
@@ -855,10 +513,6 @@
<context>
<name>HelpMessageDialog</name>
<message>
- <source>Bitcoin Core</source>
- <translation>ä½å…ƒå¹£æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>version</source>
<translation>版本</translation>
</message>
@@ -867,8 +521,8 @@
<translation>(%1 ä½å…ƒ)</translation>
</message>
<message>
- <source>About Bitcoin Core</source>
- <translation>關於ä½å…ƒå¹£æ ¸å¿ƒ</translation>
+ <source>About %1</source>
+ <translation>關於 %1</translation>
</message>
<message>
<source>Command-line options</source>
@@ -882,6 +536,34 @@
<source>command-line options</source>
<translation>命令列é¸é …</translation>
</message>
+ <message>
+ <source>UI Options:</source>
+ <translation>使用介é¢é¸é …:</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: %u)</source>
+ <translation>啓動時é¸æ“‡è³‡æ–™ç›®éŒ„(é è¨­å€¼: %u)</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: %u)</source>
+ <translation>顯示啓動畫é¢(é è¨­å€¼: %u)</translation>
+ </message>
+ <message>
+ <source>Reset all settings changed in the GUI</source>
+ <translation>é‡ç½®æ‰€æœ‰åœ¨ä½¿ç”¨ç•Œé¢æ›´æ”¹çš„設定</translation>
+ </message>
</context>
<context>
<name>Intro</name>
@@ -890,16 +572,16 @@
<translation>æ­¡è¿Ž</translation>
</message>
<message>
- <source>Welcome to Bitcoin Core.</source>
- <translation>歡迎使用ä½å…ƒå¹£æ ¸å¿ƒ</translation>
+ <source>Welcome to %1.</source>
+ <translation>歡迎使用 %1。</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>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation>因為這是程å¼ç¬¬ä¸€æ¬¡å•“動,你å¯ä»¥é¸æ“‡ %1 儲存資料的地方。</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>ä½å…ƒå¹£æ ¸å¿ƒæœƒä¸‹è¼‰ä¸¦å„²å­˜ä¸€ä»½ä½å…ƒå¹£å€å¡Šéˆçš„æ‹·è²ã€‚至少有 %1GB 的資料會儲存到這個目錄中,並且還會æŒçºŒå¢žé•·ã€‚å¦å¤–錢包資料也會儲存在這個目錄。</translation>
+ <source>%1 will download and store a copy of the Bitcoin block chain. At least %2GB 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>%1 會下載並儲存一份 Bitcoin å€å¡Šéˆçš„æ‹·è²ã€‚至少有 %2GB 的資料會儲存到這個目錄中,並且還會æŒçºŒå¢žé•·ã€‚å¦å¤–錢包資料也會儲存在這個目錄。</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -910,10 +592,6 @@
<translation>使用自訂的資料目錄:</translation>
</message>
<message>
- <source>Bitcoin Core</source>
- <translation>ä½å…ƒå¹£æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation>錯誤: 無法新增指定的資料目錄: %1</translation>
</message>
@@ -948,10 +626,6 @@
<source>Select payment request file</source>
<translation>é¸æ“‡ä»˜æ¬¾è¦æ±‚資料檔</translation>
</message>
- <message>
- <source>Select payment request file to open</source>
- <translation>é¸æ“‡è¦é–‹å•Ÿçš„付款è¦æ±‚資料檔</translation>
- </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -964,6 +638,14 @@
<translation>主è¦</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation>在登入系統後自動啓動 %1。</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation>系統登入時啟動 %1</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation>資料庫快å–大å°</translation>
</message>
@@ -992,10 +674,6 @@
<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>在交易é ç±¤çš„情境é¸å–®å‡ºç¾çš„第三方網å€é€£çµ(URL),比如說å€å¡ŠæŽ¢ç´¢ç¶²ç«™ã€‚網å€ä¸­çš„ %s 會被å–代為交易的雜湊值。å¯ä»¥ç”¨ç›´ç·šç¬¦è™Ÿ | 來分隔多個連çµã€‚</translation>
</message>
@@ -1020,14 +698,6 @@
<translation>網路</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>系統登入時啟動ä½å…ƒå¹£æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 表示程å¼è‡ªå‹•æ±ºå®šï¼Œå°æ–¼ 0 表示ä¿ç•™è™•ç†å™¨æ ¸å¿ƒä¸ç”¨çš„數目)</translation>
</message>
@@ -1053,7 +723,7 @@
</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>自動在路由器上開放ä½å…ƒå¹£çš„客戶端通訊埠。åªæœ‰åœ¨ä½ çš„路由器支æ´ä¸”開啓「通用å³æ’å³ç”¨ã€å”定(UPnP)時æ‰æœ‰ä½œç”¨ã€‚</translation>
+ <translation>自動在路由器上開放 Bitcoin 的客戶端通訊埠。åªæœ‰åœ¨ä½ çš„路由器支æ´ä¸”開啓「通用å³æ’å³ç”¨ã€å”定(UPnP)時æ‰æœ‰ä½œç”¨ã€‚</translation>
</message>
<message>
<source>Map port using &amp;UPnP</source>
@@ -1061,7 +731,7 @@
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
- <translation>é€éŽ SOCKS5 代ç†ä¼ºæœå™¨ä¾†é€£ç·šåˆ°ä½å…ƒå¹£ç¶²è·¯ã€‚</translation>
+ <translation>é€éŽ SOCKS5 代ç†ä¼ºæœå™¨ä¾†é€£ç·šåˆ° Bitcoin 網路。</translation>
</message>
<message>
<source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
@@ -1101,7 +771,7 @@
</message>
<message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source>
- <translation>é€éŽå¦å¤–çš„ SOCKS5 代ç†ä¼ºæœå™¨ä¾†é€£ç·šåˆ°ä½å…ƒå¹£ç¶²è·¯ä¸­çš„ Tor éš±è—æœå‹™ã€‚</translation>
+ <translation>é€éŽå¦å¤–çš„ SOCKS5 代ç†ä¼ºæœå™¨ä¾†é€£ç·šåˆ° Bitcoin 網路中的 Tor éš±è—æœå‹™ã€‚</translation>
</message>
<message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source>
@@ -1112,12 +782,20 @@
<translation>視窗</translation>
</message>
<message>
+ <source>&amp;Hide the icon from the system tray.</source>
+ <translation>ä¸åœ¨é€šçŸ¥å€é¡¯ç¤ºåœ–示。</translation>
+ </message>
+ <message>
+ <source>Hide tray icon</source>
+ <translation>ä¸é¡¯ç¤ºé€šçŸ¥å€åœ–示</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
- <translation>視窗縮到最å°å¾Œåªåœ¨é€šçŸ¥å€åŸŸé¡¯ç¤ºåœ–示。</translation>
+ <translation>視窗縮到最å°å¾Œåªåœ¨é€šçŸ¥å€é¡¯ç¤ºåœ–示。</translation>
</message>
<message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation>縮到最å°åˆ°é€šçŸ¥å€åŸŸè€Œä¸æ˜¯å·¥ä½œåˆ—</translation>
+ <translation>縮到最å°åˆ°é€šçŸ¥å€è€Œä¸æ˜¯å·¥ä½œåˆ—</translation>
</message>
<message>
<source>M&amp;inimize on close</source>
@@ -1132,6 +810,10 @@
<translation>使用界é¢èªžè¨€:</translation>
</message>
<message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation>å¯ä»¥åœ¨é€™è£¡è¨­å®šä½¿ç”¨è€…介é¢çš„語言。這個設定在é‡å•“ %1 後æ‰æœƒç”Ÿæ•ˆã€‚</translation>
+ </message>
+ <message>
<source>&amp;Unit to show amounts in:</source>
<translation>金é¡é¡¯ç¤ºå–®ä½:</translation>
</message>
@@ -1188,7 +870,7 @@
</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>
+ <translation>顯示的資訊å¯èƒ½æ˜¯éŽæœŸçš„。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路åŒæ­¥ï¼Œä½†æ˜¯é€™å€‹æ­¥é©Ÿé‚„沒完æˆã€‚</translation>
</message>
<message>
<source>Watch-only:</source>
@@ -1256,97 +938,6 @@
</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>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>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>沒辦法啟動 bitcoin å”議的按就付處ç†å™¨</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)ï¼å¯èƒ½æ˜¯å› ç‚ºä½å…ƒå¹£ä½å€ç„¡æ•ˆï¼Œæˆ–是 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>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>
- <message>
- <source>Network request error</source>
- <translation>發出è¦æ±‚時發生網路錯誤</translation>
- </message>
-</context>
-<context>
<name>PeerTableModel</name>
<message>
<source>User Agent</source>
@@ -1369,7 +960,7 @@
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
- <translation>輸入ä½å…ƒå¹£ä½å€ (比如說 %1)</translation>
+ <translation>輸入 Bitcoin ä½å€ (比如說 %1)</translation>
</message>
<message>
<source>%1 d</source>
@@ -1401,31 +992,8 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image...</source>
- <translation>儲存圖片...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation>複製圖片</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation>儲存 QR Code</translation>
- </message>
- <message>
- <source>PNG Image (*.png)</source>
- <translation>PNG 圖檔(*.png)</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>Client name</source>
- <translation>客戶端軟體å稱</translation>
- </message>
- <message>
<source>N/A</source>
<translation>未知</translation>
</message>
@@ -1446,14 +1014,14 @@
<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>Datadir</source>
+ <translation>資料目錄</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>啓動時間</translation>
</message>
@@ -1478,8 +1046,16 @@
<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>
+ <source>Memory Pool</source>
+ <translation>記憶體暫存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation>ç›®å‰äº¤æ˜“數目</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation>記憶體使用é‡</translation>
</message>
<message>
<source>Received</source>
@@ -1530,6 +1106,18 @@
<translation>使用者代ç†</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>從目å‰çš„資料目錄下開啓 %1 的除錯紀錄檔。當紀錄檔很大時,å¯èƒ½æœƒèŠ±å¥½å¹¾ç§’的時間。</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation>縮å°æ–‡å­—</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation>放大文字</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>æœå‹™</translation>
</message>
@@ -1598,10 +1186,6 @@
<translation>去:</translation>
</message>
<message>
- <source>Build date</source>
- <translation>建置日期</translation>
- </message>
- <message>
<source>Debug log file</source>
<translation>除錯紀錄檔</translation>
</message>
@@ -1635,11 +1219,11 @@
</message>
<message>
<source>&amp;Unban Node</source>
- <translation>解ç¦è§£é»žé€£ç·š</translation>
+ <translation>解ç¦ç¯€é»žé€£ç·š</translation>
</message>
<message>
- <source>Welcome to the Bitcoin Core RPC console.</source>
- <translation>歡迎使用ä½å…ƒå¹£æ ¸å¿ƒ RPC 主控å°ã€‚</translation>
+ <source>Welcome to the %1 RPC console.</source>
+ <translation>歡迎使用 %1 çš„ 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>
@@ -1722,7 +1306,7 @@
</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>附加在付款è¦æ±‚中的訊æ¯ï¼Œå¯ä»¥ä¸å¡«ï¼Œæ‰“é–‹è¦æ±‚內容時會顯示。注æ„: 這個訊æ¯ä¸æœƒéš¨è‘—付款é€åˆ°ä½å…ƒå¹£ç¶²è·¯ä¸Šã€‚</translation>
+ <translation>附加在付款è¦æ±‚中的訊æ¯ï¼Œå¯ä»¥ä¸å¡«ï¼Œæ‰“é–‹è¦æ±‚內容時會顯示。注æ„: 這個訊æ¯ä¸æœƒéš¨è‘—付款é€åˆ° Bitcoin 網路上。</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
@@ -1768,18 +1352,6 @@
<source>Remove</source>
<translation>刪掉</translation>
</message>
- <message>
- <source>Copy label</source>
- <translation>複製標記</translation>
- </message>
- <message>
- <source>Copy message</source>
- <translation>複製訊æ¯</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>複製金é¡</translation>
- </message>
</context>
<context>
<name>ReceiveRequestDialog</name>
@@ -1799,73 +1371,6 @@
<source>&amp;Save Image...</source>
<translation>儲存圖片...</translation>
</message>
- <message>
- <source>Request payment to %1</source>
- <translation>付款給 %1 çš„è¦æ±‚</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation>付款資訊</translation>
- </message>
- <message>
- <source>URI</source>
- <translation>URI</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ä½å€</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>金é¡</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>標記</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>訊æ¯</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>產生的 URI éŽé•·ï¼Œè«‹è©¦è‘—縮短標記或訊æ¯çš„文字內容。</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation>把 URI ç·¨ç¢¼æˆ QR Code 時發生錯誤。</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>標記</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>訊æ¯</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>金é¡</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation>(無標記)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation>(無訊æ¯)</translation>
- </message>
- <message>
- <source>(no amount)</source>
- <translation>(無金é¡)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1986,14 +1491,6 @@
<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>
@@ -2025,114 +1522,6 @@
<source>S&amp;end</source>
<translation>付款</translation>
</message>
- <message>
- <source>Confirm send coins</source>
- <translation>確èªä»˜æ¬¾é‡‘é¡</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation>%1 給 %2</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>Copy change</source>
- <translation>複製找零金é¡</translation>
- </message>
- <message>
- <source>Total Amount %1</source>
- <translation>ç¸½é‡‘é¡ %1</translation>
- </message>
- <message>
- <source>or</source>
- <translation>或</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation>付款金é¡å¿…須大於零。</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <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>
- </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>
- <source>Pay only the required 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>
- <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>
- </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -2145,10 +1534,6 @@
<translation>付給:</translation>
</message>
<message>
- <source>Enter a label for this address to add it to your address book</source>
- <translation>請輸入這個ä½å€çš„標記來把它加進ä½å€ç°¿ä¸­</translation>
- </message>
- <message>
<source>&amp;Label:</source>
<translation>標記:</translation>
</message>
@@ -2162,7 +1547,7 @@
</message>
<message>
<source>The Bitcoin address to send the payment to</source>
- <translation>接收付款的ä½å…ƒå¹£ä½å€</translation>
+ <translation>接收付款的 Bitcoin ä½å€</translation>
</message>
<message>
<source>Alt+A</source>
@@ -2182,7 +1567,7 @@
</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>
+ <translation>手續費會從è¦ä»˜æ¬¾å‡ºåŽ»çš„金é¡ä¸­æ‰£æŽ‰ã€‚因此收款人會收到比輸入的金é¡é‚„è¦å°‘çš„ bitcoin。如果有多個收款人的話,手續費會平å‡åˆ†é…來扣除。</translation>
</message>
<message>
<source>S&amp;ubtract fee from amount</source>
@@ -2206,7 +1591,7 @@
</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>附加在ä½å…ƒå¹£ä»˜æ¬¾å”議的資æºè­˜åˆ¥ç¢¼(URI)中的訊æ¯ï¼Œæœƒå’Œäº¤æ˜“內容一起存起來,給你自己åšåƒè€ƒã€‚注æ„: 這個訊æ¯ä¸æœƒé€åˆ°ä½å…ƒå¹£ç¶²è·¯ä¸Šã€‚</translation>
+ <translation>附加在 Bitcoin 付款å”議的資æºè­˜åˆ¥ç¢¼(URI)中的訊æ¯ï¼Œæœƒå’Œäº¤æ˜“內容一起存起來,給你自己åšåƒè€ƒã€‚注æ„: 這個訊æ¯ä¸æœƒé€åˆ° Bitcoin 網路上。</translation>
</message>
<message>
<source>Pay To:</source>
@@ -2220,8 +1605,8 @@
<context>
<name>ShutdownWindow</name>
<message>
- <source>Bitcoin Core is shutting down...</source>
- <translation>正在關閉ä½å…ƒå¹£æ ¸å¿ƒä¸­...</translation>
+ <source>%1 is shutting down...</source>
+ <translation>正在關閉 %1 中...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -2244,7 +1629,7 @@
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
- <translation>用來簽署訊æ¯çš„ä½å…ƒå¹£ä½å€</translation>
+ <translation>用來簽署訊æ¯çš„ Bitcoin ä½å€</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -2276,7 +1661,7 @@
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
- <translation>簽署這個訊æ¯ä¾†è­‰æ˜Žé€™å€‹ä½å…ƒå¹£ä½å€æ˜¯ä½ çš„</translation>
+ <translation>簽署這個訊æ¯ä¾†è­‰æ˜Žé€™å€‹ Bitcoin ä½å€æ˜¯ä½ çš„</translation>
</message>
<message>
<source>Sign &amp;Message</source>
@@ -2300,11 +1685,11 @@
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
- <translation>簽署這個訊æ¯çš„ä½å…ƒå¹£ä½å€</translation>
+ <translation>簽署這個訊æ¯çš„ Bitcoin ä½å€</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation>驗證這個訊æ¯ä¾†ç¢ºå®šæ˜¯ç”¨æŒ‡å®šçš„ä½å…ƒå¹£ä½å€ç°½ç½²çš„</translation>
+ <translation>驗證這個訊æ¯ä¾†ç¢ºå®šæ˜¯ç”¨æŒ‡å®šçš„ Bitcoin ä½å€ç°½ç½²çš„</translation>
</message>
<message>
<source>Verify &amp;Message</source>
@@ -2314,70 +1699,10 @@
<source>Reset all verify message fields</source>
<translation>é‡è¨­æ‰€æœ‰è¨Šæ¯é©—證欄ä½</translation>
</message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation>請按一下「簽署訊æ¯ã€ä¾†ç”¢ç”Ÿç°½ç« </translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation>輸入的ä½å€ç„¡æ•ˆã€‚</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <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>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation>訊æ¯ç°½ç½²å¤±æ•—。</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation>訊æ¯ç°½ç½²å¥½äº†ã€‚</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation>沒辦法把這個簽章解碼。</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation>請檢查簽章是å¦æ­£ç¢ºå¾Œå†è©¦ä¸€æ¬¡ã€‚</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation>這個簽章跟訊æ¯çš„數ä½æ‘˜è¦ä¸ç¬¦ã€‚</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation>訊æ¯é©—證失敗。</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation>訊æ¯é©—證沒錯。</translation>
- </message>
</context>
<context>
<name>SplashScreen</name>
<message>
- <source>Bitcoin Core</source>
- <translation>ä½å…ƒå¹£æ ¸å¿ƒ</translation>
- </message>
- <message>
- <source>The Bitcoin Core developers</source>
- <translation>ä½å…ƒå¹£æ ¸å¿ƒé–‹ç™¼äººå“¡</translation>
- </message>
- <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -2390,422 +1715,13 @@
</message>
</context>
<context>
- <name>TransactionDesc</name>
- <message>
- <source>Open until %1</source>
- <translation>到 %1 å‰å¯ä¿®æ”¹</translation>
- </message>
- <message>
- <source>conflicted</source>
- <translation>有è¡çª</translation>
- </message>
- <message>
- <source>%1/offline</source>
- <translation>%1 次/離線中</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <translation>%1 次/未確èª</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <translation>ç¢ºèª %1 次</translation>
- </message>
- <message>
- <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>
- </message>
- <message>
- <source>Source</source>
- <translation>來æº</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation>生產出來</translation>
- </message>
- <message>
- <source>From</source>
- <translation>來æº</translation>
- </message>
- <message>
- <source>To</source>
- <translation>目的</translation>
- </message>
- <message>
- <source>own address</source>
- <translation>自己的ä½å€</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>åªèƒ½çœ‹</translation>
- </message>
- <message>
- <source>label</source>
- <translation>標記</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation>入帳</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>å†ç­‰ %n 個å€å¡Šç”Ÿå‡ºä¾†å¾Œæˆç†Ÿ</numerusform></translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation>ä¸è¢«æŽ¥å—</translation>
- </message>
- <message>
- <source>Debit</source>
- <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>
- <message>
- <source>Net amount</source>
- <translation>æ·¨é¡</translation>
- </message>
- <message>
- <source>Message</source>
- <translation>訊æ¯</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation>附註</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation>交易識別碼</translation>
- </message>
- <message>
- <source>Merchant</source>
- <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>
- <message>
- <source>Transaction</source>
- <translation>交易</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation>輸入</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation>金é¡</translation>
- </message>
- <message>
- <source>true</source>
- <translation>是</translation>
- </message>
- <message>
- <source>false</source>
- <translation>å¦</translation>
- </message>
- <message>
- <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>
- </message>
-</context>
-<context>
<name>TransactionDescDialog</name>
<message>
- <source>Transaction details</source>
- <translation>交易明細</translation>
- </message>
- <message>
<source>This pane shows a detailed description of the transaction</source>
<translation>這個版é¢é¡¯ç¤ºé€™æ¬¡äº¤æ˜“的詳細說明</translation>
</message>
</context>
<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- <message>
- <source>Type</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>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation>已確èª(%1 次)</translation>
- </message>
- <message>
- <source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>沒有其他節點收到這個å€å¡Šï¼Œä¹Ÿè¨±å®ƒä¸æœƒè¢«æŽ¥å—ï¼</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation>生產出來但是ä¸è¢«æŽ¥å—</translation>
- </message>
- <message>
- <source>Offline</source>
- <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>確èªä¸­(已經 %1 次,建議至少 %2 次)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation>有è¡çª</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>收款在</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation>收款自</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>付款給</translation>
- </message>
- <message>
- <source>Payment to yourself</source>
- <translation>付給自己</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>開採所得</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation>åªèƒ½çœ‹</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation>(ä¸é©ç”¨)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>交易狀態。把游標åœåœ¨æ¬„ä½ä¸Šæœƒé¡¯ç¤ºç¢ºèªæ¬¡æ•¸ã€‚</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation>收到交易的日期和時間。</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation>交易的種類。</translation>
- </message>
- <message>
- <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>
- <translation>è¦æ¸›æŽ‰æˆ–加進餘é¡çš„金é¡ã€‚</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation>全部</translation>
- </message>
- <message>
- <source>Today</source>
- <translation>今天</translation>
- </message>
- <message>
- <source>This week</source>
- <translation>這星期</translation>
- </message>
- <message>
- <source>This month</source>
- <translation>這個月</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation>上個月</translation>
- </message>
- <message>
- <source>This year</source>
- <translation>今年</translation>
- </message>
- <message>
- <source>Range...</source>
- <translation>指定範åœ...</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation>收款</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation>付款</translation>
- </message>
- <message>
- <source>To yourself</source>
- <translation>給自己</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation>開採所得</translation>
- </message>
- <message>
- <source>Other</source>
- <translation>其它</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation>請輸入è¦æœå°‹çš„ä½å€æˆ–標記</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation>最å°é‡‘é¡</translation>
- </message>
- <message>
- <source>Copy address</source>
- <translation>複製ä½å€</translation>
- </message>
- <message>
- <source>Copy label</source>
- <translation>複製標記</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation>複製金é¡</translation>
- </message>
- <message>
- <source>Copy transaction ID</source>
- <translation>複製交易識別碼</translation>
- </message>
- <message>
- <source>Copy raw transaction</source>
- <translation>複製交易原始資料</translation>
- </message>
- <message>
- <source>Edit label</source>
- <translation>編輯標記</translation>
- </message>
- <message>
- <source>Show transaction details</source>
- <translation>顯示交易明細</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation>匯出交易記錄</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation>åªèƒ½è§€çœ‹çš„</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation>匯出失敗</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation>儲存交易記錄到 %1 時發生錯誤。</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <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>
- <message>
- <source>Confirmed</source>
- <translation>已確èª</translation>
- </message>
- <message>
- <source>Date</source>
- <translation>日期</translation>
- </message>
- <message>
- <source>Type</source>
- <translation>種類</translation>
- </message>
- <message>
- <source>Label</source>
- <translation>標記</translation>
- </message>
- <message>
- <source>Address</source>
- <translation>ä½å€</translation>
- </message>
- <message>
- <source>ID</source>
- <translation>識別碼</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation>範åœ:</translation>
- </message>
- <message>
- <source>to</source>
- <translation>到</translation>
- </message>
-</context>
-<context>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
@@ -2813,55 +1729,6 @@
</message>
</context>
<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.</source>
- <translation>沒有載入錢包。</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation>付款</translation>
- </message>
-</context>
-<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>
- <message>
- <source>Backup Wallet</source>
- <translation>備份錢包</translation>
- </message>
- <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>
<source>Options:</source>
@@ -2889,14 +1756,6 @@
<translation>如果沒有æä¾› &lt;category&gt; 或是值為 1 就會輸出所有的除錯資訊。</translation>
</message>
<message>
- <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
- <translation>一次錢包交易å…許付出最高的總手續費(å–®ä½æ˜¯ %s);設定太低的話,å¯èƒ½æœƒç„¡æ³•é€²è¡Œè³‡æ–™é‡å¤§çš„交易(é è¨­å€¼: %s)</translation>
- </message>
- <message>
- <source>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>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<translation>設定的修剪值å°æ–¼æœ€å°éœ€æ±‚çš„ %d 百è¬ä½å…ƒçµ„(MiB)。請指定大一點的數字。</translation>
</message>
@@ -2926,7 +1785,7 @@
</message>
<message>
<source>Run in the background as a daemon and accept commands</source>
- <translation>用護éˆæ¨¡å¼åœ¨èƒŒå¾ŒåŸ·è¡Œä¸¦æŽ¥å—指令</translation>
+ <translation>用護éˆæ¨¡å¼åœ¨èƒŒæ™¯åŸ·è¡Œä¸¦æŽ¥å—指令</translation>
</message>
<message>
<source>Unable to start HTTP server. See debug log for details.</source>
@@ -2937,10 +1796,34 @@
<translation>是å¦æŽ¥å—外來連線(é è¨­å€¼: 當沒有 -proxy 或 -connect 時為 1)</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>The %s developers</source>
+ <translation>%s 開發人員</translation>
+ </message>
+ <message>
+ <source>-fallbackfee is set very high! This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation>警告: -fallbackfee 設定了很高的金é¡ï¼é€™æ˜¯ç•¶é ä¼°æ‰‹çºŒè²»é‚„沒計算出來時,交易付款é è¨­æœƒä»˜çš„手續費。</translation>
+ </message>
+ <message>
+ <source>A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)</source>
+ <translation>當沒有足夠的資料計算é ä¼°æ‰‹çºŒè²»æ™‚,所使用的手續費費率(å–®ä½æ˜¯ %s/kB, é è¨­å€¼: %s)</translation>
+ </message>
+ <message>
+ <source>Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)</source>
+ <translation>接å—從白å點節點收到的轉發交易,å³ä½¿æ²’有(符åˆæº–則)轉發出去(é è¨­å€¼: %d)</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>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation>沒辦法鎖定資料目錄 %s。%s å¯èƒ½å·²ç¶“在執行了。</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>
@@ -2949,10 +1832,38 @@
<translation>這套軟體是ä¾æ“š MIT 軟體授權æ¢æ¬¾æ•£å¸ƒï¼Œè©³æƒ…請見附帶的 COPYING 檔案,或是以下網站: &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
+ <source>Error loading %s: You can't enable HD on a already existing non-HD wallet</source>
+ <translation>載入 %s 發生錯誤:ä¸èƒ½å°å·²å­˜åœ¨çš„éž HD 錢包啟用 HD 功能。</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
+ <translation>讀å–錢包檔 %s 時發生錯誤ï¼æ‰€æœ‰çš„密鑰都正確讀å–了,但是交易資料或ä½å€ç°¿è³‡æ–™å¯èƒ½æœƒç¼ºå°‘或ä¸æ­£ç¢ºã€‚</translation>
+ </message>
+ <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>當錢包有交易改變時è¦åŸ·è¡Œçš„指令(指令中的 %s 會被å–代æˆäº¤æ˜“識別碼)</translation>
</message>
<message>
+ <source>Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)</source>
+ <translation>強制轉發從白å點節點收到的交易,å³ä½¿å®ƒå€‘é•å了本機的轉發準則(é è¨­å€¼: %d)</translation>
+ </message>
+ <message>
+ <source>Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds)</source>
+ <translation>跟其他節點的時間差最高å¯æŽ¥å—的中ä½æ•¸å€¼ã€‚本機所èªç‚ºçš„時間å¯èƒ½æœƒè¢«å…¶ä»–節點影響,往å‰æˆ–往後在這個值之內。(é è¨­å€¼: %u 秒)</translation>
+ </message>
+ <message>
+ <source>Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>å…許一次錢包交易或未加工交易付出的最高總手續費(å–®ä½æ˜¯ %s);設定太低的話,å¯èƒ½æœƒç„¡æ³•é€²è¡Œè³‡æ–™é‡å¤§çš„交易(é è¨­å€¼: %s)</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation>請檢查電腦日期和時間是å¦æ­£ç¢ºï¼%s 沒辦法在時é˜ä¸æº–的情æ³ä¸‹æ­£å¸¸é‹ä½œã€‚</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation>如果你覺得 %s 有用,å¯ä»¥å¹«åŠ©æˆ‘們。關於這個軟體的更多資訊請見 %s。</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 表示程å¼è‡ªå‹•æ±ºå®šï¼Œå°æ–¼ 0 表示ä¿ç•™è™•ç†å™¨æ ¸å¿ƒä¸ç”¨çš„數目,é è¨­å€¼: %d)</translation>
</message>
@@ -2965,38 +1876,34 @@
<translation>這是個還沒發表的測試版本 - 使用請自負風險 - è«‹ä¸è¦ç”¨ä¾†é–‹æŽ¡æˆ–商業應用</translation>
</message>
<message>
- <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。ä½å…ƒå¹£æ ¸å¿ƒå¯èƒ½å·²ç¶“在執行了。</translation>
+ <source>Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain</source>
+ <translation>沒辦法將資料庫倒轉回分岔å‰çš„狀態。必須è¦é‡æ–°ä¸‹è¼‰å€å¡ŠéŠã€‚</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source>
<translation>是å¦è¦ä½¿ç”¨ã€Œé€šç”¨å³æ’å³ç”¨ã€å”定(UPnP),來設定è½å€™é€£ç·šçš„通訊埠的å°æ‡‰(é è¨­å€¼: 當有è½å€™é€£ç·šä¸”沒有指定 -proxy åƒæ•¸æ™‚為 1)</translation>
</message>
<message>
- <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source>
- <translation>警告: 收到了ä¸å°‹å¸¸åœ°å¤šçš„ %d 個å€å¡Šåœ¨éŽåŽ» %d å°æ™‚內生產出來(é æœŸæ˜¯ %d 個)</translation>
- </message>
- <message>
- <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source>
- <translation>警告: 請檢查你的網路連線狀æ³ï¼Œæ”¶åˆ°äº† %d 個å€å¡Šæ˜¯åœ¨éŽåŽ» %d å°æ™‚內生產出來(é æœŸæ˜¯ %d 個)</translation>
- </message>
- <message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>警告: ä½å…ƒå¹£ç¶²è·¯å°æ–¼å€å¡Šéˆçµçš„決定目å‰æœ‰åˆ†æ­§ï¼çœ‹ä¾†æœ‰äº›ç¤¦å·¥æœƒæœ‰å•é¡Œã€‚</translation>
+ <translation>警告: 節點網路å°æ–¼å€å¡Šéˆçµçš„決定目å‰æœ‰åˆ†æ­§ï¼çœ‹ä¾†æœ‰äº›ç¤¦å·¥æœƒæœ‰å•é¡Œã€‚</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>警告: 我們和æŸäº›é€£ç·šçš„節點å°æ–¼å€å¡Šéˆçµçš„決定ä¸åŒï¼ä½ å¯èƒ½éœ€è¦å‡ç´šï¼Œæˆ–是需è¦ç­‰å…¶å®ƒçš„節點å‡ç´šã€‚</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>警告: 錢包檔 wallet.dat 壞掉,但資料被拯救回來了ï¼åŽŸä¾†çš„ wallet.dat 會改儲存在 %s, 檔å是 wallet.{timestamp}.bak. 如果餘é¡æˆ–交易資料有誤,你應該è¦ç”¨å‚™ä»½è³‡æ–™å¾©åŽŸå›žä¾†ã€‚</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>You need to rebuild the database using -reindex-chainstate to change -txindex</source>
+ <translation>改變 -txindex åƒæ•¸å¾Œï¼Œå¿…é ˆè¦ç”¨ -reindex-chainstate åƒæ•¸ä¾†é‡å»ºè³‡æ–™åº«</translation>
+ </message>
+ <message>
+ <source>%s corrupt, salvage failed</source>
+ <translation>錢包檔 %s 壞掉了,æ¶æ•‘失敗</translation>
+ </message>
+ <message>
<source>-maxmempool must be at least %d MB</source>
<translation>åƒæ•¸ -maxmempool 至少è¦çµ¦ %d 百è¬ä½å…ƒçµ„(MB)</translation>
</message>
@@ -3005,10 +1912,26 @@
<translation>&lt;category&gt; å¯ä»¥æ˜¯:</translation>
</message>
<message>
+ <source>Append comment to the user agent string</source>
+ <translation>å°ä½¿ç”¨è€…代ç†å­—串添加註解</translation>
+ </message>
+ <message>
+ <source>Attempt to recover private keys from a corrupt wallet on startup</source>
+ <translation>啟動時嘗試從壞掉的錢包檔復原密鑰</translation>
+ </message>
+ <message>
<source>Block creation options:</source>
<translation>å€å¡Šè£½é€ é¸é …:</translation>
</message>
<message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation>æ²’è¾¦æ³•è§£æž -%s åƒæ•¸æŒ‡å®šçš„ä½å€: '%s'</translation>
+ </message>
+ <message>
+ <source>Change index out of range</source>
+ <translation>找零的索引值超出範åœ</translation>
+ </message>
+ <message>
<source>Connect only to the specified node(s)</source>
<translation>åªé€£ç·šåˆ°æŒ‡å®šç¯€é»ž(å¯å¤šå€‹)</translation>
</message>
@@ -3017,6 +1940,10 @@
<translation>連線é¸é …:</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation>版權所有 (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>發ç¾å€å¡Šè³‡æ–™åº«å£žæŽ‰äº†</translation>
</message>
@@ -3049,6 +1976,10 @@
<translation>開啟傳é€äº¤æ˜“原始資料到目標 ZeroMQ ä½å€ &lt;address&gt; 去</translation>
</message>
<message>
+ <source>Enable transaction replacement in the memory pool (default: %u)</source>
+ <translation>å°äº¤æ˜“暫存池啟用替代交易(é è¨­å€¼: %u)</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation>åˆå§‹åŒ–å€å¡Šè³‡æ–™åº«æ™‚發生錯誤</translation>
</message>
@@ -3057,6 +1988,22 @@
<translation>åˆå§‹åŒ–錢包資料庫環境 %s 時發生錯誤ï¼</translation>
</message>
<message>
+ <source>Error loading %s</source>
+ <translation>載入檔案 %s 時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation>載入檔案 %s 時發生錯誤: 錢包æ毀了</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation>載入檔案 %s 時發生錯誤: 這個錢包需è¦æ–°ç‰ˆçš„ %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: You can't disable HD on a already existing HD wallet</source>
+ <translation>載入 %s 發生錯誤:ä¸èƒ½å°å·²å­˜åœ¨çš„ HD 錢包åœç”¨ HD 功能。</translation>
+ </message>
+ <message>
<source>Error loading block database</source>
<translation>載入å€å¡Šè³‡æ–™åº«æ™‚發生錯誤</translation>
</message>
@@ -3081,14 +2028,38 @@
<translation>創世å€å¡Šä¸æ­£ç¢ºæˆ–找ä¸åˆ°ã€‚資料目錄錯了嗎?</translation>
</message>
<message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation>åˆå§‹åŒ–時的基本檢查失敗了。%s å°±è¦é—œé–‰äº†ã€‚</translation>
+ </message>
+ <message>
<source>Invalid -onion address: '%s'</source>
<translation>無效的 -onion ä½å€: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation>åƒæ•¸ -%s=&lt;金é¡&gt; 指定的金é¡ç„¡æ•ˆ: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -fallbackfee=&lt;amount&gt;: '%s'</source>
+ <translation>設定 -fallbackfee=&lt;金é¡&gt; 的金é¡ç„¡æ•ˆ: '%s'</translation>
+ </message>
+ <message>
<source>Keep the transaction memory pool below &lt;n&gt; megabytes (default: %u)</source>
<translation>在記憶體暫存池中ä¿æŒæœ€å¤š &lt;n&gt; 個百è¬ä½å…ƒçµ„的交易(é è¨­å€¼: %u)</translation>
</message>
<message>
+ <source>Loading banlist...</source>
+ <translation>正在載入ç¦æ­¢é€£ç·šå單中...</translation>
+ </message>
+ <message>
+ <source>Location of the auth cookie (default: data dir)</source>
+ <translation>èªè­‰ cookie 資料的ä½ç½®(é è¨­å€¼: åŒè³‡æ–™ç›®éŒ„)</translation>
+ </message>
+ <message>
+ <source>Minimum bytes per sigop in transactions we relay and mine (default: %u)</source>
+ <translation>轉發和開採時,å°äº¤æ˜“資料的 sigop å¹³å‡ä½å…ƒçµ„數下é™(é è¨­å€¼: %u)</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>檔案æè¿°å…ƒä¸è¶³ã€‚</translation>
</message>
@@ -3097,6 +2068,14 @@
<translation>åªå’Œ &lt;net&gt; 網路上的節點連線(ipv4, ipv6, 或 onion)</translation>
</message>
<message>
+ <source>Print this help message and exit</source>
+ <translation>顯示說明訊æ¯å¾ŒçµæŸ</translation>
+ </message>
+ <message>
+ <source>Print version and exit</source>
+ <translation>顯示版本後çµæŸ</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation>修剪值ä¸èƒ½è¨­å®šç‚ºè² çš„。</translation>
</message>
@@ -3105,10 +2084,26 @@
<translation>修剪模å¼å’Œ -txindex åƒæ•¸ä¸ç›¸å®¹ã€‚</translation>
</message>
<message>
+ <source>Rebuild chain state and block index from the blk*.dat files on disk</source>
+ <translation>從ç£ç¢Ÿè£¡çš„å€å¡Šæª” blk*.dat é‡å»ºå€å¡Šéˆç‹€æ…‹å’Œå€å¡Šç´¢å¼•</translation>
+ </message>
+ <message>
+ <source>Rebuild chain state from the currently indexed blocks</source>
+ <translation>從目å‰å·²ç·¨ç´¢å¼•çš„å€å¡Šè³‡æ–™é‡å»ºå€å¡Šéˆç‹€æ…‹</translation>
+ </message>
+ <message>
+ <source>Rewinding blocks...</source>
+ <translation>倒轉回å€å¡Šéˆä¹‹å‰çš„狀態...</translation>
+ </message>
+ <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>設定資料庫快å–大å°æ˜¯å¤šå°‘百è¬ä½å…ƒçµ„(MB,範åœ: %d 到 %d,é è¨­å€¼: %d)</translation>
</message>
<message>
+ <source>Set maximum block cost (default: %d)</source>
+ <translation>設定å€å¡Šæˆæœ¬çš„最大值(é è¨­å€¼: %d)</translation>
+ </message>
+ <message>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>設定å€å¡Šå¤§å°ä¸Šé™æˆå¤šå°‘ä½å…ƒçµ„(é è¨­å€¼: %d)</translation>
</message>
@@ -3117,6 +2112,14 @@
<translation>指定錢包檔(會在資料目錄中)</translation>
</message>
<message>
+ <source>The source code is available from %s.</source>
+ <translation>原始碼å¯ä»¥åœ¨ %s å–得。</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation>沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
+ </message>
+ <message>
<source>Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>忽略了ä¸å†æ”¯æ´çš„ -benchmark åƒæ•¸ï¼Œè«‹æ”¹ç”¨ -debug=bench</translation>
</message>
@@ -3129,6 +2132,10 @@
<translation>找到ä¸å†æ”¯æ´çš„ -tor åƒæ•¸ï¼Œè«‹æ”¹ç”¨ -onion åƒæ•¸ã€‚</translation>
</message>
<message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>使用通用隨æ’å³ç”¨ (UPnP) å”定來設定å°æ‡‰çš„æœå‹™é€£æŽ¥åŸ (é è¨­å€¼: %u)</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation>使用者代ç†è¨»è§£(%s)中å«æœ‰ä¸å®‰å…¨çš„字元。</translation>
</message>
@@ -3145,16 +2152,16 @@
<translation>錢包檔 %s 沒有在資料目錄 %s 裡é¢</translation>
</message>
<message>
- <source>Wallet options:</source>
- <translation>錢包é¸é …:</translation>
+ <source>Wallet debugging/testing options:</source>
+ <translation>錢包除錯與測試é¸é …:</translation>
</message>
<message>
- <source>Warning: This version is obsolete; upgrade required!</source>
- <translation>警告: 這個版本已經被淘汰了;必須è¦å‡ç´šï¼</translation>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation>錢包需è¦é‡å¯«: è«‹é‡æ–°å•“å‹• %s 來完æˆ</translation>
</message>
<message>
- <source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>改變 -txindex åƒæ•¸å¾Œï¼Œå¿…é ˆè¦ç”¨ -reindex åƒæ•¸ä¾†é‡å»ºè³‡æ–™åº«</translation>
+ <source>Wallet options:</source>
+ <translation>錢包é¸é …:</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>
@@ -3169,10 +2176,6 @@
<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>
@@ -3217,10 +2220,6 @@
<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>
@@ -3229,8 +2228,12 @@
<translation>此產å“也包å«äº†ç”± OpenSSL Project 所開發的 OpenSSL Toolkit 軟體 &lt;https://www.openssl.org/&gt;, 和由 Eric Young 撰寫的加解密軟體,以åŠç”± Thomas Bernard 所撰寫的 UPnP 軟體。</translation>
</message>
<message>
+ <source>Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start</source>
+ <translation>在 BIP32 開始作用後,啟用階層å¼å¯é æœŸæ€§å¯†é‘°ç”¢ç”Ÿæ–¹å¼(HD)。åªæœ‰åœ¨ç”¢ç”Ÿæ–°éŒ¢åŒ…或第一次啟動時æ‰æœ‰ä½œç”¨ã€‚</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>在白å單中的節點ä¸æœƒå› ç‚ºåµæ¸¬åˆ°é˜»æ–·æœå‹™æ”»æ“Šè€Œè¢«åœç”¨ã€‚來自這些節點的交易也一定會被轉發,å³ä½¿èªªäº¤æ˜“本來就在記憶池裡了也一樣。é©ç”¨æ–¼åƒæ˜¯é–˜é“伺æœå™¨ã€‚</translation>
+ <translation>在白å單中的節點ä¸æœƒå› ç‚ºåµæ¸¬åˆ°é˜»æ–·æœå‹™æ”»æ“Š(DoS)而被åœç”¨ã€‚來自這些節點的交易也一定會被轉發,å³ä½¿èªªäº¤æ˜“本來就在記憶池裡了也一樣。é©ç”¨æ–¼åƒæ˜¯é–˜é“伺æœå™¨ã€‚</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>
@@ -3245,38 +2248,14 @@
<translation>接å—公開的REST請求 (é è¨­å€¼: %u)</translation>
</message>
<message>
- <source>Activating best chain...</source>
- <translation>啟用最佳éˆçµ...</translation>
- </message>
- <message>
- <source>Always relay transactions received from whitelisted peers (default: %d)</source>
- <translation>ç„¡æ¢ä»¶è½‰ç™¼å¾žç™½å點節點收到的交易(é è¨­å€¼: %d)</translation>
- </message>
- <message>
- <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source>
- <translation>啟動時嘗試從壞掉的錢包檔 wallet.dat 復原密鑰</translation>
- </message>
- <message>
<source>Automatically create Tor hidden service (default: %d)</source>
<translation>自動產生 Tor éš±è—æœå‹™(é è¨­å€¼: %d)</translation>
</message>
<message>
- <source>Cannot resolve -whitebind address: '%s'</source>
- <translation>æ²’è¾¦æ³•è§£æž -whitebind 指定的ä½å€: '%s'</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>版權為ä½å…ƒå¹£æ ¸å¿ƒé–‹ç™¼äººå“¡è‡ªè¥¿å…ƒ 2009 至 %i 年起所有</translation>
- </message>
- <message>
- <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <translation>載入 wallet.dat 檔案時發生錯誤: 這個錢包需è¦æ–°ç‰ˆçš„ä½å…ƒå¹£æ ¸å¿ƒ</translation>
- </message>
- <message>
<source>Error reading from database, shutting down.</source>
<translation>讀å–資料庫時發生錯誤,è¦é—œé–‰äº†ã€‚</translation>
</message>
@@ -3289,22 +2268,6 @@
<translation>資訊</translation>
</message>
<message>
- <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <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>
- <translation>設定最低轉發手續費 -minrelaytxfee=&lt;金é¡&gt; 的金é¡ç„¡æ•ˆ: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>設定 -mintxfee=&lt;金é¡&gt; 的金é¡ç„¡æ•ˆ: '%s'</translation>
- </message>
- <message>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation>設定 -paytxfee=&lt;金é¡&gt; 的金é¡ç„¡æ•ˆ: '%s' (至少è¦æœ‰ %s)</translation>
</message>
@@ -3329,14 +2292,6 @@
<translation>RPC 伺æœå™¨é¸é …:</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files on startup</source>
- <translation>啟動時從目å‰çš„å€å¡Šæª” blk000??.dat é‡å»ºå€å¡Šéˆçš„索引</translation>
- </message>
- <message>
- <source>Receive and display P2P network alerts (default: %u)</source>
- <translation>接收並顯示å°ç­‰ç¶²è·¯(P2P)警示 (é è¨­å€¼: %u)</translation>
- </message>
- <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation>因為系統的é™åˆ¶ï¼Œå°‡ -maxconnections åƒæ•¸å¾ž %d é™åˆ°äº† %d</translation>
</message>
@@ -3409,14 +2364,14 @@
<translation>JSON-RPC 連線使用者å稱</translation>
</message>
<message>
- <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>錢包需è¦é‡å¯«: è«‹é‡æ–°å•“å‹•ä½å…ƒå¹£æ ¸å¿ƒä¾†å®Œæˆ</translation>
- </message>
- <message>
<source>Warning</source>
<translation>警告</translation>
</message>
<message>
+ <source>Warning: unknown new rules activated (versionbit %i)</source>
+ <translation>警告: ä¸æ˜Žçš„交易è¦å‰‡è¢«å•Ÿç”¨äº†(versionbit %i)</translation>
+ </message>
+ <message>
<source>Whether to operate in a blocks only mode (default: %u)</source>
<translation>是å¦è¦ç”¨åªè¦å€å¡Šæ¨¡å¼é‹ä½œ(é è¨­å€¼: %u)</translation>
</message>
@@ -3429,10 +2384,6 @@
<translation>ZeroMQ 通知é¸é …:</translation>
</message>
<message>
- <source>wallet.dat corrupt, salvage failed</source>
- <translation>錢包檔 weallet.dat 壞掉了,拯救失敗</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>JSON-RPC 連線密碼</translation>
</message>
@@ -3441,10 +2392,6 @@
<translation>當最新å€å¡Šæ”¹è®Šæ™‚è¦åŸ·è¡Œçš„指令(指令中的 %s 會被å–代æˆå€å¡Šé›œæ¹Šå€¼)</translation>
</message>
<message>
- <source>This help message</source>
- <translation>這些說明訊æ¯</translation>
- </message>
- <message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>å…è¨±å° -addnode, -seednode, -connect çš„åƒæ•¸ä½¿ç”¨åŸŸå查詢 </translation>
</message>
@@ -3453,10 +2400,6 @@
<translation>正在載入ä½å€è³‡æ–™...</translation>
</message>
<message>
- <source>Error loading wallet.dat: Wallet corrupted</source>
- <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>
@@ -3470,11 +2413,11 @@
</message>
<message>
<source>Do not keep transactions in the mempool longer than &lt;n&gt; hours (default: %u)</source>
- <translation>ä¸è¦è®“äº¤æ˜“ç•™åœ¨è¨˜æ†¶é«”æš«å­˜æ± ä¸­è¶…éŽ &lt;n&gt; 個å°æ™‚(é è¨­å€¼: %u)</translation>
+ <translation>ä¸è¦è®“äº¤æ˜“ç•™åœ¨è¨˜æ†¶æ± ä¸­è¶…éŽ &lt;n&gt; 個å°æ™‚(é è¨­å€¼: %u)</translation>
</message>
<message>
- <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>讀å–錢包檔 wallet.dat 時發生錯誤ï¼æ‰€æœ‰çš„密鑰都正確讀å–了,但是交易資料或ä½å€ç°¿è³‡æ–™å¯èƒ½æœƒç¼ºå°‘或ä¸æ­£ç¢ºã€‚</translation>
+ <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>當製造交易時,如果æ¯åƒä½å…ƒçµ„(kB)的手續費比這個值(å–®ä½æ˜¯ %s)低,就視為沒付手續費(é è¨­å€¼: %s)</translation>
</message>
<message>
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
@@ -3493,6 +2436,10 @@
<translation>輸出除錯資訊(é è¨­å€¼: %u, ä¸ä¸€å®šè¦æŒ‡å®š &lt;category&gt;)</translation>
</message>
<message>
+ <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source>
+ <translation>支æ´ç”¨å¸ƒå€«éŽæ¿¾å™¨ä¾†éŽæ¿¾å€å¡Šå’Œäº¤æ˜“(é è¨­å€¼: %u)</translation>
+ </message>
+ <message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<translation>網路版本字串的總長度(%i)超éŽæœ€å¤§é•·åº¦(%i)了。請減少 uacomment åƒæ•¸çš„數目或長度。</translation>
</message>
@@ -3505,24 +2452,32 @@
<translation>找到ä¸å†æ”¯æ´çš„ -socks åƒæ•¸ã€‚ç¾åœ¨åªæ”¯æ´ SOCKS5 å”定的代ç†ä¼ºæœå™¨ï¼Œå› æ­¤ä¸å¯ä»¥æŒ‡å®š SOCKS å”定版本了。</translation>
</message>
<message>
+ <source>Unsupported argument -whitelistalwaysrelay ignored, use -whitelistrelay and/or -whitelistforcerelay.</source>
+ <translation>忽略ä¸æ”¯æ´çš„åƒæ•¸ -whitelistalwaysrelay,請改用 -whitelistrelay å’Œ -whitelistforcerelay​ 的組åˆã€‚</translation>
+ </message>
+ <message>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation>使用å¦å¤–çš„ SOCK5 代ç†ä¼ºæœå™¨ï¼Œä¾†é€éŽ Tor éš±è—æœå‹™è·Ÿå…¶ä»–節點è¯çµ¡(é è¨­å€¼: %s)</translation>
</message>
<message>
- <source>(default: %s)</source>
- <translation>(é è¨­å€¼: %s)</translation>
+ <source>Username and hashed password for JSON-RPC connections. The field &lt;userpw&gt; comes in the format: &lt;USERNAME&gt;:&lt;SALT&gt;$&lt;HASH&gt;. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source>
+ <translation>JSON-RPC 連線è¦ç”¨çš„使用者å稱和雜湊密碼。&lt;userpw&gt; çš„æ ¼å¼æ˜¯ï¼š&lt;使用者å稱&gt;:&lt;調味值&gt;$&lt;雜湊值&gt;。在 share/rpcuser 目錄下有一個示範的 python 程å¼ã€‚這個é¸é …å¯ä»¥çµ¦å¾ˆå¤šæ¬¡ã€‚</translation>
</message>
<message>
- <source>Always query for peer addresses via DNS lookup (default: %u)</source>
- <translation>是å¦ä¸€å®šè¦ç”¨åŸŸå查詢來æœå°‹ç¯€é»ž(é è¨­å€¼: %u)</translation>
+ <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
+ <translation>警告: 有礦工正在開採ä¸æ˜Žç‰ˆæœ¬çš„å€å¡Šï¼é€™è¡¨ç¤ºæœ‰ä¸æ˜Žçš„交易è¦å‰‡æ­£åœ¨ä½œç”¨ä¸­</translation>
</message>
<message>
- <source>Error loading wallet.dat</source>
- <translation>載入錢包檔 wallet.dat 時發生錯誤</translation>
+ <source>Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
+ <translation>警告: 錢包檔壞掉,但資料被救回來了ï¼åŽŸä¾†çš„檔案 %s 改儲存為 %s,在目錄 %s 下。 如果餘é¡æˆ–交易資料有誤的話,你應該è¦å¾žå‚™ä»½è³‡æ–™å¾©åŽŸå›žä¾†ã€‚</translation>
</message>
<message>
- <source>Generate coins (default: %u)</source>
- <translation>生產ä½å…ƒå¹£(é è¨­å€¼: %u)</translation>
+ <source>(default: %s)</source>
+ <translation>(é è¨­å€¼: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>是å¦ä¸€å®šè¦ç”¨åŸŸå查詢來æœå°‹ç¯€é»ž(é è¨­å€¼: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
@@ -3609,18 +2564,6 @@
<translation>在 -onlynet 指定了ä¸æ˜Žçš„網路別: '%s'</translation>
</message>
<message>
- <source>Cannot resolve -bind address: '%s'</source>
- <translation>æ²’è¾¦æ³•è§£æž -bind ä½å€: '%s'</translation>
- </message>
- <message>
- <source>Cannot resolve -externalip address: '%s'</source>
- <translation>æ²’è¾¦æ³•è§£æž -externalip ä½å€: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
- <translation>設定 -paytxfee=&lt;金é¡&gt; 的金é¡ç„¡æ•ˆ: '%s'</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>ç´¯ç©é‡‘é¡ä¸è¶³</translation>
</message>
diff --git a/src/qt/macdockiconhandler.h b/src/qt/macdockiconhandler.h
index 8bd867c103..1c28593d4a 100644
--- a/src/qt/macdockiconhandler.h
+++ b/src/qt/macdockiconhandler.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/macnotificationhandler.h b/src/qt/macnotificationhandler.h
index bd66b96b21..d4749b3d5f 100644
--- a/src/qt/macnotificationhandler.h
+++ b/src/qt/macnotificationhandler.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
diff --git a/src/qt/modaloverlay.cpp b/src/qt/modaloverlay.cpp
new file mode 100644
index 0000000000..ae0d8f5f63
--- /dev/null
+++ b/src/qt/modaloverlay.cpp
@@ -0,0 +1,162 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "modaloverlay.h"
+#include "ui_modaloverlay.h"
+
+#include "guiutil.h"
+
+#include <QResizeEvent>
+#include <QPropertyAnimation>
+
+ModalOverlay::ModalOverlay(QWidget *parent) :
+QWidget(parent),
+ui(new Ui::ModalOverlay),
+bestHeaderHeight(0),
+bestHeaderDate(QDateTime()),
+layerIsVisible(false),
+userClosed(false)
+{
+ ui->setupUi(this);
+ connect(ui->closeButton, SIGNAL(clicked()), this, SLOT(closeClicked()));
+ if (parent) {
+ parent->installEventFilter(this);
+ raise();
+ }
+
+ blockProcessTime.clear();
+ setVisible(false);
+}
+
+ModalOverlay::~ModalOverlay()
+{
+ delete ui;
+}
+
+bool ModalOverlay::eventFilter(QObject * obj, QEvent * ev) {
+ if (obj == parent()) {
+ if (ev->type() == QEvent::Resize) {
+ QResizeEvent * rev = static_cast<QResizeEvent*>(ev);
+ resize(rev->size());
+ if (!layerIsVisible)
+ setGeometry(0, height(), width(), height());
+
+ }
+ else if (ev->type() == QEvent::ChildAdded) {
+ raise();
+ }
+ }
+ return QWidget::eventFilter(obj, ev);
+}
+
+//! Tracks parent widget changes
+bool ModalOverlay::event(QEvent* ev) {
+ if (ev->type() == QEvent::ParentAboutToChange) {
+ if (parent()) parent()->removeEventFilter(this);
+ }
+ else if (ev->type() == QEvent::ParentChange) {
+ if (parent()) {
+ parent()->installEventFilter(this);
+ raise();
+ }
+ }
+ return QWidget::event(ev);
+}
+
+void ModalOverlay::setKnownBestHeight(int count, const QDateTime& blockDate)
+{
+ if (count > bestHeaderHeight) {
+ bestHeaderHeight = count;
+ bestHeaderDate = blockDate;
+ }
+}
+
+void ModalOverlay::tipUpdate(int count, const QDateTime& blockDate, double nVerificationProgress)
+{
+ QDateTime currentDate = QDateTime::currentDateTime();
+
+ // keep a vector of samples of verification progress at height
+ blockProcessTime.push_front(qMakePair(currentDate.toMSecsSinceEpoch(), nVerificationProgress));
+
+ // show progress speed if we have more then one sample
+ if (blockProcessTime.size() >= 2)
+ {
+ double progressStart = blockProcessTime[0].second;
+ double progressDelta = 0;
+ double progressPerHour = 0;
+ qint64 timeDelta = 0;
+ qint64 remainingMSecs = 0;
+ double remainingProgress = 1.0 - nVerificationProgress;
+ for (int i = 1; i < blockProcessTime.size(); i++)
+ {
+ QPair<qint64, double> sample = blockProcessTime[i];
+
+ // take first sample after 500 seconds or last available one
+ if (sample.first < (currentDate.toMSecsSinceEpoch() - 500 * 1000) || i == blockProcessTime.size() - 1) {
+ progressDelta = progressStart-sample.second;
+ timeDelta = blockProcessTime[0].first - sample.first;
+ progressPerHour = progressDelta/(double)timeDelta*1000*3600;
+ remainingMSecs = remainingProgress / progressDelta * timeDelta;
+ break;
+ }
+ }
+ // show progress increase per hour
+ ui->progressIncreasePerH->setText(QString::number(progressPerHour*100, 'f', 2)+"%");
+
+ // show expected remaining time
+ ui->expectedTimeLeft->setText(GUIUtil::formateNiceTimeOffset(remainingMSecs/1000.0));
+
+ static const int MAX_SAMPLES = 5000;
+ if (blockProcessTime.count() > MAX_SAMPLES)
+ blockProcessTime.remove(MAX_SAMPLES, blockProcessTime.count()-MAX_SAMPLES);
+ }
+
+ // show the last block date
+ ui->newestBlockDate->setText(blockDate.toString());
+
+ // show the percentage done according to nVerificationProgress
+ ui->percentageProgress->setText(QString::number(nVerificationProgress*100, 'f', 2)+"%");
+ ui->progressBar->setValue(nVerificationProgress*100);
+
+ if (!bestHeaderDate.isValid())
+ // not syncing
+ return;
+
+ // estimate the number of headers left based on nPowTargetSpacing
+ // and check if the gui is not aware of the the best header (happens rarely)
+ int estimateNumHeadersLeft = bestHeaderDate.secsTo(currentDate) / 600;
+ bool hasBestHeader = bestHeaderHeight >= count;
+
+ // show remaining number of blocks
+ if (estimateNumHeadersLeft < 24 && hasBestHeader) {
+ ui->numberOfBlocksLeft->setText(QString::number(bestHeaderHeight - count));
+ } else {
+ ui->expectedTimeLeft->setText(tr("Unknown. Syncing Headers..."));
+ }
+}
+
+void ModalOverlay::showHide(bool hide, bool userRequested)
+{
+ if ( (layerIsVisible && !hide) || (!layerIsVisible && hide) || (!hide && userClosed && !userRequested))
+ return;
+
+ if (!isVisible() && !hide)
+ setVisible(true);
+
+ setGeometry(0, hide ? 0 : height(), width(), height());
+
+ QPropertyAnimation* animation = new QPropertyAnimation(this, "pos");
+ animation->setDuration(300);
+ animation->setStartValue(QPoint(0, hide ? 0 : this->height()));
+ animation->setEndValue(QPoint(0, hide ? this->height() : 0));
+ animation->setEasingCurve(QEasingCurve::OutQuad);
+ animation->start(QAbstractAnimation::DeleteWhenStopped);
+ layerIsVisible = !hide;
+}
+
+void ModalOverlay::closeClicked()
+{
+ showHide(true);
+ userClosed = true;
+}
diff --git a/src/qt/modaloverlay.h b/src/qt/modaloverlay.h
new file mode 100644
index 0000000000..66c0aa78cf
--- /dev/null
+++ b/src/qt/modaloverlay.h
@@ -0,0 +1,45 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_QT_MODALOVERLAY_H
+#define BITCOIN_QT_MODALOVERLAY_H
+
+#include <QDateTime>
+#include <QWidget>
+
+namespace Ui {
+ class ModalOverlay;
+}
+
+/** Modal overlay to display information about the chain-sync state */
+class ModalOverlay : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit ModalOverlay(QWidget *parent);
+ ~ModalOverlay();
+
+public Q_SLOTS:
+ void tipUpdate(int count, const QDateTime& blockDate, double nVerificationProgress);
+ void setKnownBestHeight(int count, const QDateTime& blockDate);
+
+ // will show or hide the modal layer
+ void showHide(bool hide = false, bool userRequested = false);
+ void closeClicked();
+
+protected:
+ bool eventFilter(QObject * obj, QEvent * ev);
+ bool event(QEvent* ev);
+
+private:
+ Ui::ModalOverlay *ui;
+ int bestHeaderHeight; //best known height (based on the headers)
+ QDateTime bestHeaderDate;
+ QVector<QPair<qint64, double> > blockProcessTime;
+ bool layerIsVisible;
+ bool userClosed;
+};
+
+#endif // BITCOIN_QT_MODALOVERLAY_H
diff --git a/src/qt/networkstyle.cpp b/src/qt/networkstyle.cpp
index 4541c75886..acbfee0868 100644
--- a/src/qt/networkstyle.cpp
+++ b/src/qt/networkstyle.cpp
@@ -1,4 +1,4 @@
-// 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.
@@ -22,9 +22,9 @@ static const struct {
static const unsigned network_styles_count = sizeof(network_styles)/sizeof(*network_styles);
// titleAddText needs to be const char* for tr()
-NetworkStyle::NetworkStyle(const QString &appName, const int iconColorHueShift, const int iconColorSaturationReduction, const char *titleAddText):
- appName(appName),
- titleAddText(qApp->translate("SplashScreen", titleAddText))
+NetworkStyle::NetworkStyle(const QString &_appName, const int iconColorHueShift, const int iconColorSaturationReduction, const char *_titleAddText):
+ appName(_appName),
+ titleAddText(qApp->translate("SplashScreen", _titleAddText))
{
// load pixmap
QPixmap pixmap(":/icons/bitcoin");
diff --git a/src/qt/notificator.cpp b/src/qt/notificator.cpp
index 5a564248ec..8277e20c90 100644
--- a/src/qt/notificator.cpp
+++ b/src/qt/notificator.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
@@ -33,17 +33,17 @@
const int FREEDESKTOP_NOTIFICATION_ICON_SIZE = 128;
#endif
-Notificator::Notificator(const QString &programName, QSystemTrayIcon *trayicon, QWidget *parent) :
- QObject(parent),
- parent(parent),
- programName(programName),
+Notificator::Notificator(const QString &_programName, QSystemTrayIcon *_trayIcon, QWidget *_parent) :
+ QObject(_parent),
+ parent(_parent),
+ programName(_programName),
mode(None),
- trayIcon(trayicon)
+ trayIcon(_trayIcon)
#ifdef USE_DBUS
,interface(0)
#endif
{
- if(trayicon && trayicon->supportsMessages())
+ if(_trayIcon && _trayIcon->supportsMessages())
{
mode = QSystemTray;
}
diff --git a/src/qt/notificator.h b/src/qt/notificator.h
index f2a15e9c34..f92b791d4a 100644
--- a/src/qt/notificator.h
+++ b/src/qt/notificator.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/openuridialog.cpp b/src/qt/openuridialog.cpp
index 1c843aecb1..5a66161346 100644
--- a/src/qt/openuridialog.cpp
+++ b/src/qt/openuridialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
diff --git a/src/qt/openuridialog.h b/src/qt/openuridialog.h
index 28b8f56ca6..e94593d5bb 100644
--- a/src/qt/openuridialog.h
+++ b/src/qt/openuridialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index 647c860bdc..588059d0c5 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -78,6 +78,11 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) :
/* Display elements init */
QDir translations(":translations");
+
+ ui->bitcoinAtStartup->setToolTip(ui->bitcoinAtStartup->toolTip().arg(tr(PACKAGE_NAME)));
+ ui->bitcoinAtStartup->setText(ui->bitcoinAtStartup->text().arg(tr(PACKAGE_NAME)));
+
+ ui->lang->setToolTip(ui->lang->toolTip().arg(tr(PACKAGE_NAME)));
ui->lang->addItem(QString("(") + tr("default") + QString(")"), QVariant(""));
Q_FOREACH(const QString &langStr, translations.entryList())
{
@@ -130,22 +135,22 @@ OptionsDialog::~OptionsDialog()
delete ui;
}
-void OptionsDialog::setModel(OptionsModel *model)
+void OptionsDialog::setModel(OptionsModel *_model)
{
- this->model = model;
+ this->model = _model;
- if(model)
+ if(_model)
{
/* check if client restart is needed and show persistent message */
- if (model->isRestartRequired())
+ if (_model->isRestartRequired())
showRestartWarning(true);
- QString strLabel = model->getOverriddenByCommandLine();
+ QString strLabel = _model->getOverriddenByCommandLine();
if (strLabel.isEmpty())
strLabel = tr("none");
ui->overriddenByCommandLineLabel->setText(strLabel);
- mapper->setModel(model);
+ mapper->setModel(_model);
setMapper();
mapper->toFirst();
@@ -193,6 +198,7 @@ void OptionsDialog::setMapper()
/* Window */
#ifndef Q_OS_MAC
+ mapper->addMapping(ui->hideTrayIcon, OptionsModel::HideTrayIcon);
mapper->addMapping(ui->minimizeToTray, OptionsModel::MinimizeToTray);
mapper->addMapping(ui->minimizeOnClose, OptionsModel::MinimizeOnClose);
#endif
@@ -238,6 +244,19 @@ void OptionsDialog::on_cancelButton_clicked()
reject();
}
+void OptionsDialog::on_hideTrayIcon_stateChanged(int fState)
+{
+ if(fState)
+ {
+ ui->minimizeToTray->setChecked(false);
+ ui->minimizeToTray->setEnabled(false);
+ }
+ else
+ {
+ ui->minimizeToTray->setEnabled(true);
+ }
+}
+
void OptionsDialog::showRestartWarning(bool fPersistent)
{
ui->statusLabel->setStyleSheet("QLabel { color: red; }");
@@ -308,7 +327,8 @@ QValidator::State ProxyAddressValidator::validate(QString &input, int &pos) cons
{
Q_UNUSED(pos);
// Validate the proxy
- proxyType addrProxy = proxyType(CService(input.toStdString(), 9050), true);
+ CService serv(LookupNumeric(input.toStdString().c_str(), 9050));
+ proxyType addrProxy = proxyType(serv, true);
if (addrProxy.IsValid())
return QValidator::Acceptable;
diff --git a/src/qt/optionsdialog.h b/src/qt/optionsdialog.h
index 489e35da49..41b56d1386 100644
--- a/src/qt/optionsdialog.h
+++ b/src/qt/optionsdialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -49,6 +49,8 @@ private Q_SLOTS:
void on_resetButton_clicked();
void on_okButton_clicked();
void on_cancelButton_clicked();
+
+ void on_hideTrayIcon_stateChanged(int fState);
void showRestartWarning(bool fPersistent = false);
void clearStatusLabel();
diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp
index 3e5c6c72b1..f82e153b67 100644
--- a/src/qt/optionsmodel.cpp
+++ b/src/qt/optionsmodel.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -15,7 +15,9 @@
#include "init.h"
#include "main.h" // For DEFAULT_SCRIPTCHECK_THREADS
#include "net.h"
+#include "netbase.h"
#include "txdb.h" // for -dbcache defaults
+#include "intro.h"
#ifdef ENABLE_WALLET
#include "wallet/wallet.h"
@@ -43,6 +45,8 @@ void OptionsModel::Init(bool resetSettings)
if (resetSettings)
Reset();
+ checkAndMigrate();
+
QSettings settings;
// Ensure restart flag is unset on client startup
@@ -51,9 +55,14 @@ void OptionsModel::Init(bool resetSettings)
// These are Qt-only settings:
// Window
+ if (!settings.contains("fHideTrayIcon"))
+ settings.setValue("fHideTrayIcon", false);
+ fHideTrayIcon = settings.value("fHideTrayIcon").toBool();
+ Q_EMIT hideTrayIconChanged(fHideTrayIcon);
+
if (!settings.contains("fMinimizeToTray"))
settings.setValue("fMinimizeToTray", false);
- fMinimizeToTray = settings.value("fMinimizeToTray").toBool();
+ fMinimizeToTray = settings.value("fMinimizeToTray").toBool() && !fHideTrayIcon;
if (!settings.contains("fMinimizeOnClose"))
settings.setValue("fMinimizeOnClose", false);
@@ -91,6 +100,9 @@ void OptionsModel::Init(bool resetSettings)
if (!SoftSetArg("-par", settings.value("nThreadsScriptVerif").toString().toStdString()))
addOverriddenOption("-par");
+ if (!settings.contains("strDataDir"))
+ settings.setValue("strDataDir", Intro::getDefaultDataDirectory());
+
// Wallet
#ifdef ENABLE_WALLET
if (!settings.contains("bSpendZeroConfChange"))
@@ -143,9 +155,19 @@ void OptionsModel::Reset()
{
QSettings settings;
+ // Save the strDataDir setting
+ QString dataDir = Intro::getDefaultDataDirectory();
+ dataDir = settings.value("strDataDir", dataDir).toString();
+
// Remove all entries from our QSettings object
settings.clear();
+ // Set strDataDir
+ settings.setValue("strDataDir", dataDir);
+
+ // Set that this was reset
+ settings.setValue("fReset", true);
+
// default setting for OptionsModel::StartAtStartup - disabled
if (GUIUtil::GetStartOnSystemStartup())
GUIUtil::SetStartOnSystemStartup(false);
@@ -166,6 +188,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
{
case StartAtStartup:
return GUIUtil::GetStartOnSystemStartup();
+ case HideTrayIcon:
+ return fHideTrayIcon;
case MinimizeToTray:
return fMinimizeToTray;
case MapPortUPnP:
@@ -242,6 +266,11 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
case StartAtStartup:
successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
break;
+ case HideTrayIcon:
+ fHideTrayIcon = value.toBool();
+ settings.setValue("fHideTrayIcon", fHideTrayIcon);
+ Q_EMIT hideTrayIconChanged(fHideTrayIcon);
+ break;
case MinimizeToTray:
fMinimizeToTray = value.toBool();
settings.setValue("fMinimizeToTray", fMinimizeToTray);
@@ -417,3 +446,22 @@ bool OptionsModel::isRestartRequired()
QSettings settings;
return settings.value("fRestartRequired", false).toBool();
}
+
+void OptionsModel::checkAndMigrate()
+{
+ // Migration of default values
+ // Check if the QSettings container was already loaded with this client version
+ QSettings settings;
+ static const char strSettingsVersionKey[] = "nSettingsVersion";
+ int settingsVersion = settings.contains(strSettingsVersionKey) ? settings.value(strSettingsVersionKey).toInt() : 0;
+ if (settingsVersion < CLIENT_VERSION)
+ {
+ // -dbcache was bumped from 100 to 300 in 0.13
+ // see https://github.com/bitcoin/bitcoin/pull/8273
+ // force people to upgrade to the new value if they are using 100MB
+ if (settingsVersion < 130000 && settings.contains("nDatabaseCache") && settings.value("nDatabaseCache").toLongLong() == 100)
+ settings.setValue("nDatabaseCache", (qint64)nDefaultDbCache);
+
+ settings.setValue(strSettingsVersionKey, CLIENT_VERSION);
+ }
+} \ No newline at end of file
diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h
index d5bddb1a94..b23b5f2607 100644
--- a/src/qt/optionsmodel.h
+++ b/src/qt/optionsmodel.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -28,6 +28,7 @@ public:
enum OptionID {
StartAtStartup, // bool
+ HideTrayIcon, // bool
MinimizeToTray, // bool
MapPortUPnP, // bool
MinimizeOnClose, // bool
@@ -58,6 +59,7 @@ public:
void setDisplayUnit(const QVariant &value);
/* Explicit getters */
+ bool getHideTrayIcon() { return fHideTrayIcon; }
bool getMinimizeToTray() { return fMinimizeToTray; }
bool getMinimizeOnClose() { return fMinimizeOnClose; }
int getDisplayUnit() { return nDisplayUnit; }
@@ -72,6 +74,7 @@ public:
private:
/* Qt-only settings */
+ bool fHideTrayIcon;
bool fMinimizeToTray;
bool fMinimizeOnClose;
QString language;
@@ -81,12 +84,15 @@ private:
/* settings that were overriden by command-line */
QString strOverriddenByCommandLine;
- /// Add option to list of GUI options overridden through command line/config file
+ // Add option to list of GUI options overridden through command line/config file
void addOverriddenOption(const std::string &option);
+ // Check settings version and upgrade default values if required
+ void checkAndMigrate();
Q_SIGNALS:
void displayUnitChanged(int unit);
void coinControlFeaturesChanged(bool);
+ void hideTrayIconChanged(bool);
};
#endif // BITCOIN_QT_OPTIONSMODEL_H
diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp
index a56c80ac63..7ccdb89c0c 100644
--- a/src/qt/overviewpage.cpp
+++ b/src/qt/overviewpage.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -25,9 +25,9 @@ class TxViewDelegate : public QAbstractItemDelegate
{
Q_OBJECT
public:
- TxViewDelegate(const PlatformStyle *platformStyle):
+ TxViewDelegate(const PlatformStyle *_platformStyle):
QAbstractItemDelegate(), unit(BitcoinUnits::BTC),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
}
@@ -140,6 +140,8 @@ OverviewPage::OverviewPage(const PlatformStyle *platformStyle, QWidget *parent)
// start with displaying the "out of sync" warnings
showOutOfSyncWarning(true);
+ connect(ui->labelWalletStatus, SIGNAL(clicked()), this, SLOT(handleOutOfSyncWarningClicks()));
+ connect(ui->labelTransactionsStatus, SIGNAL(clicked()), this, SLOT(handleOutOfSyncWarningClicks()));
}
void OverviewPage::handleTransactionClicked(const QModelIndex &index)
@@ -148,6 +150,11 @@ void OverviewPage::handleTransactionClicked(const QModelIndex &index)
Q_EMIT transactionClicked(filter->mapToSource(index));
}
+void OverviewPage::handleOutOfSyncWarningClicks()
+{
+ Q_EMIT outOfSyncWarningClicked();
+}
+
OverviewPage::~OverviewPage()
{
delete ui;
@@ -219,7 +226,7 @@ void OverviewPage::setWalletModel(WalletModel *model)
filter->setDynamicSortFilter(true);
filter->setSortRole(Qt::EditRole);
filter->setShowInactive(false);
- filter->sort(TransactionTableModel::Status, Qt::DescendingOrder);
+ filter->sort(TransactionTableModel::Date, Qt::DescendingOrder);
ui->listTransactions->setModel(filter);
ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h
index 4139eb35d3..65cd3341b6 100644
--- a/src/qt/overviewpage.h
+++ b/src/qt/overviewpage.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -42,6 +42,7 @@ public Q_SLOTS:
Q_SIGNALS:
void transactionClicked(const QModelIndex &index);
+ void outOfSyncWarningClicked();
private:
Ui::OverviewPage *ui;
@@ -62,6 +63,7 @@ private Q_SLOTS:
void handleTransactionClicked(const QModelIndex &index);
void updateAlerts(const QString &warnings);
void updateWatchOnlyLabels(bool showWatchOnly);
+ void handleOutOfSyncWarningClicks();
};
#endif // BITCOIN_QT_OVERVIEWPAGE_H
diff --git a/src/qt/paymentrequest.proto b/src/qt/paymentrequest.proto
index b2281c4c7b..d2721a34bd 100644
--- a/src/qt/paymentrequest.proto
+++ b/src/qt/paymentrequest.proto
@@ -6,6 +6,8 @@
// https://en.bitcoin.it/wiki/Payment_Request
//
+syntax = "proto2";
+
package payments;
option java_package = "org.bitcoin.protocols.payments";
option java_outer_classname = "Protos";
diff --git a/src/qt/paymentrequestplus.cpp b/src/qt/paymentrequestplus.cpp
index 1000c143f3..20e1f79ffa 100644
--- a/src/qt/paymentrequestplus.cpp
+++ b/src/qt/paymentrequestplus.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/paymentrequestplus.h b/src/qt/paymentrequestplus.h
index 8a7c4c0623..a73fe5f29d 100644
--- a/src/qt/paymentrequestplus.h
+++ b/src/qt/paymentrequestplus.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin developers
+// Copyright (c) 2011-2015 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp
index 31a6d65a8d..9f23e77a13 100644
--- a/src/qt/paymentserver.cpp
+++ b/src/qt/paymentserver.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -749,9 +749,9 @@ void PaymentServer::reportSslErrors(QNetworkReply* reply, const QList<QSslError>
Q_EMIT message(tr("Network request error"), errString, CClientUIInterface::MSG_ERROR);
}
-void PaymentServer::setOptionsModel(OptionsModel *optionsModel)
+void PaymentServer::setOptionsModel(OptionsModel *_optionsModel)
{
- this->optionsModel = optionsModel;
+ this->optionsModel = _optionsModel;
}
void PaymentServer::handlePaymentACK(const QString& paymentACKMsg)
diff --git a/src/qt/paymentserver.h b/src/qt/paymentserver.h
index fa120a435c..2d27ed078b 100644
--- a/src/qt/paymentserver.h
+++ b/src/qt/paymentserver.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp
index 94837679d8..a820bd791f 100644
--- a/src/qt/peertablemodel.cpp
+++ b/src/qt/peertablemodel.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -24,6 +24,8 @@ bool NodeLessThan::operator()(const CNodeCombinedStats &left, const CNodeCombine
switch(column)
{
+ case PeerTableModel::NetNodeId:
+ return pLeft->nodeid < pRight->nodeid;
case PeerTableModel::Address:
return pLeft->addrName.compare(pRight->addrName) < 0;
case PeerTableModel::Subversion:
@@ -52,24 +54,21 @@ public:
void refreshPeers()
{
{
- TRY_LOCK(cs_vNodes, lockNodes);
- if (!lockNodes)
- {
- // skip the refresh if we can't immediately get the lock
- return;
- }
cachedNodeStats.clear();
+ std::vector<CNodeStats> vstats;
+ if(g_connman)
+ g_connman->GetNodeStats(vstats);
#if QT_VERSION >= 0x040700
- cachedNodeStats.reserve(vNodes.size());
+ cachedNodeStats.reserve(vstats.size());
#endif
- Q_FOREACH (CNode* pnode, vNodes)
+ Q_FOREACH (const CNodeStats& nodestats, vstats)
{
CNodeCombinedStats stats;
stats.nodeStateStats.nMisbehavior = 0;
stats.nodeStateStats.nSyncHeight = -1;
stats.nodeStateStats.nCommonHeight = -1;
stats.fNodeStateStatsAvailable = false;
- pnode->copyStats(stats.nodeStats);
+ stats.nodeStats = nodestats;
cachedNodeStats.append(stats);
}
}
@@ -114,7 +113,7 @@ PeerTableModel::PeerTableModel(ClientModel *parent) :
clientModel(parent),
timer(0)
{
- columns << tr("Node/Service") << tr("User Agent") << tr("Ping Time");
+ columns << tr("NodeId") << tr("Node/Service") << tr("User Agent") << tr("Ping Time");
priv = new PeerTablePriv();
// default to unsorted
priv->sortColumn = -1;
@@ -147,7 +146,7 @@ int PeerTableModel::rowCount(const QModelIndex &parent) const
int PeerTableModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
- return columns.length();;
+ return columns.length();
}
QVariant PeerTableModel::data(const QModelIndex &index, int role) const
@@ -160,6 +159,8 @@ QVariant PeerTableModel::data(const QModelIndex &index, int role) const
if (role == Qt::DisplayRole) {
switch(index.column())
{
+ case NetNodeId:
+ return rec->nodeStats.nodeid;
case Address:
return QString::fromStdString(rec->nodeStats.addrName);
case Subversion:
diff --git a/src/qt/peertablemodel.h b/src/qt/peertablemodel.h
index 5f149ea873..a4f7bbdb3d 100644
--- a/src/qt/peertablemodel.h
+++ b/src/qt/peertablemodel.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -52,9 +52,10 @@ public:
void stopAutoRefresh();
enum ColumnIndex {
- Address = 0,
- Subversion = 1,
- Ping = 2
+ NetNodeId = 0,
+ Address = 1,
+ Subversion = 2,
+ Ping = 3
};
/** @name Methods overridden from QAbstractTableModel
diff --git a/src/qt/platformstyle.cpp b/src/qt/platformstyle.cpp
index 11cbc7a47c..e4438cc43d 100644
--- a/src/qt/platformstyle.cpp
+++ b/src/qt/platformstyle.cpp
@@ -73,11 +73,11 @@ QIcon ColorizeIcon(const QString& filename, const QColor& colorbase)
}
-PlatformStyle::PlatformStyle(const QString &name, bool imagesOnButtons, bool colorizeIcons, bool useExtraSpacing):
- name(name),
- imagesOnButtons(imagesOnButtons),
- colorizeIcons(colorizeIcons),
- useExtraSpacing(useExtraSpacing),
+PlatformStyle::PlatformStyle(const QString &_name, bool _imagesOnButtons, bool _colorizeIcons, bool _useExtraSpacing):
+ name(_name),
+ imagesOnButtons(_imagesOnButtons),
+ colorizeIcons(_colorizeIcons),
+ useExtraSpacing(_useExtraSpacing),
singleColor(0,0,0),
textColor(0,0,0)
{
diff --git a/src/qt/qvalidatedlineedit.cpp b/src/qt/qvalidatedlineedit.cpp
index 5658a0bdcf..492b96ff09 100644
--- a/src/qt/qvalidatedlineedit.cpp
+++ b/src/qt/qvalidatedlineedit.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -15,14 +15,14 @@ QValidatedLineEdit::QValidatedLineEdit(QWidget *parent) :
connect(this, SIGNAL(textChanged(QString)), this, SLOT(markValid()));
}
-void QValidatedLineEdit::setValid(bool valid)
+void QValidatedLineEdit::setValid(bool _valid)
{
- if(valid == this->valid)
+ if(_valid == this->valid)
{
return;
}
- if(valid)
+ if(_valid)
{
setStyleSheet("");
}
@@ -30,7 +30,7 @@ void QValidatedLineEdit::setValid(bool valid)
{
setStyleSheet(STYLE_INVALID);
}
- this->valid = valid;
+ this->valid = _valid;
}
void QValidatedLineEdit::focusInEvent(QFocusEvent *evt)
diff --git a/src/qt/qvalidatedlineedit.h b/src/qt/qvalidatedlineedit.h
index 8cb6a425fa..66734cc9d4 100644
--- a/src/qt/qvalidatedlineedit.h
+++ b/src/qt/qvalidatedlineedit.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/qvaluecombobox.cpp b/src/qt/qvaluecombobox.cpp
index 800436661f..2f2478783c 100644
--- a/src/qt/qvaluecombobox.cpp
+++ b/src/qt/qvaluecombobox.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -20,9 +20,9 @@ void QValueComboBox::setValue(const QVariant &value)
setCurrentIndex(findData(value, role));
}
-void QValueComboBox::setRole(int role)
+void QValueComboBox::setRole(int _role)
{
- this->role = role;
+ this->role = _role;
}
void QValueComboBox::handleSelectionChanged(int idx)
diff --git a/src/qt/qvaluecombobox.h b/src/qt/qvaluecombobox.h
index 5b20e6a5a4..f266302310 100644
--- a/src/qt/qvaluecombobox.h
+++ b/src/qt/qvaluecombobox.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/receivecoinsdialog.cpp b/src/qt/receivecoinsdialog.cpp
index e89f06484c..b50cad4975 100644
--- a/src/qt/receivecoinsdialog.cpp
+++ b/src/qt/receivecoinsdialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -22,24 +22,24 @@
#include <QScrollBar>
#include <QTextDocument>
-ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent) :
+ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
QDialog(parent),
ui(new Ui::ReceiveCoinsDialog),
model(0),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
ui->setupUi(this);
- if (!platformStyle->getImagesOnButtons()) {
+ if (!_platformStyle->getImagesOnButtons()) {
ui->clearButton->setIcon(QIcon());
ui->receiveButton->setIcon(QIcon());
ui->showRequestButton->setIcon(QIcon());
ui->removeRequestButton->setIcon(QIcon());
} else {
- ui->clearButton->setIcon(platformStyle->SingleColorIcon(":/icons/remove"));
- ui->receiveButton->setIcon(platformStyle->SingleColorIcon(":/icons/receiving_addresses"));
- ui->showRequestButton->setIcon(platformStyle->SingleColorIcon(":/icons/edit"));
- ui->removeRequestButton->setIcon(platformStyle->SingleColorIcon(":/icons/remove"));
+ ui->clearButton->setIcon(_platformStyle->SingleColorIcon(":/icons/remove"));
+ ui->receiveButton->setIcon(_platformStyle->SingleColorIcon(":/icons/receiving_addresses"));
+ ui->showRequestButton->setIcon(_platformStyle->SingleColorIcon(":/icons/edit"));
+ ui->removeRequestButton->setIcon(_platformStyle->SingleColorIcon(":/icons/remove"));
}
// context menu actions
@@ -65,26 +65,27 @@ ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *platformStyle, QWidg
connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear()));
}
-void ReceiveCoinsDialog::setModel(WalletModel *model)
+void ReceiveCoinsDialog::setModel(WalletModel *_model)
{
- this->model = model;
+ this->model = _model;
- if(model && model->getOptionsModel())
+ if(_model && _model->getOptionsModel())
{
- model->getRecentRequestsTableModel()->sort(RecentRequestsTableModel::Date, Qt::DescendingOrder);
- connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
+ _model->getRecentRequestsTableModel()->sort(RecentRequestsTableModel::Date, Qt::DescendingOrder);
+ connect(_model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
updateDisplayUnit();
QTableView* tableView = ui->recentRequestsView;
tableView->verticalHeader()->hide();
tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- tableView->setModel(model->getRecentRequestsTableModel());
+ tableView->setModel(_model->getRecentRequestsTableModel());
tableView->setAlternatingRowColors(true);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
tableView->setSelectionMode(QAbstractItemView::ContiguousSelection);
tableView->setColumnWidth(RecentRequestsTableModel::Date, DATE_COLUMN_WIDTH);
tableView->setColumnWidth(RecentRequestsTableModel::Label, LABEL_COLUMN_WIDTH);
+ tableView->setColumnWidth(RecentRequestsTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
connect(tableView->selectionModel(),
SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this,
diff --git a/src/qt/receivecoinsdialog.h b/src/qt/receivecoinsdialog.h
index 9612da318c..d137f1616e 100644
--- a/src/qt/receivecoinsdialog.h
+++ b/src/qt/receivecoinsdialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -36,7 +36,7 @@ public:
enum ColumnWidths {
DATE_COLUMN_WIDTH = 130,
LABEL_COLUMN_WIDTH = 120,
- AMOUNT_MINIMUM_COLUMN_WIDTH = 160,
+ AMOUNT_MINIMUM_COLUMN_WIDTH = 180,
MINIMUM_COLUMN_WIDTH = 130
};
diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/receiverequestdialog.cpp
index 0c4a20cf92..998c9176d7 100644
--- a/src/qt/receiverequestdialog.cpp
+++ b/src/qt/receiverequestdialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -45,7 +45,7 @@ QImage QRImageWidget::exportImage()
{
if(!pixmap())
return QImage();
- return pixmap()->toImage().scaled(EXPORT_IMAGE_SIZE, EXPORT_IMAGE_SIZE);
+ return pixmap()->toImage();
}
void QRImageWidget::mousePressEvent(QMouseEvent *event)
@@ -109,20 +109,20 @@ ReceiveRequestDialog::~ReceiveRequestDialog()
delete ui;
}
-void ReceiveRequestDialog::setModel(OptionsModel *model)
+void ReceiveRequestDialog::setModel(OptionsModel *_model)
{
- this->model = model;
+ this->model = _model;
- if (model)
- connect(model, SIGNAL(displayUnitChanged(int)), this, SLOT(update()));
+ if (_model)
+ connect(_model, SIGNAL(displayUnitChanged(int)), this, SLOT(update()));
// update the display unit if necessary
update();
}
-void ReceiveRequestDialog::setInfo(const SendCoinsRecipient &info)
+void ReceiveRequestDialog::setInfo(const SendCoinsRecipient &_info)
{
- this->info = info;
+ this->info = _info;
update();
}
@@ -144,7 +144,7 @@ void ReceiveRequestDialog::update()
html += "<a href=\""+uri+"\">" + GUIUtil::HtmlEscape(uri) + "</a><br>";
html += "<b>"+tr("Address")+"</b>: " + GUIUtil::HtmlEscape(info.address) + "<br>";
if(info.amount)
- html += "<b>"+tr("Amount")+"</b>: " + BitcoinUnits::formatWithUnit(model->getDisplayUnit(), info.amount) + "<br>";
+ html += "<b>"+tr("Amount")+"</b>: " + BitcoinUnits::formatHtmlWithUnit(model->getDisplayUnit(), info.amount) + "<br>";
if(!info.label.isEmpty())
html += "<b>"+tr("Label")+"</b>: " + GUIUtil::HtmlEscape(info.label) + "<br>";
if(!info.message.isEmpty())
@@ -166,20 +166,32 @@ void ReceiveRequestDialog::update()
ui->lblQRCode->setText(tr("Error encoding URI into QR Code."));
return;
}
- QImage myImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32);
- myImage.fill(0xffffff);
+ QImage qrImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32);
+ qrImage.fill(0xffffff);
unsigned char *p = code->data;
for (int y = 0; y < code->width; y++)
{
for (int x = 0; x < code->width; x++)
{
- myImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff));
+ qrImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff));
p++;
}
}
QRcode_free(code);
- ui->lblQRCode->setPixmap(QPixmap::fromImage(myImage).scaled(300, 300));
+ QImage qrAddrImage = QImage(QR_IMAGE_SIZE, QR_IMAGE_SIZE+20, QImage::Format_RGB32);
+ qrAddrImage.fill(0xffffff);
+ QPainter painter(&qrAddrImage);
+ painter.drawImage(0, 0, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE));
+ QFont font = GUIUtil::fixedPitchFont();
+ font.setPixelSize(12);
+ painter.setFont(font);
+ QRect paddedRect = qrAddrImage.rect();
+ paddedRect.setHeight(QR_IMAGE_SIZE+12);
+ painter.drawText(paddedRect, Qt::AlignBottom|Qt::AlignCenter, info.address);
+ painter.end();
+
+ ui->lblQRCode->setPixmap(QPixmap::fromImage(qrAddrImage));
ui->btnSaveAs->setEnabled(true);
}
}
diff --git a/src/qt/receiverequestdialog.h b/src/qt/receiverequestdialog.h
index 69f84ebbd7..676745a858 100644
--- a/src/qt/receiverequestdialog.h
+++ b/src/qt/receiverequestdialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -10,6 +10,7 @@
#include <QDialog>
#include <QImage>
#include <QLabel>
+#include <QPainter>
class OptionsModel;
diff --git a/src/qt/recentrequeststablemodel.cpp b/src/qt/recentrequeststablemodel.cpp
index 5692a7aaef..2335d6b282 100644
--- a/src/qt/recentrequeststablemodel.cpp
+++ b/src/qt/recentrequeststablemodel.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -83,7 +83,7 @@ QVariant RecentRequestsTableModel::data(const QModelIndex &index, int role) cons
}
case Amount:
if (rec->recipient.amount == 0 && role == Qt::DisplayRole)
- return tr("(no amount)");
+ return tr("(no amount requested)");
else if (role == Qt::EditRole)
return BitcoinUnits::format(walletModel->getOptionsModel()->getDisplayUnit(), rec->recipient.amount, false, BitcoinUnits::separatorNever);
else
@@ -125,12 +125,7 @@ void RecentRequestsTableModel::updateAmountColumnTitle()
/** Gets title for amount column including current display unit if optionsModel reference available. */
QString RecentRequestsTableModel::getAmountTitle()
{
- QString amountTitle = tr("Amount");
- if (this->walletModel->getOptionsModel() != NULL)
- {
- amountTitle += " ("+BitcoinUnits::name(this->walletModel->getOptionsModel()->getDisplayUnit()) + ")";
- }
- return amountTitle;
+ return (this->walletModel->getOptionsModel() != NULL) ? tr("Requested") + " ("+BitcoinUnits::name(this->walletModel->getOptionsModel()->getDisplayUnit()) + ")" : "";
}
QModelIndex RecentRequestsTableModel::index(int row, int column, const QModelIndex &parent) const
diff --git a/src/qt/recentrequeststablemodel.h b/src/qt/recentrequeststablemodel.h
index 64faa72d45..0193e748d7 100644
--- a/src/qt/recentrequeststablemodel.h
+++ b/src/qt/recentrequeststablemodel.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -31,7 +31,6 @@ public:
unsigned int nDate = date.toTime_t();
READWRITE(this->nVersion);
- nVersion = this->nVersion;
READWRITE(id);
READWRITE(nDate);
READWRITE(recipient);
diff --git a/src/qt/res/bitcoin-qt-res.rc b/src/qt/res/bitcoin-qt-res.rc
index 9f66d0af79..94ae256477 100644
--- a/src/qt/res/bitcoin-qt-res.rc
+++ b/src/qt/res/bitcoin-qt-res.rc
@@ -1,4 +1,5 @@
IDI_ICON1 ICON DISCARDABLE "icons/bitcoin.ico"
+IDI_ICON2 ICON DISCARDABLE "icons/bitcoin_testnet.ico"
#include <windows.h> // needed for VERSIONINFO
#include "../../clientversion.h" // holds the needed client version information
@@ -19,13 +20,13 @@ BEGIN
BLOCK "040904E4" // U.S. English - multilingual (hex)
BEGIN
VALUE "CompanyName", "Bitcoin"
- VALUE "FileDescription", "Bitcoin Core (GUI node for Bitcoin)"
+ VALUE "FileDescription", PACKAGE_NAME " (GUI node for Bitcoin)"
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", "bitcoin-qt"
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-qt.exe"
- VALUE "ProductName", "Bitcoin Core"
+ VALUE "ProductName", PACKAGE_NAME
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
diff --git a/src/qt/res/icons/about.png b/src/qt/res/icons/about.png
index 83eb3c07ee..4143be8bac 100644
--- a/src/qt/res/icons/about.png
+++ b/src/qt/res/icons/about.png
Binary files differ
diff --git a/src/qt/res/icons/bitcoin_testnet.ico b/src/qt/res/icons/bitcoin_testnet.ico
new file mode 100644
index 0000000000..909194ecd2
--- /dev/null
+++ b/src/qt/res/icons/bitcoin_testnet.ico
Binary files differ
diff --git a/src/qt/res/icons/chevron.png b/src/qt/res/icons/chevron.png
new file mode 100644
index 0000000000..2309fb38e2
--- /dev/null
+++ b/src/qt/res/icons/chevron.png
Binary files differ
diff --git a/src/qt/res/icons/fontbigger.png b/src/qt/res/icons/fontbigger.png
new file mode 100644
index 0000000000..5ca5c563b2
--- /dev/null
+++ b/src/qt/res/icons/fontbigger.png
Binary files differ
diff --git a/src/qt/res/icons/fontsmaller.png b/src/qt/res/icons/fontsmaller.png
new file mode 100644
index 0000000000..1a6bb3a61f
--- /dev/null
+++ b/src/qt/res/icons/fontsmaller.png
Binary files differ
diff --git a/src/qt/res/icons/hd_disabled.png b/src/qt/res/icons/hd_disabled.png
new file mode 100644
index 0000000000..687b6d2e38
--- /dev/null
+++ b/src/qt/res/icons/hd_disabled.png
Binary files differ
diff --git a/src/qt/res/icons/hd_enabled.png b/src/qt/res/icons/hd_enabled.png
new file mode 100644
index 0000000000..568dde1cd1
--- /dev/null
+++ b/src/qt/res/icons/hd_enabled.png
Binary files differ
diff --git a/src/qt/res/icons/transaction_abandoned.png b/src/qt/res/icons/transaction_abandoned.png
new file mode 100644
index 0000000000..8ca6445c20
--- /dev/null
+++ b/src/qt/res/icons/transaction_abandoned.png
Binary files differ
diff --git a/src/qt/res/movies/makespinner.sh b/src/qt/res/movies/makespinner.sh
index a4c2fddbbf..d0deb1238c 100755
--- a/src/qt/res/movies/makespinner.sh
+++ b/src/qt/res/movies/makespinner.sh
@@ -1,3 +1,7 @@
+# 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.
+
FRAMEDIR=$(dirname $0)
for i in {0..35}
do
diff --git a/src/qt/res/src/hd_disabled.svg b/src/qt/res/src/hd_disabled.svg
new file mode 100644
index 0000000000..035f4431c7
--- /dev/null
+++ b/src/qt/res/src/hd_disabled.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 595.3 841.9" enable-background="new 0 0 595.3 841.9" xml:space="preserve">
+<g>
+ <path d="M81.3,336.5v66.8h70.4v-66.8H190v174h-38.3v-75.1H81.3v75.1H43v-174H81.3z"/>
+ <path d="M298.7,336.5c11.2,0,21.6,1.8,31.3,5.4c9.7,3.6,18,8.9,25.1,16.1c7.1,7.2,12.6,16.1,16.6,26.8c4,10.7,6,23.3,6,37.8
+ c0,12.7-1.6,24.4-4.9,35.1c-3.3,10.7-8.2,20-14.7,27.8c-6.6,7.8-14.8,13.9-24.6,18.4c-9.8,4.5-21.4,6.7-34.7,6.7h-75.1v-174H298.7z
+ M296,478.3c5.5,0,10.9-0.9,16.1-2.7c5.2-1.8,9.8-4.8,13.9-8.9c4.1-4.1,7.3-9.5,9.7-16.2c2.4-6.7,3.7-14.8,3.7-24.4
+ c0-8.8-0.9-16.7-2.6-23.8s-4.5-13.1-8.4-18.2c-3.9-5-9.1-8.9-15.5-11.6c-6.4-2.7-14.3-4-23.8-4h-27.3v109.7H296z"/>
+</g>
+<g>
+ <g>
+ <line x1="32" y1="555.9" x2="358" y2="293.9"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M32,580.9c-7.3,0-14.6-3.2-19.5-9.3c-8.6-10.8-6.9-26.5,3.8-35.1l326-262c10.8-8.6,26.5-6.9,35.1,3.8
+ c8.6,10.8,6.9,26.5-3.8,35.1l-326,262C43,579.1,37.5,580.9,32,580.9z"/>
+ </g>
+ <g>
+ <path d="M32,573.9c-5.3,0-10.5-2.3-14-6.7c-6.2-7.7-5-19.1,2.8-25.3l326-262c7.8-6.2,19.1-5,25.3,2.8c6.2,7.7,5,19.1-2.8,25.3
+ l-326,262C40,572.6,36,573.9,32,573.9z"/>
+ </g>
+</g>
+</svg>
diff --git a/src/qt/res/src/hd_enabled.svg b/src/qt/res/src/hd_enabled.svg
new file mode 100644
index 0000000000..cbaa16f8f0
--- /dev/null
+++ b/src/qt/res/src/hd_enabled.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 595.3 841.9" enable-background="new 0 0 595.3 841.9" xml:space="preserve">
+<g>
+ <path d="M81.3,336.5v66.8h70.4v-66.8H190v174h-38.3v-75.1H81.3v75.1H43v-174H81.3z"/>
+ <path d="M298.7,336.5c11.2,0,21.6,1.8,31.3,5.4c9.7,3.6,18,8.9,25.1,16.1c7.1,7.2,12.6,16.1,16.6,26.8c4,10.7,6,23.3,6,37.8
+ c0,12.7-1.6,24.4-4.9,35.1c-3.3,10.7-8.2,20-14.7,27.8c-6.6,7.8-14.8,13.9-24.6,18.4c-9.8,4.5-21.4,6.7-34.7,6.7h-75.1v-174H298.7z
+ M296,478.3c5.5,0,10.9-0.9,16.1-2.7c5.2-1.8,9.8-4.8,13.9-8.9c4.1-4.1,7.3-9.5,9.7-16.2c2.4-6.7,3.7-14.8,3.7-24.4
+ c0-8.8-0.9-16.7-2.6-23.8s-4.5-13.1-8.4-18.2c-3.9-5-9.1-8.9-15.5-11.6c-6.4-2.7-14.3-4-23.8-4h-27.3v109.7H296z"/>
+</g>
+</svg>
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index 30e551de19..b6ed75535c 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -1,7 +1,11 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "rpcconsole.h"
#include "ui_debugwindow.h"
@@ -12,8 +16,9 @@
#include "bantablemodel.h"
#include "chainparams.h"
-#include "rpcserver.h"
-#include "rpcclient.h"
+#include "netbase.h"
+#include "rpc/server.h"
+#include "rpc/client.h"
#include "util.h"
#include <openssl/crypto.h>
@@ -27,10 +32,12 @@
#include <QKeyEvent>
#include <QMenu>
#include <QScrollBar>
+#include <QSettings>
#include <QSignalMapper>
#include <QThread>
#include <QTime>
#include <QTimer>
+#include <QStringList>
#if QT_VERSION < 0x050000
#include <QUrl>
@@ -41,9 +48,9 @@
// TODO: receive errors and debug messages through ClientModel
const int CONSOLE_HISTORY = 50;
-const QSize ICON_SIZE(24, 24);
-
const int INITIAL_TRAFFIC_GRAPH_MINS = 30;
+const QSize FONT_RANGE(4, 40);
+const char fontSizeSettingsKey[] = "consoleFontSize";
const struct {
const char *url;
@@ -76,8 +83,8 @@ class QtRPCTimerBase: public QObject, public RPCTimerBase
{
Q_OBJECT
public:
- QtRPCTimerBase(boost::function<void(void)>& func, int64_t millis):
- func(func)
+ QtRPCTimerBase(boost::function<void(void)>& _func, int64_t millis):
+ func(_func)
{
timer.setSingleShot(true);
connect(&timer, SIGNAL(timeout()), this, SLOT(timeout()));
@@ -106,9 +113,11 @@ public:
#include "rpcconsole.moc"
/**
- * Split shell command line into a list of arguments. Aims to emulate \c bash and friends.
+ * Split shell command line into a list of arguments and execute the command(s).
+ * Aims to emulate \c bash and friends.
*
- * - Arguments are delimited with whitespace
+ * - Command nesting is possible with brackets [example: validateaddress(getnewaddress())]
+ * - Arguments are delimited with whitespace or comma
* - Extra whitespace at the beginning and end and between arguments will be ignored
* - Text can be "double" or 'single' quoted
* - The backslash \c \ is used as escape character
@@ -116,11 +125,15 @@ public:
* - Within double quotes, only escape \c " and backslashes before a \c " or another backslash
* - Within single quotes, no escaping is possible and no special interpretation takes place
*
- * @param[out] args Parsed arguments will be appended to this list
+ * @param[out] result stringified Result from the executed command(chain)
* @param[in] strCommand Command line to split
*/
-bool parseCommandLine(std::vector<std::string> &args, const std::string &strCommand)
+
+bool RPCConsole::RPCExecuteCommandLine(std::string &strResult, const std::string &strCommand)
{
+ std::vector< std::vector<std::string> > stack;
+ stack.push_back(std::vector<std::string>());
+
enum CmdParseState
{
STATE_EATING_SPACES,
@@ -128,95 +141,180 @@ bool parseCommandLine(std::vector<std::string> &args, const std::string &strComm
STATE_SINGLEQUOTED,
STATE_DOUBLEQUOTED,
STATE_ESCAPE_OUTER,
- STATE_ESCAPE_DOUBLEQUOTED
+ STATE_ESCAPE_DOUBLEQUOTED,
+ STATE_COMMAND_EXECUTED,
+ STATE_COMMAND_EXECUTED_INNER
} state = STATE_EATING_SPACES;
std::string curarg;
- Q_FOREACH(char ch, strCommand)
+ UniValue lastResult;
+
+ std::string strCommandTerminated = strCommand;
+ if (strCommandTerminated.back() != '\n')
+ strCommandTerminated += "\n";
+ for(char ch: strCommandTerminated)
{
switch(state)
{
- case STATE_ARGUMENT: // In or after argument
- case STATE_EATING_SPACES: // Handle runs of whitespace
- switch(ch)
+ case STATE_COMMAND_EXECUTED_INNER:
+ case STATE_COMMAND_EXECUTED:
{
- case '"': state = STATE_DOUBLEQUOTED; break;
- case '\'': state = STATE_SINGLEQUOTED; break;
- case '\\': state = STATE_ESCAPE_OUTER; break;
- case ' ': case '\n': case '\t':
- if(state == STATE_ARGUMENT) // Space ends argument
+ bool breakParsing = true;
+ switch(ch)
{
- args.push_back(curarg);
- curarg.clear();
+ case '[': curarg.clear(); state = STATE_COMMAND_EXECUTED_INNER; break;
+ default:
+ if (state == STATE_COMMAND_EXECUTED_INNER)
+ {
+ if (ch != ']')
+ {
+ // append char to the current argument (which is also used for the query command)
+ curarg += ch;
+ break;
+ }
+ if (curarg.size())
+ {
+ // if we have a value query, query arrays with index and objects with a string key
+ UniValue subelement;
+ if (lastResult.isArray())
+ {
+ for(char argch: curarg)
+ if (!std::isdigit(argch))
+ throw std::runtime_error("Invalid result query");
+ subelement = lastResult[atoi(curarg.c_str())];
+ }
+ else if (lastResult.isObject())
+ subelement = find_value(lastResult, curarg);
+ else
+ throw std::runtime_error("Invalid result query"); //no array or object: abort
+ lastResult = subelement;
+ }
+
+ state = STATE_COMMAND_EXECUTED;
+ break;
+ }
+ // don't break parsing when the char is required for the next argument
+ breakParsing = false;
+
+ // pop the stack and return the result to the current command arguments
+ stack.pop_back();
+
+ // don't stringify the json in case of a string to avoid doublequotes
+ if (lastResult.isStr())
+ curarg = lastResult.get_str();
+ else
+ curarg = lastResult.write(2);
+
+ // if we have a non empty result, use it as stack argument otherwise as general result
+ if (curarg.size())
+ {
+ if (stack.size())
+ stack.back().push_back(curarg);
+ else
+ strResult = curarg;
+ }
+ curarg.clear();
+ // assume eating space state
+ state = STATE_EATING_SPACES;
}
- state = STATE_EATING_SPACES;
- break;
- default: curarg += ch; state = STATE_ARGUMENT;
+ if (breakParsing)
+ break;
}
- break;
- case STATE_SINGLEQUOTED: // Single-quoted string
- switch(ch)
+ case STATE_ARGUMENT: // In or after argument
+ case STATE_EATING_SPACES: // Handle runs of whitespace
+ switch(ch)
{
- case '\'': state = STATE_ARGUMENT; break;
- default: curarg += ch;
+ case '"': state = STATE_DOUBLEQUOTED; break;
+ case '\'': state = STATE_SINGLEQUOTED; break;
+ case '\\': state = STATE_ESCAPE_OUTER; break;
+ case '(': case ')': case '\n':
+ if (state == STATE_ARGUMENT)
+ {
+ if (ch == '(' && stack.size() && stack.back().size() > 0)
+ stack.push_back(std::vector<std::string>());
+ if (curarg.size())
+ {
+ // don't allow commands after executed commands on baselevel
+ if (!stack.size())
+ throw std::runtime_error("Invalid Syntax");
+ stack.back().push_back(curarg);
+ }
+ curarg.clear();
+ state = STATE_EATING_SPACES;
+ }
+ if ((ch == ')' || ch == '\n') && stack.size() > 0)
+ {
+ std::string strPrint;
+ // Convert argument list to JSON objects in method-dependent way,
+ // and pass it along with the method name to the dispatcher.
+ lastResult = tableRPC.execute(stack.back()[0], RPCConvertValues(stack.back()[0], std::vector<std::string>(stack.back().begin() + 1, stack.back().end())));
+
+ state = STATE_COMMAND_EXECUTED;
+ curarg.clear();
+ }
+ break;
+ case ' ': case ',': case '\t':
+ if(state == STATE_ARGUMENT) // Space ends argument
+ {
+ if (curarg.size())
+ stack.back().push_back(curarg);
+ curarg.clear();
+ }
+ state = STATE_EATING_SPACES;
+ break;
+ default: curarg += ch; state = STATE_ARGUMENT;
}
- break;
- case STATE_DOUBLEQUOTED: // Double-quoted string
- switch(ch)
+ break;
+ case STATE_SINGLEQUOTED: // Single-quoted string
+ switch(ch)
{
- case '"': state = STATE_ARGUMENT; break;
- case '\\': state = STATE_ESCAPE_DOUBLEQUOTED; break;
- default: curarg += ch;
+ case '\'': state = STATE_ARGUMENT; break;
+ default: curarg += ch;
}
- break;
- case STATE_ESCAPE_OUTER: // '\' outside quotes
- curarg += ch; state = STATE_ARGUMENT;
- break;
- case STATE_ESCAPE_DOUBLEQUOTED: // '\' in double-quoted text
- if(ch != '"' && ch != '\\') curarg += '\\'; // keep '\' for everything but the quote and '\' itself
- curarg += ch; state = STATE_DOUBLEQUOTED;
- break;
+ break;
+ case STATE_DOUBLEQUOTED: // Double-quoted string
+ switch(ch)
+ {
+ case '"': state = STATE_ARGUMENT; break;
+ case '\\': state = STATE_ESCAPE_DOUBLEQUOTED; break;
+ default: curarg += ch;
+ }
+ break;
+ case STATE_ESCAPE_OUTER: // '\' outside quotes
+ curarg += ch; state = STATE_ARGUMENT;
+ break;
+ case STATE_ESCAPE_DOUBLEQUOTED: // '\' in double-quoted text
+ if(ch != '"' && ch != '\\') curarg += '\\'; // keep '\' for everything but the quote and '\' itself
+ curarg += ch; state = STATE_DOUBLEQUOTED;
+ break;
}
}
switch(state) // final state
{
- case STATE_EATING_SPACES:
- return true;
- case STATE_ARGUMENT:
- args.push_back(curarg);
- return true;
- default: // ERROR to end in one of the other states
- return false;
+ case STATE_COMMAND_EXECUTED:
+ if (lastResult.isStr())
+ strResult = lastResult.get_str();
+ else
+ strResult = lastResult.write(2);
+ case STATE_ARGUMENT:
+ case STATE_EATING_SPACES:
+ return true;
+ default: // ERROR to end in one of the other states
+ return false;
}
}
void RPCExecutor::request(const QString &command)
{
- std::vector<std::string> args;
- if(!parseCommandLine(args, command.toStdString()))
- {
- Q_EMIT reply(RPCConsole::CMD_ERROR, QString("Parse error: unbalanced ' or \""));
- return;
- }
- if(args.empty())
- return; // Nothing to do
try
{
- std::string strPrint;
- // Convert argument list to JSON objects in method-dependent way,
- // and pass it along with the method name to the dispatcher.
- UniValue result = tableRPC.execute(
- args[0],
- RPCConvertValues(args[0], std::vector<std::string>(args.begin() + 1, args.end())));
-
- // Format result reply
- if (result.isNull())
- strPrint = "";
- else if (result.isStr())
- strPrint = result.get_str();
- else
- strPrint = result.write(2);
-
- Q_EMIT reply(RPCConsole::CMD_REPLY, QString::fromStdString(strPrint));
+ std::string result;
+ std::string executableCommand = command.toStdString() + "\n";
+ if(!RPCConsole::RPCExecuteCommandLine(result, executableCommand))
+ {
+ Q_EMIT reply(RPCConsole::CMD_ERROR, QString("Parse error: unbalanced ' or \""));
+ return;
+ }
+ Q_EMIT reply(RPCConsole::CMD_REPLY, QString::fromStdString(result));
}
catch (UniValue& objError)
{
@@ -237,39 +335,39 @@ void RPCExecutor::request(const QString &command)
}
}
-RPCConsole::RPCConsole(const PlatformStyle *platformStyle, QWidget *parent) :
+RPCConsole::RPCConsole(const PlatformStyle *_platformStyle, QWidget *parent) :
QWidget(parent),
ui(new Ui::RPCConsole),
clientModel(0),
historyPtr(0),
cachedNodeid(-1),
- platformStyle(platformStyle),
+ platformStyle(_platformStyle),
peersTableContextMenu(0),
- banTableContextMenu(0)
+ banTableContextMenu(0),
+ consoleFontSize(0)
{
ui->setupUi(this);
GUIUtil::restoreWindowGeometry("nRPCConsoleWindow", this->size(), this);
+ ui->openDebugLogfileButton->setToolTip(ui->openDebugLogfileButton->toolTip().arg(tr(PACKAGE_NAME)));
+
if (platformStyle->getImagesOnButtons()) {
ui->openDebugLogfileButton->setIcon(platformStyle->SingleColorIcon(":/icons/export"));
}
ui->clearButton->setIcon(platformStyle->SingleColorIcon(":/icons/remove"));
+ ui->fontBiggerButton->setIcon(platformStyle->SingleColorIcon(":/icons/fontbigger"));
+ ui->fontSmallerButton->setIcon(platformStyle->SingleColorIcon(":/icons/fontsmaller"));
// Install event filter for up and down arrow
ui->lineEdit->installEventFilter(this);
ui->messagesWidget->installEventFilter(this);
connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear()));
+ connect(ui->fontBiggerButton, SIGNAL(clicked()), this, SLOT(fontBigger()));
+ connect(ui->fontSmallerButton, SIGNAL(clicked()), this, SLOT(fontSmaller()));
connect(ui->btnClearTrafficGraph, SIGNAL(clicked()), ui->trafficGraph, SLOT(clear()));
// set library version labels
-
-#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
- ui->openSSLVersion->setText(SSLeay_version(SSLEAY_VERSION));
-#else
- ui->openSSLVersion->setText(OpenSSL_version(OPENSSL_VERSION));
-#endif
-
#ifdef ENABLE_WALLET
ui->berkeleyDBVersion->setText(DbEnv::version(0, 0, 0));
#else
@@ -278,7 +376,9 @@ RPCConsole::RPCConsole(const PlatformStyle *platformStyle, QWidget *parent) :
#endif
// Register RPC timer interface
rpcTimerInterface = new QtRPCTimerInterface();
- RPCRegisterTimerInterface(rpcTimerInterface);
+ // avoid accidentally overwriting an existing, non QTThread
+ // based timer interface
+ RPCSetTimerInterfaceIfUnset(rpcTimerInterface);
startExecutor();
setTrafficGraphRange(INITIAL_TRAFFIC_GRAPH_MINS);
@@ -286,6 +386,8 @@ RPCConsole::RPCConsole(const PlatformStyle *platformStyle, QWidget *parent) :
ui->detailWidget->hide();
ui->peerHeading->setText(tr("Select a peer to view detailed information."));
+ QSettings settings;
+ consoleFontSize = settings.value(fontSizeSettingsKey, QFontInfo(QFont()).pointSize()).toInt();
clear();
}
@@ -293,7 +395,7 @@ RPCConsole::~RPCConsole()
{
GUIUtil::saveWindowGeometry("nRPCConsoleWindow", this);
Q_EMIT stopExecutor();
- RPCUnregisterTimerInterface(rpcTimerInterface);
+ RPCUnsetTimerInterface(rpcTimerInterface);
delete rpcTimerInterface;
delete ui;
}
@@ -317,6 +419,14 @@ bool RPCConsole::eventFilter(QObject* obj, QEvent *event)
return true;
}
break;
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+ // forward these events to lineEdit
+ if(obj == autoCompleter->popup()) {
+ QApplication::postEvent(ui->lineEdit, new QKeyEvent(*keyevt));
+ return true;
+ }
+ break;
default:
// Typing in messages widget brings focus to line edit, and redirects key there
// Exclude most combinations and keys that emit no text, except paste shortcuts
@@ -343,8 +453,8 @@ void RPCConsole::setClientModel(ClientModel *model)
setNumConnections(model->getNumConnections());
connect(model, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
- setNumBlocks(model->getNumBlocks(), model->getLastBlockDate(), model->getVerificationProgress(NULL));
- connect(model, SIGNAL(numBlocksChanged(int,QDateTime,double)), this, SLOT(setNumBlocks(int,QDateTime,double)));
+ setNumBlocks(model->getNumBlocks(), model->getLastBlockDate(), model->getVerificationProgress(NULL), false);
+ connect(model, SIGNAL(numBlocksChanged(int,QDateTime,double,bool)), this, SLOT(setNumBlocks(int,QDateTime,double,bool)));
updateTrafficStats(model->getTotalBytesRecv(), model->getTotalBytesSent());
connect(model, SIGNAL(bytesChanged(quint64,quint64)), this, SLOT(updateTrafficStats(quint64, quint64)));
@@ -433,10 +543,21 @@ void RPCConsole::setClientModel(ClientModel *model)
// Provide initial values
ui->clientVersion->setText(model->formatFullVersion());
ui->clientUserAgent->setText(model->formatSubVersion());
- ui->clientName->setText(model->clientName());
- ui->buildDate->setText(model->formatBuildDate());
+ ui->dataDir->setText(model->dataDir());
ui->startupTime->setText(model->formatClientStartupTime());
ui->networkName->setText(QString::fromStdString(Params().NetworkIDString()));
+
+ //Setup autocomplete and attach it
+ QStringList wordList;
+ std::vector<std::string> commandList = tableRPC.listCommands();
+ for (size_t i = 0; i < commandList.size(); ++i)
+ {
+ wordList << commandList[i].c_str();
+ }
+
+ autoCompleter = new QCompleter(wordList, this);
+ ui->lineEdit->setCompleter(autoCompleter);
+ autoCompleter->popup()->installEventFilter(this);
}
}
@@ -451,11 +572,49 @@ static QString categoryClass(int category)
}
}
-void RPCConsole::clear()
+void RPCConsole::fontBigger()
+{
+ setFontSize(consoleFontSize+1);
+}
+
+void RPCConsole::fontSmaller()
+{
+ setFontSize(consoleFontSize-1);
+}
+
+void RPCConsole::setFontSize(int newSize)
+{
+ QSettings settings;
+
+ //don't allow a insane font size
+ if (newSize < FONT_RANGE.width() || newSize > FONT_RANGE.height())
+ return;
+
+ // temp. store the console content
+ QString str = ui->messagesWidget->toHtml();
+
+ // replace font tags size in current content
+ str.replace(QString("font-size:%1pt").arg(consoleFontSize), QString("font-size:%1pt").arg(newSize));
+
+ // store the new font size
+ consoleFontSize = newSize;
+ settings.setValue(fontSizeSettingsKey, consoleFontSize);
+
+ // clear console (reset icon sizes, default stylesheet) and re-add the content
+ float oldPosFactor = 1.0 / ui->messagesWidget->verticalScrollBar()->maximum() * ui->messagesWidget->verticalScrollBar()->value();
+ clear(false);
+ ui->messagesWidget->setHtml(str);
+ ui->messagesWidget->verticalScrollBar()->setValue(oldPosFactor * ui->messagesWidget->verticalScrollBar()->maximum());
+}
+
+void RPCConsole::clear(bool clearHistory)
{
ui->messagesWidget->clear();
- history.clear();
- historyPtr = 0;
+ if(clearHistory)
+ {
+ history.clear();
+ historyPtr = 0;
+ }
ui->lineEdit->clear();
ui->lineEdit->setFocus();
@@ -466,25 +625,23 @@ void RPCConsole::clear()
ui->messagesWidget->document()->addResource(
QTextDocument::ImageResource,
QUrl(ICON_MAPPING[i].url),
- platformStyle->SingleColorImage(ICON_MAPPING[i].source).scaled(ICON_SIZE, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+ platformStyle->SingleColorImage(ICON_MAPPING[i].source).scaled(QSize(consoleFontSize*2, consoleFontSize*2), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
}
// Set default style sheet
QFontInfo fixedFontInfo(GUIUtil::fixedPitchFont());
- // Try to make fixed font adequately large on different OS
- QString ptSize = QString("%1pt").arg(QFontInfo(QFont()).pointSize() * 8.5 / 9);
ui->messagesWidget->document()->setDefaultStyleSheet(
QString(
"table { }"
- "td.time { color: #808080; padding-top: 3px; } "
+ "td.time { color: #808080; font-size: %2; padding-top: 3px; } "
"td.message { font-family: %1; font-size: %2; white-space:pre-wrap; } "
"td.cmd-request { color: #006060; } "
"td.cmd-error { color: red; } "
"b { color: #006060; } "
- ).arg(fixedFontInfo.family(), ptSize)
+ ).arg(fixedFontInfo.family(), QString("%1pt").arg(consoleFontSize))
);
- message(CMD_REPLY, (tr("Welcome to the Bitcoin Core RPC console.") + "<br>" +
+ message(CMD_REPLY, (tr("Welcome to the %1 RPC console.").arg(tr(PACKAGE_NAME)) + "<br>" +
tr("Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen.") + "<br>" +
tr("Type <b>help</b> for an overview of available commands.")), true);
}
@@ -525,10 +682,12 @@ void RPCConsole::setNumConnections(int count)
ui->numberOfConnections->setText(connections);
}
-void RPCConsole::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress)
+void RPCConsole::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers)
{
- ui->numberOfBlocks->setText(QString::number(count));
- ui->lastBlockTime->setText(blockDate.toString());
+ if (!headers) {
+ ui->numberOfBlocks->setText(QString::number(count));
+ ui->lastBlockTime->setText(blockDate.toString());
+ }
}
void RPCConsole::setMempoolSize(long numberOfTxs, size_t dynUsage)
@@ -808,33 +967,32 @@ void RPCConsole::showBanTableContextMenu(const QPoint& point)
void RPCConsole::disconnectSelectedNode()
{
+ if(!g_connman)
+ return;
// Get currently selected peer address
- QString strNode = GUIUtil::getEntryData(ui->peerWidget, 0, PeerTableModel::Address);
+ NodeId id = GUIUtil::getEntryData(ui->peerWidget, 0, PeerTableModel::NetNodeId).toInt();
// Find the node, disconnect it and clear the selected node
- if (CNode *bannedNode = FindNode(strNode.toStdString())) {
- bannedNode->fDisconnect = true;
+ if(g_connman->DisconnectNode(id))
clearSelectedNode();
- }
}
void RPCConsole::banSelectedNode(int bantime)
{
- if (!clientModel)
+ if (!clientModel || !g_connman)
return;
- // Get currently selected peer address
- QString strNode = GUIUtil::getEntryData(ui->peerWidget, 0, PeerTableModel::Address);
- // Find possible nodes, ban it and clear the selected node
- if (CNode *bannedNode = FindNode(strNode.toStdString())) {
- std::string nStr = strNode.toStdString();
- std::string addr;
- int port = 0;
- SplitHostPort(nStr, port, addr);
+ if(cachedNodeid == -1)
+ return;
- CNode::Ban(CNetAddr(addr), BanReasonManuallyAdded, bantime);
- bannedNode->fDisconnect = true;
- DumpBanlist();
+ // Get currently selected peer address
+ int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(cachedNodeid);
+ if(detailNodeRow < 0)
+ return;
+ // Find possible nodes, ban it and clear the selected node
+ const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
+ if(stats) {
+ g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime);
clearSelectedNode();
clientModel->getBanTableModel()->refresh();
}
@@ -846,13 +1004,13 @@ void RPCConsole::unbanSelectedNode()
return;
// Get currently selected ban address
- QString strNode = GUIUtil::getEntryData(ui->banlistWidget, 0, BanTableModel::Address);
- CSubNet possibleSubnet(strNode.toStdString());
+ QString strNode = GUIUtil::getEntryData(ui->banlistWidget, 0, BanTableModel::Address).toString();
+ CSubNet possibleSubnet;
- if (possibleSubnet.IsValid())
+ LookupSubNet(strNode.toStdString().c_str(), possibleSubnet);
+ if (possibleSubnet.IsValid() && g_connman)
{
- CNode::Unban(possibleSubnet);
- DumpBanlist();
+ g_connman->Unban(possibleSubnet);
clientModel->getBanTableModel()->refresh();
}
}
diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h
index 4aebad480c..50224a1cc0 100644
--- a/src/qt/rpcconsole.h
+++ b/src/qt/rpcconsole.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -11,6 +11,7 @@
#include "net.h"
#include <QWidget>
+#include <QCompleter>
class ClientModel;
class PlatformStyle;
@@ -34,6 +35,8 @@ public:
explicit RPCConsole(const PlatformStyle *platformStyle, QWidget *parent);
~RPCConsole();
+ static bool RPCExecuteCommandLine(std::string &strResult, const std::string &strCommand);
+
void setClientModel(ClientModel *model);
enum MessageClass {
@@ -77,13 +80,16 @@ private Q_SLOTS:
void clearSelectedNode();
public Q_SLOTS:
- void clear();
+ void clear(bool clearHistory = true);
+ void fontBigger();
+ void fontSmaller();
+ void setFontSize(int newSize);
/** Append the message to the message widget */
void message(int category, const QString &message, bool html = false);
/** Set number of connections shown in the UI */
void setNumConnections(int count);
/** Set number of blocks and last block date shown in the UI */
- void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress);
+ void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers);
/** Set size (number of transactions and memory usage) of the mempool in the UI */
void setMempoolSize(long numberOfTxs, size_t dynUsage);
/** Go forward or back in history */
@@ -118,7 +124,7 @@ private:
enum ColumnWidths
{
ADDRESS_COLUMN_WIDTH = 200,
- SUBVERSION_COLUMN_WIDTH = 100,
+ SUBVERSION_COLUMN_WIDTH = 150,
PING_COLUMN_WIDTH = 80,
BANSUBNET_COLUMN_WIDTH = 200,
BANTIME_COLUMN_WIDTH = 250
@@ -134,6 +140,8 @@ private:
RPCTimerInterface *rpcTimerInterface;
QMenu *peersTableContextMenu;
QMenu *banTableContextMenu;
+ int consoleFontSize;
+ QCompleter *autoCompleter;
};
#endif // BITCOIN_QT_RPCCONSOLE_H
diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp
index ec4e598bf9..4b2ba7d624 100644
--- a/src/qt/sendcoinsdialog.cpp
+++ b/src/qt/sendcoinsdialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -26,26 +26,29 @@
#include <QScrollBar>
#include <QSettings>
#include <QTextDocument>
+#include <QTimer>
-SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent) :
+#define SEND_CONFIRM_DELAY 3
+
+SendCoinsDialog::SendCoinsDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
QDialog(parent),
ui(new Ui::SendCoinsDialog),
clientModel(0),
model(0),
fNewRecipientAllowed(true),
fFeeMinimized(true),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
ui->setupUi(this);
- if (!platformStyle->getImagesOnButtons()) {
+ if (!_platformStyle->getImagesOnButtons()) {
ui->addButton->setIcon(QIcon());
ui->clearButton->setIcon(QIcon());
ui->sendButton->setIcon(QIcon());
} else {
- ui->addButton->setIcon(platformStyle->SingleColorIcon(":/icons/add"));
- ui->clearButton->setIcon(platformStyle->SingleColorIcon(":/icons/remove"));
- ui->sendButton->setIcon(platformStyle->SingleColorIcon(":/icons/send"));
+ ui->addButton->setIcon(_platformStyle->SingleColorIcon(":/icons/add"));
+ ui->clearButton->setIcon(_platformStyle->SingleColorIcon(":/icons/remove"));
+ ui->sendButton->setIcon(_platformStyle->SingleColorIcon(":/icons/send"));
}
GUIUtil::setupAddressWidget(ui->lineEditCoinControlChange, this);
@@ -66,7 +69,6 @@ SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *pa
QAction *clipboardFeeAction = new QAction(tr("Copy fee"), this);
QAction *clipboardAfterFeeAction = new QAction(tr("Copy after fee"), this);
QAction *clipboardBytesAction = new QAction(tr("Copy bytes"), this);
- QAction *clipboardPriorityAction = new QAction(tr("Copy priority"), this);
QAction *clipboardLowOutputAction = new QAction(tr("Copy dust"), this);
QAction *clipboardChangeAction = new QAction(tr("Copy change"), this);
connect(clipboardQuantityAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardQuantity()));
@@ -74,7 +76,6 @@ SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *pa
connect(clipboardFeeAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardFee()));
connect(clipboardAfterFeeAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardAfterFee()));
connect(clipboardBytesAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardBytes()));
- connect(clipboardPriorityAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardPriority()));
connect(clipboardLowOutputAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardLowOutput()));
connect(clipboardChangeAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardChange()));
ui->labelCoinControlQuantity->addAction(clipboardQuantityAction);
@@ -82,7 +83,6 @@ SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *pa
ui->labelCoinControlFee->addAction(clipboardFeeAction);
ui->labelCoinControlAfterFee->addAction(clipboardAfterFeeAction);
ui->labelCoinControlBytes->addAction(clipboardBytesAction);
- ui->labelCoinControlPriority->addAction(clipboardPriorityAction);
ui->labelCoinControlLowOutput->addAction(clipboardLowOutputAction);
ui->labelCoinControlChange->addAction(clipboardChangeAction);
@@ -104,8 +104,6 @@ SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *pa
settings.setValue("nTransactionFee", (qint64)DEFAULT_TRANSACTION_FEE);
if (!settings.contains("fPayOnlyMinFee"))
settings.setValue("fPayOnlyMinFee", false);
- if (!settings.contains("fSendFreeTransactions"))
- settings.setValue("fSendFreeTransactions", false);
ui->groupFee->setId(ui->radioSmartFee, 0);
ui->groupFee->setId(ui->radioCustomFee, 1);
ui->groupFee->button((int)std::max(0, std::min(1, settings.value("nFeeRadio").toInt())))->setChecked(true);
@@ -115,44 +113,43 @@ SendCoinsDialog::SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *pa
ui->sliderSmartFee->setValue(settings.value("nSmartFeeSliderPosition").toInt());
ui->customFee->setValue(settings.value("nTransactionFee").toLongLong());
ui->checkBoxMinimumFee->setChecked(settings.value("fPayOnlyMinFee").toBool());
- ui->checkBoxFreeTx->setChecked(settings.value("fSendFreeTransactions").toBool());
minimizeFeeSection(settings.value("fFeeSectionMinimized").toBool());
}
-void SendCoinsDialog::setClientModel(ClientModel *clientModel)
+void SendCoinsDialog::setClientModel(ClientModel *_clientModel)
{
- this->clientModel = clientModel;
+ this->clientModel = _clientModel;
- if (clientModel) {
- connect(clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double)), this, SLOT(updateSmartFeeLabel()));
+ if (_clientModel) {
+ connect(_clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double,bool)), this, SLOT(updateSmartFeeLabel()));
}
}
-void SendCoinsDialog::setModel(WalletModel *model)
+void SendCoinsDialog::setModel(WalletModel *_model)
{
- this->model = model;
+ this->model = _model;
- if(model && model->getOptionsModel())
+ if(_model && _model->getOptionsModel())
{
for(int i = 0; i < ui->entries->count(); ++i)
{
SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
if(entry)
{
- entry->setModel(model);
+ entry->setModel(_model);
}
}
- setBalance(model->getBalance(), model->getUnconfirmedBalance(), model->getImmatureBalance(),
- model->getWatchBalance(), model->getWatchUnconfirmedBalance(), model->getWatchImmatureBalance());
- connect(model, SIGNAL(balanceChanged(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)), this, SLOT(setBalance(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)));
- connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
+ setBalance(_model->getBalance(), _model->getUnconfirmedBalance(), _model->getImmatureBalance(),
+ _model->getWatchBalance(), _model->getWatchUnconfirmedBalance(), _model->getWatchImmatureBalance());
+ connect(_model, SIGNAL(balanceChanged(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)), this, SLOT(setBalance(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)));
+ connect(_model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
updateDisplayUnit();
// Coin Control
- connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(coinControlUpdateLabels()));
- connect(model->getOptionsModel(), SIGNAL(coinControlFeaturesChanged(bool)), this, SLOT(coinControlFeatureChanged(bool)));
- ui->frameCoinControl->setVisible(model->getOptionsModel()->getCoinControlFeatures());
+ connect(_model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(coinControlUpdateLabels()));
+ connect(_model->getOptionsModel(), SIGNAL(coinControlFeaturesChanged(bool)), this, SLOT(coinControlFeatureChanged(bool)));
+ ui->frameCoinControl->setVisible(_model->getOptionsModel()->getCoinControlFeatures());
coinControlUpdateLabels();
// fee section
@@ -170,8 +167,6 @@ void SendCoinsDialog::setModel(WalletModel *model)
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(updateFeeSectionControls()));
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(updateGlobalFeeVariables()));
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(coinControlUpdateLabels()));
- connect(ui->checkBoxFreeTx, SIGNAL(stateChanged(int)), this, SLOT(updateGlobalFeeVariables()));
- connect(ui->checkBoxFreeTx, SIGNAL(stateChanged(int)), this, SLOT(coinControlUpdateLabels()));
ui->customFee->setSingleStep(CWallet::GetRequiredFee(1000));
updateFeeSectionControls();
updateMinFeeLabel();
@@ -189,7 +184,6 @@ SendCoinsDialog::~SendCoinsDialog()
settings.setValue("nSmartFeeSliderPosition", ui->sliderSmartFee->value());
settings.setValue("nTransactionFee", (qint64)ui->customFee->value());
settings.setValue("fPayOnlyMinFee", ui->checkBoxMinimumFee->isChecked());
- settings.setValue("fSendFreeTransactions", ui->checkBoxFreeTx->isChecked());
delete ui;
}
@@ -317,10 +311,10 @@ void SendCoinsDialog::on_sendButton_clicked()
questionString.append(QString("<span style='font-size:10pt;font-weight:normal;'><br />(=%2)</span>")
.arg(alternativeUnits.join(" " + tr("or") + "<br />")));
- QMessageBox::StandardButton retval = QMessageBox::question(this, tr("Confirm send coins"),
- questionString.arg(formatted.join("<br />")),
- QMessageBox::Yes | QMessageBox::Cancel,
- QMessageBox::Cancel);
+ SendConfirmationDialog confirmationDialog(tr("Confirm send coins"),
+ questionString.arg(formatted.join("<br />")), SEND_CONFIRM_DELAY, this);
+ confirmationDialog.exec();
+ QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result();
if(retval != QMessageBox::Yes)
{
@@ -373,8 +367,6 @@ SendCoinsEntry *SendCoinsDialog::addEntry()
connect(entry, SIGNAL(payAmountChanged()), this, SLOT(coinControlUpdateLabels()));
connect(entry, SIGNAL(subtractFeeFromAmountChanged()), this, SLOT(coinControlUpdateLabels()));
- updateTabsAndLabels();
-
// Focus the field, so that entry can start immediately
entry->clear();
entry->setFocus();
@@ -383,6 +375,8 @@ SendCoinsEntry *SendCoinsDialog::addEntry()
QScrollBar* bar = ui->scrollArea->verticalScrollBar();
if(bar)
bar->setSliderPosition(bar->maximum());
+
+ updateTabsAndLabels();
return entry;
}
@@ -595,6 +589,9 @@ void SendCoinsDialog::updateGlobalFeeVariables()
{
nTxConfirmTarget = defaultConfirmTarget - ui->sliderSmartFee->value();
payTxFee = CFeeRate(0);
+
+ // set nMinimumTotalFee to 0 to not accidentally pay a custom fee
+ CoinControlDialog::coinControl->nMinimumTotalFee = 0;
}
else
{
@@ -605,8 +602,6 @@ void SendCoinsDialog::updateGlobalFeeVariables()
// set nMinimumTotalFee to 0 in case of user has selected that the fee is per KB
CoinControlDialog::coinControl->nMinimumTotalFee = ui->radioCustomAtLeast->isChecked() ? ui->customFee->value() : 0;
}
-
- fSendFreeTransactions = ui->checkBoxFreeTx->isChecked();
}
void SendCoinsDialog::updateFeeMinimizedLabel()
@@ -640,13 +635,15 @@ void SendCoinsDialog::updateSmartFeeLabel()
CFeeRate feeRate = mempool.estimateSmartFee(nBlocksToConfirm, &estimateFoundAtBlocks);
if (feeRate <= CFeeRate(0)) // not enough data => minfee
{
- ui->labelSmartFee->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), CWallet::GetRequiredFee(1000)) + "/kB");
+ ui->labelSmartFee->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(),
+ std::max(CWallet::fallbackFee.GetFeePerK(), CWallet::GetRequiredFee(1000))) + "/kB");
ui->labelSmartFee2->show(); // (Smart fee not initialized yet. This usually takes a few blocks...)
ui->labelFeeEstimation->setText("");
}
else
{
- ui->labelSmartFee->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), feeRate.GetFeePerK()) + "/kB");
+ ui->labelSmartFee->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(),
+ std::max(feeRate.GetFeePerK(), CWallet::GetRequiredFee(1000))) + "/kB");
ui->labelSmartFee2->hide();
ui->labelFeeEstimation->setText(tr("Estimated to begin confirmation within %n block(s).", "", estimateFoundAtBlocks));
}
@@ -684,12 +681,6 @@ void SendCoinsDialog::coinControlClipboardBytes()
GUIUtil::setClipboard(ui->labelCoinControlBytes->text().replace(ASYMP_UTF8, ""));
}
-// Coin Control: copy label "Priority" to clipboard
-void SendCoinsDialog::coinControlClipboardPriority()
-{
- GUIUtil::setClipboard(ui->labelCoinControlPriority->text());
-}
-
// Coin Control: copy label "Dust" to clipboard
void SendCoinsDialog::coinControlClipboardLowOutput()
{
@@ -789,11 +780,11 @@ void SendCoinsDialog::coinControlUpdateLabels()
if (model->getOptionsModel()->getCoinControlFeatures())
{
- // enable minium absolute fee UI controls
+ // enable minimum absolute fee UI controls
ui->radioCustomAtLeast->setVisible(true);
// only enable the feature if inputs are selected
- ui->radioCustomAtLeast->setEnabled(CoinControlDialog::coinControl->HasSelected());
+ ui->radioCustomAtLeast->setEnabled(ui->radioCustomFee->isChecked() && !ui->checkBoxMinimumFee->isChecked() &&CoinControlDialog::coinControl->HasSelected());
}
else
{
@@ -808,7 +799,7 @@ void SendCoinsDialog::coinControlUpdateLabels()
for(int i = 0; i < ui->entries->count(); ++i)
{
SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
- if(entry)
+ if(entry && !entry->isHidden())
{
SendCoinsRecipient rcp = entry->getValue();
CoinControlDialog::payAmounts.append(rcp.amount);
@@ -834,3 +825,45 @@ void SendCoinsDialog::coinControlUpdateLabels()
ui->labelCoinControlInsuffFunds->hide();
}
}
+
+SendConfirmationDialog::SendConfirmationDialog(const QString &title, const QString &text, int _secDelay,
+ QWidget *parent) :
+ QMessageBox(QMessageBox::Question, title, text, QMessageBox::Yes | QMessageBox::Cancel, parent), secDelay(_secDelay)
+{
+ setDefaultButton(QMessageBox::Cancel);
+ yesButton = button(QMessageBox::Yes);
+ updateYesButton();
+ connect(&countDownTimer, SIGNAL(timeout()), this, SLOT(countDown()));
+}
+
+int SendConfirmationDialog::exec()
+{
+ updateYesButton();
+ countDownTimer.start(1000);
+ return QMessageBox::exec();
+}
+
+void SendConfirmationDialog::countDown()
+{
+ secDelay--;
+ updateYesButton();
+
+ if(secDelay <= 0)
+ {
+ countDownTimer.stop();
+ }
+}
+
+void SendConfirmationDialog::updateYesButton()
+{
+ if(secDelay > 0)
+ {
+ yesButton->setEnabled(false);
+ yesButton->setText(tr("Yes") + " (" + QString::number(secDelay) + ")");
+ }
+ else
+ {
+ yesButton->setEnabled(true);
+ yesButton->setText(tr("Yes"));
+ }
+}
diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h
index 391905ffcd..83dac0bd11 100644
--- a/src/qt/sendcoinsdialog.h
+++ b/src/qt/sendcoinsdialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -8,7 +8,9 @@
#include "walletmodel.h"
#include <QDialog>
+#include <QMessageBox>
#include <QString>
+#include <QTimer>
class ClientModel;
class OptionsModel;
@@ -86,7 +88,6 @@ private Q_SLOTS:
void coinControlClipboardFee();
void coinControlClipboardAfterFee();
void coinControlClipboardBytes();
- void coinControlClipboardPriority();
void coinControlClipboardLowOutput();
void coinControlClipboardChange();
void setMinimumFee();
@@ -100,4 +101,24 @@ Q_SIGNALS:
void message(const QString &title, const QString &message, unsigned int style);
};
+
+
+class SendConfirmationDialog : public QMessageBox
+{
+ Q_OBJECT
+
+public:
+ SendConfirmationDialog(const QString &title, const QString &text, int secDelay = 0, QWidget *parent = 0);
+ int exec();
+
+private Q_SLOTS:
+ void countDown();
+ void updateYesButton();
+
+private:
+ QAbstractButton *yesButton;
+ QTimer countDownTimer;
+ int secDelay;
+};
+
#endif // BITCOIN_QT_SENDCOINSDIALOG_H
diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp
index 4f4b5b70d5..7eb1eb7e3a 100644
--- a/src/qt/sendcoinsentry.cpp
+++ b/src/qt/sendcoinsentry.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -15,11 +15,11 @@
#include <QApplication>
#include <QClipboard>
-SendCoinsEntry::SendCoinsEntry(const PlatformStyle *platformStyle, QWidget *parent) :
+SendCoinsEntry::SendCoinsEntry(const PlatformStyle *_platformStyle, QWidget *parent) :
QStackedWidget(parent),
ui(new Ui::SendCoinsEntry),
model(0),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
ui->setupUi(this);
@@ -79,12 +79,12 @@ void SendCoinsEntry::on_payTo_textChanged(const QString &address)
updateLabel(address);
}
-void SendCoinsEntry::setModel(WalletModel *model)
+void SendCoinsEntry::setModel(WalletModel *_model)
{
- this->model = model;
+ this->model = _model;
- if (model && model->getOptionsModel())
- connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
+ if (_model && _model->getOptionsModel())
+ connect(_model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
clear();
}
diff --git a/src/qt/sendcoinsentry.h b/src/qt/sendcoinsentry.h
index 107ab70158..a8be670c2a 100644
--- a/src/qt/sendcoinsentry.h
+++ b/src/qt/sendcoinsentry.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/signverifymessagedialog.cpp b/src/qt/signverifymessagedialog.cpp
index 96f50a2656..4061909b71 100644
--- a/src/qt/signverifymessagedialog.cpp
+++ b/src/qt/signverifymessagedialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -20,11 +20,11 @@
#include <QClipboard>
-SignVerifyMessageDialog::SignVerifyMessageDialog(const PlatformStyle *platformStyle, QWidget *parent) :
+SignVerifyMessageDialog::SignVerifyMessageDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
QDialog(parent),
ui(new Ui::SignVerifyMessageDialog),
model(0),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
ui->setupUi(this);
@@ -60,9 +60,9 @@ SignVerifyMessageDialog::~SignVerifyMessageDialog()
delete ui;
}
-void SignVerifyMessageDialog::setModel(WalletModel *model)
+void SignVerifyMessageDialog::setModel(WalletModel *_model)
{
- this->model = model;
+ this->model = _model;
}
void SignVerifyMessageDialog::setAddress_SM(const QString &address)
diff --git a/src/qt/signverifymessagedialog.h b/src/qt/signverifymessagedialog.h
index d651d5049b..d2e04cd4fe 100644
--- a/src/qt/signverifymessagedialog.h
+++ b/src/qt/signverifymessagedialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp
index c15b64c327..e36d86fddd 100644
--- a/src/qt/splashscreen.cpp
+++ b/src/qt/splashscreen.cpp
@@ -1,7 +1,11 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "splashscreen.h"
#include "networkstyle.h"
@@ -38,9 +42,9 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
#endif
// define text to place
- QString titleText = tr("Bitcoin Core");
+ QString titleText = tr(PACKAGE_NAME);
QString versionText = QString("Version %1").arg(QString::fromStdString(FormatFullVersion()));
- QString copyrightText = QChar(0xA9)+QString(" 2009-%1 ").arg(COPYRIGHT_YEAR) + QString(tr("The Bitcoin Core developers"));
+ QString copyrightText = QString::fromUtf8(CopyrightHolders(strprintf("\xc2\xA9 %u-%u ", 2009, COPYRIGHT_YEAR)).c_str());
QString titleAddText = networkStyle->getTitleAddText();
QString font = QApplication::font().toString();
@@ -75,10 +79,9 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
// check font size and drawing with
pixPaint.setFont(QFont(font, 33*fontFactor));
QFontMetrics fm = pixPaint.fontMetrics();
- int titleTextWidth = fm.width(titleText);
- if(titleTextWidth > 160) {
- // strange font rendering, Arial probably not found
- fontFactor = 0.75;
+ int titleTextWidth = fm.width(titleText);
+ if (titleTextWidth > 176) {
+ fontFactor = fontFactor * 176 / titleTextWidth;
}
pixPaint.setFont(QFont(font, 33*fontFactor));
@@ -98,8 +101,13 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight+2,paddingTop+titleVersionVSpace,versionText);
// draw copyright stuff
- pixPaint.setFont(QFont(font, 10*fontFactor));
- pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight,paddingTop+titleCopyrightVSpace,copyrightText);
+ {
+ pixPaint.setFont(QFont(font, 10*fontFactor));
+ const int x = pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight;
+ const int y = paddingTop+titleCopyrightVSpace;
+ QRect copyrightRect(x, y, pixmap.width() - x - paddingRight, pixmap.height() - y);
+ pixPaint.drawText(copyrightRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, copyrightText);
+ }
// draw additional text if special network
if(!titleAddText.isEmpty()) {
@@ -133,6 +141,11 @@ SplashScreen::~SplashScreen()
void SplashScreen::slotFinish(QWidget *mainWin)
{
Q_UNUSED(mainWin);
+
+ /* If the window is minimized, hide() will be ignored. */
+ /* Make sure we de-minimize the splashscreen window before hiding */
+ if (isMinimized())
+ showNormal();
hide();
}
diff --git a/src/qt/splashscreen.h b/src/qt/splashscreen.h
index 29d16d4eae..821f39db1c 100644
--- a/src/qt/splashscreen.h
+++ b/src/qt/splashscreen.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/test/paymentrequestdata.h b/src/qt/test/paymentrequestdata.h
index c548ffe429..74a2db8ea2 100644
--- a/src/qt/test/paymentrequestdata.h
+++ b/src/qt/test/paymentrequestdata.h
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/qt/test/paymentservertests.cpp b/src/qt/test/paymentservertests.cpp
index fa5696325d..84ccfea730 100644
--- a/src/qt/test/paymentservertests.cpp
+++ b/src/qt/test/paymentservertests.cpp
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/qt/test/paymentservertests.h b/src/qt/test/paymentservertests.h
index 71d61fcbe7..9ffcbb02ac 100644
--- a/src/qt/test/paymentservertests.h
+++ b/src/qt/test/paymentservertests.h
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/qt/test/rpcnestedtests.cpp b/src/qt/test/rpcnestedtests.cpp
new file mode 100644
index 0000000000..3dae33bafb
--- /dev/null
+++ b/src/qt/test/rpcnestedtests.cpp
@@ -0,0 +1,93 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "rpcnestedtests.h"
+
+#include "chainparams.h"
+#include "consensus/validation.h"
+#include "main.h"
+#include "rpc/register.h"
+#include "rpc/server.h"
+#include "rpcconsole.h"
+#include "test/testutil.h"
+#include "univalue.h"
+#include "util.h"
+
+#include <QDir>
+
+#include <boost/filesystem.hpp>
+
+void RPCNestedTests::rpcNestedTests()
+{
+ UniValue jsonRPCError;
+
+ // do some test setup
+ // could be moved to a more generic place when we add more tests on QT level
+ const CChainParams& chainparams = Params();
+ RegisterAllCoreRPCCommands(tableRPC);
+ ClearDatadirCache();
+ std::string path = QDir::tempPath().toStdString() + "/" + strprintf("test_bitcoin_qt_%lu_%i", (unsigned long)GetTime(), (int)(GetRand(100000)));
+ QDir dir(QString::fromStdString(path));
+ dir.mkpath(".");
+ mapArgs["-datadir"] = path;
+ //mempool.setSanityCheck(1.0);
+ pblocktree = new CBlockTreeDB(1 << 20, true);
+ pcoinsdbview = new CCoinsViewDB(1 << 23, true);
+ pcoinsTip = new CCoinsViewCache(pcoinsdbview);
+ InitBlockIndex(chainparams);
+ {
+ CValidationState state;
+ bool ok = ActivateBestChain(state, chainparams);
+ QVERIFY(ok);
+ }
+
+ SetRPCWarmupFinished();
+
+ std::string result;
+ std::string result2;
+ RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo()[chain]"); //simple result filtering with path
+ QVERIFY(result=="main");
+
+ RPCConsole::RPCExecuteCommandLine(result, "getblock(getbestblockhash())"); //simple 2 level nesting
+ RPCConsole::RPCExecuteCommandLine(result, "getblock(getblock(getbestblockhash())[hash], true)");
+
+ RPCConsole::RPCExecuteCommandLine(result, "getblock( getblock( getblock(getbestblockhash())[hash] )[hash], true)"); //4 level nesting with whitespace, filtering path and boolean parameter
+
+ RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo");
+ QVERIFY(result.substr(0,1) == "{");
+
+ RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo()");
+ QVERIFY(result.substr(0,1) == "{");
+
+ RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo "); //whitespace at the end will be tolerated
+ QVERIFY(result.substr(0,1) == "{");
+
+#if QT_VERSION >= 0x050300
+ // do the QVERIFY_EXCEPTION_THROWN checks only with Qt5.3 and higher (QVERIFY_EXCEPTION_THROWN was introduced in Qt5.3)
+ QVERIFY_EXCEPTION_THROWN(RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo() .\n"), std::runtime_error); //invalid syntax
+ QVERIFY_EXCEPTION_THROWN(RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo() getblockchaininfo()"), std::runtime_error); //invalid syntax
+ (RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo(")); //tolerate non closing brackets if we have no arguments
+ (RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo()()()")); //tolerate non command brackts
+ QVERIFY_EXCEPTION_THROWN(RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo(True)"), UniValue); //invalid argument
+ QVERIFY_EXCEPTION_THROWN(RPCConsole::RPCExecuteCommandLine(result, "a(getblockchaininfo(True))"), UniValue); //method not found
+#endif
+
+ (RPCConsole::RPCExecuteCommandLine(result, "getblockchaininfo()[\"chain\"]")); //Quote path identifier are allowed, but look after a child contaning the quotes in the key
+ QVERIFY(result == "null");
+
+ (RPCConsole::RPCExecuteCommandLine(result, "createrawtransaction [] {} 0")); //parameter not in brackets are allowed
+ (RPCConsole::RPCExecuteCommandLine(result2, "createrawtransaction([],{},0)")); //parameter in brackets are allowed
+ QVERIFY(result == result2);
+ (RPCConsole::RPCExecuteCommandLine(result2, "createrawtransaction( [], {} , 0 )")); //whitespace between parametres is allowed
+ QVERIFY(result == result2);
+
+ RPCConsole::RPCExecuteCommandLine(result, "getblock(getbestblockhash())[tx][0]");
+ QVERIFY(result == "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b");
+
+ delete pcoinsTip;
+ delete pcoinsdbview;
+ delete pblocktree;
+
+ boost::filesystem::remove_all(boost::filesystem::path(path));
+}
diff --git a/src/qt/test/rpcnestedtests.h b/src/qt/test/rpcnestedtests.h
new file mode 100644
index 0000000000..9ad409019f
--- /dev/null
+++ b/src/qt/test/rpcnestedtests.h
@@ -0,0 +1,25 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_QT_TEST_RPC_NESTED_TESTS_H
+#define BITCOIN_QT_TEST_RPC_NESTED_TESTS_H
+
+#include <QObject>
+#include <QTest>
+
+#include "txdb.h"
+#include "txmempool.h"
+
+class RPCNestedTests : public QObject
+{
+ Q_OBJECT
+
+ private Q_SLOTS:
+ void rpcNestedTests();
+
+private:
+ CCoinsViewDB *pcoinsdbview;
+};
+
+#endif // BITCOIN_QT_TEST_RPC_NESTED_TESTS_H
diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp
index f91de2008c..dbaab54fb6 100644
--- a/src/qt/test/test_main.cpp
+++ b/src/qt/test/test_main.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Copyright (c) 2009-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -6,6 +6,9 @@
#include "config/bitcoin-config.h"
#endif
+#include "chainparams.h"
+#include "key.h"
+#include "rpcnestedtests.h"
#include "util.h"
#include "uritests.h"
@@ -27,10 +30,17 @@ Q_IMPORT_PLUGIN(qtwcodecs)
Q_IMPORT_PLUGIN(qkrcodecs)
#endif
+extern void noui_connect();
+
// This is all you need to run all the tests
int main(int argc, char *argv[])
{
+ ECC_Start();
SetupEnvironment();
+ SetupNetworking();
+ SelectParams(CBaseChainParams::MAIN);
+ noui_connect();
+
bool fInvalid = false;
// Don't remove this, it's needed to access
@@ -48,6 +58,10 @@ int main(int argc, char *argv[])
if (QTest::qExec(&test2) != 0)
fInvalid = true;
#endif
+ RPCNestedTests test3;
+ if (QTest::qExec(&test3) != 0)
+ fInvalid = true;
+ ECC_Stop();
return fInvalid;
}
diff --git a/src/qt/test/uritests.h b/src/qt/test/uritests.h
index 434169dcde..4994842795 100644
--- a/src/qt/test/uritests.h
+++ b/src/qt/test/uritests.h
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/qt/trafficgraphwidget.cpp b/src/qt/trafficgraphwidget.cpp
index 9b67445bc0..601d554c02 100644
--- a/src/qt/trafficgraphwidget.cpp
+++ b/src/qt/trafficgraphwidget.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/trafficgraphwidget.h b/src/qt/trafficgraphwidget.h
index 6336a8d144..00660574af 100644
--- a/src/qt/trafficgraphwidget.h
+++ b/src/qt/trafficgraphwidget.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp
index 801c6c62d2..65144e7865 100644
--- a/src/qt/transactiondesc.cpp
+++ b/src/qt/transactiondesc.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -35,9 +35,11 @@ QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx)
{
int nDepth = wtx.GetDepthInMainChain();
if (nDepth < 0)
- return tr("conflicted");
+ return tr("conflicted with a transaction with %1 confirmations").arg(-nDepth);
else if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
return tr("%1/offline").arg(nDepth);
+ else if (nDepth == 0)
+ return tr("0/unconfirmed, %1").arg((wtx.InMempool() ? tr("in memory pool") : tr("not in memory pool"))) + (wtx.isAbandoned() ? ", "+tr("abandoned") : "");
else if (nDepth < 6)
return tr("%1/unconfirmed").arg(nDepth);
else
@@ -238,7 +240,9 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx, TransactionReco
if (wtx.mapValue.count("comment") && !wtx.mapValue["comment"].empty())
strHTML += "<br><b>" + tr("Comment") + ":</b><br>" + GUIUtil::HtmlEscape(wtx.mapValue["comment"], true) + "<br>";
- strHTML += "<b>" + tr("Transaction ID") + ":</b> " + TransactionRecord::formatSubTxId(wtx.GetHash(), rec->idx) + "<br>";
+ strHTML += "<b>" + tr("Transaction ID") + ":</b> " + rec->getTxID() + "<br>";
+ strHTML += "<b>" + tr("Transaction total size") + ":</b> " + QString::number(wtx.GetTotalSize()) + " bytes<br>";
+ strHTML += "<b>" + tr("Output index") + ":</b> " + QString::number(rec->getOutputIndex()) + "<br>";
// Message from normal bitcoin:URI (bitcoin:123...?message=example)
Q_FOREACH (const PAIRTYPE(std::string, std::string)& r, wtx.vOrderForm)
diff --git a/src/qt/transactiondesc.h b/src/qt/transactiondesc.h
index 5467348ee9..01b90b130f 100644
--- a/src/qt/transactiondesc.h
+++ b/src/qt/transactiondesc.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
diff --git a/src/qt/transactiondescdialog.cpp b/src/qt/transactiondescdialog.cpp
index fadaa98f4a..65adcc4f02 100644
--- a/src/qt/transactiondescdialog.cpp
+++ b/src/qt/transactiondescdialog.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
@@ -14,6 +14,7 @@ TransactionDescDialog::TransactionDescDialog(const QModelIndex &idx, QWidget *pa
ui(new Ui::TransactionDescDialog)
{
ui->setupUi(this);
+ setWindowTitle(tr("Details for %1").arg(idx.data(TransactionTableModel::TxIDRole).toString()));
QString desc = idx.data(TransactionTableModel::LongDescriptionRole).toString();
ui->detailText->setHtml(desc);
}
diff --git a/src/qt/transactiondescdialog.h b/src/qt/transactiondescdialog.h
index 54374e359d..f1371b3856 100644
--- a/src/qt/transactiondescdialog.h
+++ b/src/qt/transactiondescdialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
diff --git a/src/qt/transactionfilterproxy.cpp b/src/qt/transactionfilterproxy.cpp
index 7981eb7c91..e21b89b935 100644
--- a/src/qt/transactionfilterproxy.cpp
+++ b/src/qt/transactionfilterproxy.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
@@ -66,9 +66,9 @@ void TransactionFilterProxy::setDateRange(const QDateTime &from, const QDateTime
invalidateFilter();
}
-void TransactionFilterProxy::setAddressPrefix(const QString &addrPrefix)
+void TransactionFilterProxy::setAddressPrefix(const QString &_addrPrefix)
{
- this->addrPrefix = addrPrefix;
+ this->addrPrefix = _addrPrefix;
invalidateFilter();
}
@@ -95,9 +95,9 @@ void TransactionFilterProxy::setLimit(int limit)
this->limitRows = limit;
}
-void TransactionFilterProxy::setShowInactive(bool showInactive)
+void TransactionFilterProxy::setShowInactive(bool _showInactive)
{
- this->showInactive = showInactive;
+ this->showInactive = _showInactive;
invalidateFilter();
}
diff --git a/src/qt/transactionfilterproxy.h b/src/qt/transactionfilterproxy.h
index acea9a1e3b..7db02cd61f 100644
--- a/src/qt/transactionfilterproxy.h
+++ b/src/qt/transactionfilterproxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp
index d8623daf5d..4fe47181f6 100644
--- a/src/qt/transactionrecord.cpp
+++ b/src/qt/transactionrecord.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -239,6 +239,8 @@ void TransactionRecord::updateStatus(const CWalletTx &wtx)
else if (status.depth == 0)
{
status.status = TransactionStatus::Unconfirmed;
+ if (wtx.isAbandoned())
+ status.status = TransactionStatus::Abandoned;
}
else if (status.depth < RecommendedNumConfirmations)
{
@@ -260,11 +262,10 @@ bool TransactionRecord::statusUpdateNeeded()
QString TransactionRecord::getTxID() const
{
- return formatSubTxId(hash, idx);
+ return QString::fromStdString(hash.ToString());
}
-QString TransactionRecord::formatSubTxId(const uint256 &hash, int vout)
+int TransactionRecord::getOutputIndex() const
{
- return QString::fromStdString(hash.ToString() + strprintf("-%03d", vout));
+ return idx;
}
-
diff --git a/src/qt/transactionrecord.h b/src/qt/transactionrecord.h
index a5bc375717..8eff302aff 100644
--- a/src/qt/transactionrecord.h
+++ b/src/qt/transactionrecord.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
@@ -33,6 +33,7 @@ public:
Unconfirmed, /**< Not yet mined into a block **/
Confirming, /**< Confirmed, but waiting for the recommended number of confirmations **/
Conflicted, /**< Conflicts with other transaction or mempool **/
+ Abandoned, /**< Abandoned from the wallet **/
/// Generated (mined) transactions
Immature, /**< Mined but waiting for maturity */
MaturesWarning, /**< Transaction will likely not mature because no nodes have confirmed */
@@ -87,16 +88,16 @@ public:
{
}
- TransactionRecord(uint256 hash, qint64 time):
- hash(hash), time(time), type(Other), address(""), debit(0),
+ TransactionRecord(uint256 _hash, qint64 _time):
+ hash(_hash), time(_time), type(Other), address(""), debit(0),
credit(0), idx(0)
{
}
- TransactionRecord(uint256 hash, qint64 time,
- Type type, const std::string &address,
- const CAmount& debit, const CAmount& credit):
- hash(hash), time(time), type(type), address(address), debit(debit), credit(credit),
+ TransactionRecord(uint256 _hash, qint64 _time,
+ Type _type, const std::string &_address,
+ const CAmount& _debit, const CAmount& _credit):
+ hash(_hash), time(_time), type(_type), address(_address), debit(_debit), credit(_credit),
idx(0)
{
}
@@ -128,8 +129,8 @@ public:
/** Return the unique identifier for this transaction (part) */
QString getTxID() const;
- /** Format subtransaction id */
- static QString formatSubTxId(const uint256 &hash, int vout);
+ /** Return the output index of the subtransaction */
+ int getOutputIndex() const;
/** Update status from core wallet tx.
*/
diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp
index e8ada9f762..52261ff04b 100644
--- a/src/qt/transactiontablemodel.cpp
+++ b/src/qt/transactiontablemodel.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -59,9 +59,9 @@ struct TxLessThan
class TransactionTablePriv
{
public:
- TransactionTablePriv(CWallet *wallet, TransactionTableModel *parent) :
- wallet(wallet),
- parent(parent)
+ TransactionTablePriv(CWallet *_wallet, TransactionTableModel *_parent) :
+ wallet(_wallet),
+ parent(_parent)
{
}
@@ -235,13 +235,13 @@ public:
}
};
-TransactionTableModel::TransactionTableModel(const PlatformStyle *platformStyle, CWallet* wallet, WalletModel *parent):
+TransactionTableModel::TransactionTableModel(const PlatformStyle *_platformStyle, CWallet* _wallet, WalletModel *parent):
QAbstractTableModel(parent),
- wallet(wallet),
+ wallet(_wallet),
walletModel(parent),
- priv(new TransactionTablePriv(wallet, this)),
+ priv(new TransactionTablePriv(_wallet, this)),
fProcessingQueuedTransactions(false),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
columns << QString() << QString() << tr("Date") << tr("Type") << tr("Label") << BitcoinUnits::getAmountColumnTitle(walletModel->getOptionsModel()->getDisplayUnit());
priv->refreshWallet();
@@ -312,6 +312,9 @@ QString TransactionTableModel::formatTxStatus(const TransactionRecord *wtx) cons
case TransactionStatus::Unconfirmed:
status = tr("Unconfirmed");
break;
+ case TransactionStatus::Abandoned:
+ status = tr("Abandoned");
+ break;
case TransactionStatus::Confirming:
status = tr("Confirming (%1 of %2 recommended confirmations)").arg(wtx->status.depth).arg(TransactionRecord::RecommendedNumConfirmations);
break;
@@ -468,6 +471,8 @@ QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx)
return COLOR_TX_STATUS_OFFLINE;
case TransactionStatus::Unconfirmed:
return QIcon(":/icons/transaction_0");
+ case TransactionStatus::Abandoned:
+ return QIcon(":/icons/transaction_abandoned");
case TransactionStatus::Confirming:
switch(wtx->status.depth)
{
@@ -573,6 +578,11 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
case Qt::TextAlignmentRole:
return column_alignments[index.column()];
case Qt::ForegroundRole:
+ // Use the "danger" color for abandoned transactions
+ if(rec->status.status == TransactionStatus::Abandoned)
+ {
+ return COLOR_TX_STATUS_DANGER;
+ }
// Non-confirmed (but not immature) as transactions are grey
if(!rec->status.countsForBalance && rec->status.status != TransactionStatus::Immature)
{
@@ -609,6 +619,34 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
return QString::fromStdString(rec->hash.ToString());
case TxHexRole:
return priv->getTxHex(rec);
+ case TxPlainTextRole:
+ {
+ QString details;
+ QDateTime date = QDateTime::fromTime_t(static_cast<uint>(rec->time));
+ QString txLabel = walletModel->getAddressTableModel()->labelForAddress(QString::fromStdString(rec->address));
+
+ details.append(date.toString("M/d/yy HH:mm"));
+ details.append(" ");
+ details.append(formatTxStatus(rec));
+ details.append(". ");
+ if(!formatTxType(rec).isEmpty()) {
+ details.append(formatTxType(rec));
+ details.append(" ");
+ }
+ if(!rec->address.empty()) {
+ if(txLabel.isEmpty())
+ details.append(tr("(no label)") + " ");
+ else {
+ details.append("(");
+ details.append(txLabel);
+ details.append(") ");
+ }
+ details.append(QString::fromStdString(rec->address));
+ details.append(" ");
+ }
+ details.append(formatTxAmount(rec, false, BitcoinUnits::separatorNever));
+ return details;
+ }
case ConfirmedRole:
return rec->status.countsForBalance;
case FormattedAmountRole:
@@ -676,8 +714,8 @@ struct TransactionNotification
{
public:
TransactionNotification() {}
- TransactionNotification(uint256 hash, ChangeType status, bool showTransaction):
- hash(hash), status(status), showTransaction(showTransaction) {}
+ TransactionNotification(uint256 _hash, ChangeType _status, bool _showTransaction):
+ hash(_hash), status(_status), showTransaction(_showTransaction) {}
void invoke(QObject *ttm)
{
diff --git a/src/qt/transactiontablemodel.h b/src/qt/transactiontablemodel.h
index 601f893d47..6932646e1e 100644
--- a/src/qt/transactiontablemodel.h
+++ b/src/qt/transactiontablemodel.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -62,6 +62,8 @@ public:
TxHashRole,
/** Transaction data, hex-encoded */
TxHexRole,
+ /** Whole transaction as plain text */
+ TxPlainTextRole,
/** Is transaction confirmed? */
ConfirmedRole,
/** Formatted amount, without brackets when unconfirmed */
diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp
index 11e6d750ac..856b16d2c4 100644
--- a/src/qt/transactionview.cpp
+++ b/src/qt/transactionview.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -37,7 +37,7 @@
TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *parent) :
QWidget(parent), model(0), transactionProxyModel(0),
- transactionView(0)
+ transactionView(0), abandonAction(0)
{
// Build filter row
setContentsMargins(0,0,0,0);
@@ -137,11 +137,13 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa
transactionView = view;
// Actions
+ abandonAction = new QAction(tr("Abandon transaction"), this);
QAction *copyAddressAction = new QAction(tr("Copy address"), this);
QAction *copyLabelAction = new QAction(tr("Copy label"), this);
QAction *copyAmountAction = new QAction(tr("Copy amount"), this);
QAction *copyTxIDAction = new QAction(tr("Copy transaction ID"), this);
QAction *copyTxHexAction = new QAction(tr("Copy raw transaction"), this);
+ QAction *copyTxPlainText = new QAction(tr("Copy full transaction details"), this);
QAction *editLabelAction = new QAction(tr("Edit label"), this);
QAction *showDetailsAction = new QAction(tr("Show transaction details"), this);
@@ -151,8 +153,11 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa
contextMenu->addAction(copyAmountAction);
contextMenu->addAction(copyTxIDAction);
contextMenu->addAction(copyTxHexAction);
- contextMenu->addAction(editLabelAction);
+ contextMenu->addAction(copyTxPlainText);
contextMenu->addAction(showDetailsAction);
+ contextMenu->addSeparator();
+ contextMenu->addAction(abandonAction);
+ contextMenu->addAction(editLabelAction);
mapperThirdPartyTxUrls = new QSignalMapper(this);
@@ -168,22 +173,24 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa
connect(view, SIGNAL(doubleClicked(QModelIndex)), this, SIGNAL(doubleClicked(QModelIndex)));
connect(view, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint)));
+ connect(abandonAction, SIGNAL(triggered()), this, SLOT(abandonTx()));
connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(copyAddress()));
connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(copyLabel()));
connect(copyAmountAction, SIGNAL(triggered()), this, SLOT(copyAmount()));
connect(copyTxIDAction, SIGNAL(triggered()), this, SLOT(copyTxID()));
connect(copyTxHexAction, SIGNAL(triggered()), this, SLOT(copyTxHex()));
+ connect(copyTxPlainText, SIGNAL(triggered()), this, SLOT(copyTxPlainText()));
connect(editLabelAction, SIGNAL(triggered()), this, SLOT(editLabel()));
connect(showDetailsAction, SIGNAL(triggered()), this, SLOT(showDetails()));
}
-void TransactionView::setModel(WalletModel *model)
+void TransactionView::setModel(WalletModel *_model)
{
- this->model = model;
- if(model)
+ this->model = _model;
+ if(_model)
{
transactionProxyModel = new TransactionFilterProxy(this);
- transactionProxyModel->setSourceModel(model->getTransactionTableModel());
+ transactionProxyModel->setSourceModel(_model->getTransactionTableModel());
transactionProxyModel->setDynamicSortFilter(true);
transactionProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
transactionProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
@@ -196,7 +203,7 @@ void TransactionView::setModel(WalletModel *model)
transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
transactionView->setSortingEnabled(true);
- transactionView->sortByColumn(TransactionTableModel::Status, Qt::DescendingOrder);
+ transactionView->sortByColumn(TransactionTableModel::Date, Qt::DescendingOrder);
transactionView->verticalHeader()->hide();
transactionView->setColumnWidth(TransactionTableModel::Status, STATUS_COLUMN_WIDTH);
@@ -207,10 +214,10 @@ void TransactionView::setModel(WalletModel *model)
columnResizingFixer = new GUIUtil::TableViewLastColumnResizingFixer(transactionView, AMOUNT_MINIMUM_COLUMN_WIDTH, MINIMUM_COLUMN_WIDTH);
- if (model->getOptionsModel())
+ if (_model->getOptionsModel())
{
// Add third party transaction URLs to context menu
- QStringList listUrls = model->getOptionsModel()->getThirdPartyTxUrls().split("|", QString::SkipEmptyParts);
+ QStringList listUrls = _model->getOptionsModel()->getThirdPartyTxUrls().split("|", QString::SkipEmptyParts);
for (int i = 0; i < listUrls.size(); ++i)
{
QString host = QUrl(listUrls[i].trimmed(), QUrl::StrictMode).host();
@@ -227,10 +234,10 @@ void TransactionView::setModel(WalletModel *model)
}
// show/hide column Watch-only
- updateWatchOnlyColumn(model->haveWatchOnly());
+ updateWatchOnlyColumn(_model->haveWatchOnly());
// Watch-only signal
- connect(model, SIGNAL(notifyWatchonlyChanged(bool)), this, SLOT(updateWatchOnlyColumn(bool)));
+ connect(_model, SIGNAL(notifyWatchonlyChanged(bool)), this, SLOT(updateWatchOnlyColumn(bool)));
}
}
@@ -267,7 +274,7 @@ void TransactionView::chooseDate(int idx)
break;
case LastMonth:
transactionProxyModel->setDateRange(
- QDateTime(QDate(current.year(), current.month()-1, 1)),
+ QDateTime(QDate(current.year(), current.month(), 1).addMonths(-1)),
QDateTime(QDate(current.year(), current.month(), 1)));
break;
case ThisYear:
@@ -357,12 +364,39 @@ void TransactionView::exportClicked()
void TransactionView::contextualMenu(const QPoint &point)
{
QModelIndex index = transactionView->indexAt(point);
+ QModelIndexList selection = transactionView->selectionModel()->selectedRows(0);
+ if (selection.empty())
+ return;
+
+ // check if transaction can be abandoned, disable context menu action in case it doesn't
+ uint256 hash;
+ hash.SetHex(selection.at(0).data(TransactionTableModel::TxHashRole).toString().toStdString());
+ abandonAction->setEnabled(model->transactionCanBeAbandoned(hash));
+
if(index.isValid())
{
contextMenu->exec(QCursor::pos());
}
}
+void TransactionView::abandonTx()
+{
+ if(!transactionView || !transactionView->selectionModel())
+ return;
+ QModelIndexList selection = transactionView->selectionModel()->selectedRows(0);
+
+ // get the hash from the TxHashRole (QVariant / QString)
+ uint256 hash;
+ QString hashQStr = selection.at(0).data(TransactionTableModel::TxHashRole).toString();
+ hash.SetHex(hashQStr.toStdString());
+
+ // Abandon the wallet transaction over the walletModel
+ model->abandonTransaction(hash);
+
+ // Update the table
+ model->getTransactionTableModel()->updateTransaction(hashQStr, CT_UPDATED, false);
+}
+
void TransactionView::copyAddress()
{
GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::AddressRole);
@@ -388,6 +422,11 @@ void TransactionView::copyTxHex()
GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::TxHexRole);
}
+void TransactionView::copyTxPlainText()
+{
+ GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::TxPlainTextRole);
+}
+
void TransactionView::editLabel()
{
if(!transactionView->selectionModel() ||!model)
@@ -441,8 +480,9 @@ void TransactionView::showDetails()
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
if(!selection.isEmpty())
{
- TransactionDescDialog dlg(selection.at(0));
- dlg.exec();
+ TransactionDescDialog *dlg = new TransactionDescDialog(selection.at(0));
+ dlg->setAttribute(Qt::WA_DeleteOnClose);
+ dlg->show();
}
}
@@ -526,12 +566,8 @@ bool TransactionView::eventFilter(QObject *obj, QEvent *event)
QKeyEvent *ke = static_cast<QKeyEvent *>(event);
if (ke->key() == Qt::Key_C && ke->modifiers().testFlag(Qt::ControlModifier))
{
- QModelIndex i = this->transactionView->currentIndex();
- if (i.isValid() && i.column() == TransactionTableModel::Amount)
- {
- GUIUtil::setClipboard(i.data(TransactionTableModel::FormattedAmountRole).toString());
- return true;
- }
+ GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::TxPlainTextRole);
+ return true;
}
}
return QWidget::eventFilter(obj, event);
diff --git a/src/qt/transactionview.h b/src/qt/transactionview.h
index dde700c4d1..e9b9d5b6bc 100644
--- a/src/qt/transactionview.h
+++ b/src/qt/transactionview.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -75,6 +75,7 @@ private:
QFrame *dateRangeWidget;
QDateTimeEdit *dateFrom;
QDateTimeEdit *dateTo;
+ QAction *abandonAction;
QWidget *createDateRangeWidget();
@@ -94,8 +95,10 @@ private Q_SLOTS:
void copyAmount();
void copyTxID();
void copyTxHex();
+ void copyTxPlainText();
void openThirdPartyTxUrl(QString url);
void updateWatchOnlyColumn(bool fHaveWatchOnly);
+ void abandonTx();
Q_SIGNALS:
void doubleClicked(const QModelIndex&);
diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp
index 81b597e2eb..947bcdb15a 100644
--- a/src/qt/utilitydialog.cpp
+++ b/src/qt/utilitydialog.cpp
@@ -1,7 +1,11 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "utilitydialog.h"
#include "ui_helpmessagedialog.h"
@@ -33,7 +37,7 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) :
{
ui->setupUi(this);
- QString version = tr("Bitcoin Core") + " " + tr("version") + " " + QString::fromStdString(FormatFullVersion());
+ QString version = tr(PACKAGE_NAME) + " " + tr("version") + " " + QString::fromStdString(FormatFullVersion());
/* On x86 add a bit specifier to the version so that users can distinguish between
* 32 and 64 bit builds. On other architectures, 32/64 bit may be more ambigious.
*/
@@ -45,7 +49,7 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) :
if (about)
{
- setWindowTitle(tr("About Bitcoin Core"));
+ setWindowTitle(tr("About %1").arg(tr(PACKAGE_NAME)));
/// HTML-format the license message from the core
QString licenseInfo = QString::fromStdString(LicenseInfo());
@@ -55,7 +59,7 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) :
uri.setMinimal(true); // use non-greedy matching
licenseInfoHTML.replace(uri, "<a href=\"\\1\">\\1</a>");
// Replace newlines with HTML breaks
- licenseInfoHTML.replace("\n\n", "<br><br>");
+ licenseInfoHTML.replace("\n", "<br>");
ui->aboutMessage->setTextFormat(Qt::RichText);
ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
@@ -84,7 +88,7 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) :
strUsage += HelpMessageOpt("-min", tr("Start minimized").toStdString());
strUsage += HelpMessageOpt("-rootcertificates=<file>", tr("Set SSL root certificates for payment request (default: -system-)").toStdString());
strUsage += HelpMessageOpt("-splash", strprintf(tr("Show splash screen on startup (default: %u)").toStdString(), DEFAULT_SPLASHSCREEN));
- strUsage += HelpMessageOpt("-resetguisettings", tr("Reset all settings changes made over the GUI").toStdString());
+ strUsage += HelpMessageOpt("-resetguisettings", tr("Reset all settings changed in the GUI").toStdString());
if (showDebug) {
strUsage += HelpMessageOpt("-uiplatform", strprintf("Select platform to customize UI for (one of windows, macosx, other; default: %s)", BitcoinGUI::DEFAULT_UIPLATFORM));
}
@@ -162,7 +166,7 @@ ShutdownWindow::ShutdownWindow(QWidget *parent, Qt::WindowFlags f):
{
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(new QLabel(
- tr("Bitcoin Core is shutting down...") + "<br /><br />" +
+ tr("%1 is shutting down...").arg(tr(PACKAGE_NAME)) + "<br /><br />" +
tr("Do not shut down the computer until this window disappears.")));
setLayout(layout);
}
diff --git a/src/qt/utilitydialog.h b/src/qt/utilitydialog.h
index 47282ae2d0..843bd7f67b 100644
--- a/src/qt/utilitydialog.h
+++ b/src/qt/utilitydialog.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp
index ba8c28464d..69dcc9abb1 100644
--- a/src/qt/walletframe.cpp
+++ b/src/qt/walletframe.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -12,10 +12,10 @@
#include <QHBoxLayout>
#include <QLabel>
-WalletFrame::WalletFrame(const PlatformStyle *platformStyle, BitcoinGUI *_gui) :
+WalletFrame::WalletFrame(const PlatformStyle *_platformStyle, BitcoinGUI *_gui) :
QFrame(_gui),
gui(_gui),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
// Leave HBox hook for adding a list view later
QHBoxLayout *walletFrameLayout = new QHBoxLayout(this);
@@ -33,9 +33,9 @@ WalletFrame::~WalletFrame()
{
}
-void WalletFrame::setClientModel(ClientModel *clientModel)
+void WalletFrame::setClientModel(ClientModel *_clientModel)
{
- this->clientModel = clientModel;
+ this->clientModel = _clientModel;
}
bool WalletFrame::addWallet(const QString& name, WalletModel *walletModel)
@@ -57,6 +57,8 @@ bool WalletFrame::addWallet(const QString& name, WalletModel *walletModel)
// Ensure a walletView is able to show the main window
connect(walletView, SIGNAL(showNormalIfMinimized()), gui, SLOT(showNormalIfMinimized()));
+ connect(walletView, SIGNAL(outOfSyncWarningClicked()), this, SLOT(outOfSyncWarningClicked()));
+
return true;
}
@@ -195,3 +197,7 @@ WalletView *WalletFrame::currentWalletView()
return qobject_cast<WalletView*>(walletStack->currentWidget());
}
+void WalletFrame::outOfSyncWarningClicked()
+{
+ Q_EMIT requestedSyncWarningInfo();
+}
diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h
index 9a56e97f9c..7bc6412910 100644
--- a/src/qt/walletframe.h
+++ b/src/qt/walletframe.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -19,6 +19,13 @@ QT_BEGIN_NAMESPACE
class QStackedWidget;
QT_END_NAMESPACE
+/**
+ * A container for embedding all wallet-related
+ * controls into BitcoinGUI. The purpose of this class is to allow future
+ * refinements of the wallet controls with minimal need for further
+ * modifications to BitcoinGUI, thus greatly simplifying merges while
+ * reducing the risk of breaking top-level stuff.
+ */
class WalletFrame : public QFrame
{
Q_OBJECT
@@ -38,6 +45,10 @@ public:
void showOutOfSyncWarning(bool fShow);
+Q_SIGNALS:
+ /** Notify that the user has requested more information about the out-of-sync warning */
+ void requestedSyncWarningInfo();
+
private:
QStackedWidget *walletStack;
BitcoinGUI *gui;
@@ -78,6 +89,8 @@ public Q_SLOTS:
void usedSendingAddresses();
/** Show used receiving addresses */
void usedReceivingAddresses();
+ /** Pass on signal over requested out-of-sync-warning information */
+ void outOfSyncWarningClicked();
};
#endif // BITCOIN_QT_WALLETFRAME_H
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index 690ea0811e..c8a2cb37ec 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -27,8 +27,8 @@
#include <boost/foreach.hpp>
-WalletModel::WalletModel(const PlatformStyle *platformStyle, CWallet *wallet, OptionsModel *optionsModel, QObject *parent) :
- QObject(parent), wallet(wallet), optionsModel(optionsModel), addressTableModel(0),
+WalletModel::WalletModel(const PlatformStyle *platformStyle, CWallet *_wallet, OptionsModel *_optionsModel, QObject *parent) :
+ QObject(parent), wallet(_wallet), optionsModel(_optionsModel), addressTableModel(0),
transactionTableModel(0),
recentRequestsTableModel(0),
cachedBalance(0), cachedUnconfirmedBalance(0), cachedImmatureBalance(0),
@@ -328,7 +328,7 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(WalletModelTransaction &tran
}
CReserveKey *keyChange = transaction.getPossibleKeyChange();
- if(!wallet->CommitTransaction(*newTx, *keyChange))
+ if(!wallet->CommitTransaction(*newTx, *keyChange, g_connman.get()))
return TransactionCommitFailed;
CTransaction* t = (CTransaction*)newTx;
@@ -447,7 +447,7 @@ bool WalletModel::changePassphrase(const SecureString &oldPass, const SecureStri
bool WalletModel::backupWallet(const QString &filename)
{
- return BackupWallet(*wallet, filename.toLocal8Bit().data());
+ return wallet->BackupWallet(filename.toLocal8Bit().data());
}
// Handlers for core signals
@@ -531,10 +531,10 @@ WalletModel::UnlockContext WalletModel::requestUnlock()
return UnlockContext(this, valid, was_locked);
}
-WalletModel::UnlockContext::UnlockContext(WalletModel *wallet, bool valid, bool relock):
- wallet(wallet),
- valid(valid),
- relock(relock)
+WalletModel::UnlockContext::UnlockContext(WalletModel *_wallet, bool _valid, bool _relock):
+ wallet(_wallet),
+ valid(_valid),
+ relock(_relock)
{
}
@@ -572,7 +572,7 @@ void WalletModel::getOutputs(const std::vector<COutPoint>& vOutpoints, std::vect
if (!wallet->mapWallet.count(outpoint.hash)) continue;
int nDepth = wallet->mapWallet[outpoint.hash].GetDepthInMainChain();
if (nDepth < 0) continue;
- COutput out(&wallet->mapWallet[outpoint.hash], outpoint.n, nDepth, true);
+ COutput out(&wallet->mapWallet[outpoint.hash], outpoint.n, nDepth, true, true);
vOutputs.push_back(out);
}
}
@@ -599,7 +599,7 @@ void WalletModel::listCoins(std::map<QString, std::vector<COutput> >& mapCoins)
if (!wallet->mapWallet.count(outpoint.hash)) continue;
int nDepth = wallet->mapWallet[outpoint.hash].GetDepthInMainChain();
if (nDepth < 0) continue;
- COutput out(&wallet->mapWallet[outpoint.hash], outpoint.n, nDepth, true);
+ COutput out(&wallet->mapWallet[outpoint.hash], outpoint.n, nDepth, true, true);
if (outpoint.n < out.tx->vout.size() && wallet->IsMine(out.tx->vout[outpoint.n]) == ISMINE_SPENDABLE)
vCoins.push_back(out);
}
@@ -611,7 +611,7 @@ void WalletModel::listCoins(std::map<QString, std::vector<COutput> >& mapCoins)
while (wallet->IsChange(cout.tx->vout[cout.i]) && cout.tx->vin.size() > 0 && wallet->IsMine(cout.tx->vin[0]))
{
if (!wallet->mapWallet.count(cout.tx->vin[0].prevout.hash)) break;
- cout = COutput(&wallet->mapWallet[cout.tx->vin[0].prevout.hash], cout.tx->vin[0].prevout.n, 0, true);
+ cout = COutput(&wallet->mapWallet[cout.tx->vin[0].prevout.hash], cout.tx->vin[0].prevout.n, 0, true, true);
}
CTxDestination address;
@@ -668,3 +668,28 @@ bool WalletModel::saveReceiveRequest(const std::string &sAddress, const int64_t
else
return wallet->AddDestData(dest, key, sRequest);
}
+
+bool WalletModel::transactionCanBeAbandoned(uint256 hash) const
+{
+ LOCK2(cs_main, wallet->cs_wallet);
+ const CWalletTx *wtx = wallet->GetWalletTx(hash);
+ if (!wtx || wtx->isAbandoned() || wtx->GetDepthInMainChain() > 0 || wtx->InMempool())
+ return false;
+ return true;
+}
+
+bool WalletModel::abandonTransaction(uint256 hash) const
+{
+ LOCK2(cs_main, wallet->cs_wallet);
+ return wallet->AbandonTransaction(hash);
+}
+
+bool WalletModel::isWalletEnabled()
+{
+ return !GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET);
+}
+
+bool WalletModel::hdEnabled() const
+{
+ return wallet->IsHDEnabled();
+}
diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h
index a5e877d81f..b105c6d991 100644
--- a/src/qt/walletmodel.h
+++ b/src/qt/walletmodel.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -38,8 +38,8 @@ class SendCoinsRecipient
{
public:
explicit SendCoinsRecipient() : amount(0), fSubtractFeeFromAmount(false), nVersion(SendCoinsRecipient::CURRENT_VERSION) { }
- explicit SendCoinsRecipient(const QString &addr, const QString &label, const CAmount& amount, const QString &message):
- address(addr), label(label), amount(amount), message(message), fSubtractFeeFromAmount(false), nVersion(SendCoinsRecipient::CURRENT_VERSION) {}
+ explicit SendCoinsRecipient(const QString &addr, const QString &_label, const CAmount& _amount, const QString &_message):
+ address(addr), label(_label), amount(_amount), message(_message), fSubtractFeeFromAmount(false), nVersion(SendCoinsRecipient::CURRENT_VERSION) {}
// If from an unauthenticated payment request, this is used for storing
// the addresses, e.g. address-A<br />address-B<br />address-C.
@@ -75,7 +75,6 @@ public:
std::string sAuthenticatedMerchant = authenticatedMerchant.toStdString();
READWRITE(this->nVersion);
- nVersion = this->nVersion;
READWRITE(sAddress);
READWRITE(sLabel);
READWRITE(amount);
@@ -145,8 +144,8 @@ public:
// Return status record for SendCoins, contains error id + information
struct SendCoinsReturn
{
- SendCoinsReturn(StatusCode status = OK):
- status(status) {}
+ SendCoinsReturn(StatusCode _status = OK):
+ status(_status) {}
StatusCode status;
};
@@ -200,6 +199,13 @@ public:
void loadReceiveRequests(std::vector<std::string>& vReceiveRequests);
bool saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest);
+ bool transactionCanBeAbandoned(uint256 hash) const;
+ bool abandonTransaction(uint256 hash) const;
+
+ static bool isWalletEnabled();
+
+ bool hdEnabled() const;
+
private:
CWallet *wallet;
bool fHaveWatchOnly;
diff --git a/src/qt/walletmodeltransaction.cpp b/src/qt/walletmodeltransaction.cpp
index 6a9b2d5bd3..fdec6a1c86 100644
--- a/src/qt/walletmodeltransaction.cpp
+++ b/src/qt/walletmodeltransaction.cpp
@@ -1,13 +1,14 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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 "walletmodeltransaction.h"
+#include "policy/policy.h"
#include "wallet/wallet.h"
-WalletModelTransaction::WalletModelTransaction(const QList<SendCoinsRecipient> &recipients) :
- recipients(recipients),
+WalletModelTransaction::WalletModelTransaction(const QList<SendCoinsRecipient> &_recipients) :
+ recipients(_recipients),
walletTransaction(0),
keyChange(0),
fee(0)
@@ -33,7 +34,7 @@ CWalletTx *WalletModelTransaction::getTransaction()
unsigned int WalletModelTransaction::getTransactionSize()
{
- return (!walletTransaction ? 0 : (::GetSerializeSize(*(CTransaction*)walletTransaction, SER_NETWORK, PROTOCOL_VERSION)));
+ return (!walletTransaction ? 0 : ::GetVirtualTransactionSize(*walletTransaction));
}
CAmount WalletModelTransaction::getTransactionFee()
diff --git a/src/qt/walletmodeltransaction.h b/src/qt/walletmodeltransaction.h
index 7765fea4af..64922efada 100644
--- a/src/qt/walletmodeltransaction.h
+++ b/src/qt/walletmodeltransaction.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp
index 77efdb5cdd..a9518413c2 100644
--- a/src/qt/walletview.cpp
+++ b/src/qt/walletview.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -29,11 +29,11 @@
#include <QPushButton>
#include <QVBoxLayout>
-WalletView::WalletView(const PlatformStyle *platformStyle, QWidget *parent):
+WalletView::WalletView(const PlatformStyle *_platformStyle, QWidget *parent):
QStackedWidget(parent),
clientModel(0),
walletModel(0),
- platformStyle(platformStyle)
+ platformStyle(_platformStyle)
{
// Create tabs
overviewPage = new OverviewPage(platformStyle);
@@ -66,6 +66,7 @@ WalletView::WalletView(const PlatformStyle *platformStyle, QWidget *parent):
// Clicking on a transaction on the overview pre-selects the transaction on the transaction history page
connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), transactionView, SLOT(focusTransaction(QModelIndex)));
+ connect(overviewPage, SIGNAL(outOfSyncWarningClicked()), this, SLOT(requestedSyncWarningInfo()));
// Double-clicking on a transaction on the transaction history page shows details
connect(transactionView, SIGNAL(doubleClicked(QModelIndex)), transactionView, SLOT(showDetails()));
@@ -98,47 +99,53 @@ void WalletView::setBitcoinGUI(BitcoinGUI *gui)
// Pass through transaction notifications
connect(this, SIGNAL(incomingTransaction(QString,int,CAmount,QString,QString,QString)), gui, SLOT(incomingTransaction(QString,int,CAmount,QString,QString,QString)));
+
+ // Connect HD enabled state signal
+ connect(this, SIGNAL(hdEnabledStatusChanged(int)), gui, SLOT(setHDStatus(int)));
}
}
-void WalletView::setClientModel(ClientModel *clientModel)
+void WalletView::setClientModel(ClientModel *_clientModel)
{
- this->clientModel = clientModel;
+ this->clientModel = _clientModel;
- overviewPage->setClientModel(clientModel);
- sendCoinsPage->setClientModel(clientModel);
+ overviewPage->setClientModel(_clientModel);
+ sendCoinsPage->setClientModel(_clientModel);
}
-void WalletView::setWalletModel(WalletModel *walletModel)
+void WalletView::setWalletModel(WalletModel *_walletModel)
{
- this->walletModel = walletModel;
+ this->walletModel = _walletModel;
// Put transaction list in tabs
- transactionView->setModel(walletModel);
- overviewPage->setWalletModel(walletModel);
- receiveCoinsPage->setModel(walletModel);
- sendCoinsPage->setModel(walletModel);
- usedReceivingAddressesPage->setModel(walletModel->getAddressTableModel());
- usedSendingAddressesPage->setModel(walletModel->getAddressTableModel());
-
- if (walletModel)
+ transactionView->setModel(_walletModel);
+ overviewPage->setWalletModel(_walletModel);
+ receiveCoinsPage->setModel(_walletModel);
+ sendCoinsPage->setModel(_walletModel);
+ usedReceivingAddressesPage->setModel(_walletModel->getAddressTableModel());
+ usedSendingAddressesPage->setModel(_walletModel->getAddressTableModel());
+
+ if (_walletModel)
{
// Receive and pass through messages from wallet model
- connect(walletModel, SIGNAL(message(QString,QString,unsigned int)), this, SIGNAL(message(QString,QString,unsigned int)));
+ connect(_walletModel, SIGNAL(message(QString,QString,unsigned int)), this, SIGNAL(message(QString,QString,unsigned int)));
// Handle changes in encryption status
- connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SIGNAL(encryptionStatusChanged(int)));
+ connect(_walletModel, SIGNAL(encryptionStatusChanged(int)), this, SIGNAL(encryptionStatusChanged(int)));
updateEncryptionStatus();
+ // update HD status
+ Q_EMIT hdEnabledStatusChanged(_walletModel->hdEnabled());
+
// Balloon pop-up for new transaction
- connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
+ connect(_walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(processNewTransaction(QModelIndex,int,int)));
// Ask for passphrase if needed
- connect(walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet()));
+ connect(_walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet()));
// Show progress dialog
- connect(walletModel, SIGNAL(showProgress(QString,int)), this, SLOT(showProgress(QString,int)));
+ connect(_walletModel, SIGNAL(showProgress(QString,int)), this, SLOT(showProgress(QString,int)));
}
}
@@ -316,3 +323,8 @@ void WalletView::showProgress(const QString &title, int nProgress)
else if (progressDialog)
progressDialog->setValue(nProgress);
}
+
+void WalletView::requestedSyncWarningInfo()
+{
+ Q_EMIT outOfSyncWarningClicked();
+}
diff --git a/src/qt/walletview.h b/src/qt/walletview.h
index 2a6a6a2df2..aaa6aacbf0 100644
--- a/src/qt/walletview.h
+++ b/src/qt/walletview.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -110,6 +110,9 @@ public Q_SLOTS:
/** Show progress dialog e.g. for rescan */
void showProgress(const QString &title, int nProgress);
+ /** User has requested more information about the out of sync state */
+ void requestedSyncWarningInfo();
+
Q_SIGNALS:
/** Signal that we want to show the main window */
void showNormalIfMinimized();
@@ -117,8 +120,12 @@ Q_SIGNALS:
void message(const QString &title, const QString &message, unsigned int style);
/** Encryption status of wallet changed */
void encryptionStatusChanged(int status);
+ /** HD-Enabled status of wallet changed (only possible during startup) */
+ void hdEnabledStatusChanged(int hdEnabled);
/** Notify that a new transaction appeared */
void incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address, const QString& label);
+ /** Notify that the out of sync warning icon has been pressed */
+ void outOfSyncWarningClicked();
};
#endif // BITCOIN_QT_WALLETVIEW_H
diff --git a/src/qt/winshutdownmonitor.cpp b/src/qt/winshutdownmonitor.cpp
index 1bc4f77959..a11da50588 100644
--- a/src/qt/winshutdownmonitor.cpp
+++ b/src/qt/winshutdownmonitor.cpp
@@ -27,7 +27,7 @@ bool WinShutdownMonitor::nativeEventFilter(const QByteArray &eventType, void *pM
// Warn only once as this is performance-critical
static bool warned = false;
if (!warned) {
- LogPrint("%s: OpenSSL RAND_event() failed to seed OpenSSL PRNG with enough data.\n", __func__);
+ LogPrintf("%s: OpenSSL RAND_event() failed to seed OpenSSL PRNG with enough data.\n", __func__);
warned = true;
}
}
diff --git a/src/random.cpp b/src/random.cpp
index 0ba0de908d..d9a8cc145e 100644
--- a/src/random.cpp
+++ b/src/random.cpp
@@ -1,18 +1,21 @@
// Copyright (c) 2009-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 "random.h"
+#include "crypto/sha512.h"
#include "support/cleanse.h"
#ifdef WIN32
#include "compat.h" // for Windows API
+#include <wincrypt.h>
#endif
#include "serialize.h" // for begin_ptr(vec)
#include "util.h" // for LogPrint()
#include "utilstrencodings.h" // for GetTime()
+#include <stdlib.h>
#include <limits>
#ifndef WIN32
@@ -22,6 +25,12 @@
#include <openssl/err.h>
#include <openssl/rand.h>
+static void RandFailure()
+{
+ LogPrintf("Failed to read randomness, aborting\n");
+ abort();
+}
+
static inline int64_t GetPerformanceCounter()
{
int64_t nCounter = 0;
@@ -43,7 +52,7 @@ void RandAddSeed()
memory_cleanse((void*)&nCounter, sizeof(nCounter));
}
-void RandAddSeedPerfmon()
+static void RandAddSeedPerfmon()
{
RandAddSeed();
@@ -83,14 +92,65 @@ void RandAddSeedPerfmon()
#endif
}
+/** Get 32 bytes of system entropy. */
+static void GetOSRand(unsigned char *ent32)
+{
+#ifdef WIN32
+ HCRYPTPROV hProvider;
+ int ret = CryptAcquireContextW(&hProvider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
+ if (!ret) {
+ RandFailure();
+ }
+ ret = CryptGenRandom(hProvider, 32, ent32);
+ if (!ret) {
+ RandFailure();
+ }
+ CryptReleaseContext(hProvider, 0);
+#else
+ int f = open("/dev/urandom", O_RDONLY);
+ if (f == -1) {
+ RandFailure();
+ }
+ int have = 0;
+ do {
+ ssize_t n = read(f, ent32 + have, 32 - have);
+ if (n <= 0 || n + have > 32) {
+ RandFailure();
+ }
+ have += n;
+ } while (have < 32);
+ close(f);
+#endif
+}
+
void GetRandBytes(unsigned char* buf, int num)
{
if (RAND_bytes(buf, num) != 1) {
- LogPrintf("%s: OpenSSL RAND_bytes() failed with error: %s\n", __func__, ERR_error_string(ERR_get_error(), NULL));
- assert(false);
+ RandFailure();
}
}
+void GetStrongRandBytes(unsigned char* out, int num)
+{
+ assert(num <= 32);
+ CSHA512 hasher;
+ unsigned char buf[64];
+
+ // First source: OpenSSL's RNG
+ RandAddSeedPerfmon();
+ GetRandBytes(buf, 32);
+ hasher.Write(buf, 32);
+
+ // Second source: OS RNG
+ GetOSRand(buf);
+ hasher.Write(buf, 32);
+
+ // Produce output
+ hasher.Finalize(buf);
+ memcpy(out, buf, num);
+ memory_cleanse(buf, 64);
+}
+
uint64_t GetRand(uint64_t nMax)
{
if (nMax == 0)
diff --git a/src/random.h b/src/random.h
index 1a2d3e8ee2..31b80bd565 100644
--- a/src/random.h
+++ b/src/random.h
@@ -10,11 +10,8 @@
#include <stdint.h>
-/**
- * Seed OpenSSL PRNG with additional entropy data
- */
+/* Seed OpenSSL PRNG with additional entropy data */
void RandAddSeed();
-void RandAddSeedPerfmon();
/**
* Functions to gather random data via the OpenSSL PRNG
@@ -25,6 +22,12 @@ int GetRandInt(int nMax);
uint256 GetRandHash();
/**
+ * Function to gather random data from multiple sources, failing whenever any
+ * of those source fail to provide a result.
+ */
+void GetStrongRandBytes(unsigned char* buf, int num);
+
+/**
* Seed insecure_rand using the random pool.
* @param Deterministic Use a deterministic seed
*/
diff --git a/src/rest.cpp b/src/rest.cpp
index 2ad7bc1065..c815592124 100644
--- a/src/rest.cpp
+++ b/src/rest.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -9,7 +9,7 @@
#include "primitives/transaction.h"
#include "main.h"
#include "httpserver.h"
-#include "rpcserver.h"
+#include "rpc/server.h"
#include "streams.h"
#include "sync.h"
#include "txmempool.h"
@@ -273,6 +273,9 @@ static bool rest_block_notxdetails(HTTPRequest* req, const std::string& strURIPa
return rest_block(req, strURIPart, false);
}
+// A bit of a hack - dependency on a function defined in rpc/blockchain.cpp
+UniValue getblockchaininfo(const UniValue& params, bool fHelp);
+
static bool rest_chaininfo(HTTPRequest* req, const std::string& strURIPart)
{
if (!CheckWarmup(req))
@@ -417,7 +420,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
// throw exception in case of a empty request
std::string strRequestMutable = req->ReadBody();
if (strRequestMutable.length() == 0 && uriParts.size() == 0)
- return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
+ return RESTERR(req, HTTP_BAD_REQUEST, "Error: empty request");
bool fInputParsed = false;
bool fCheckMemPool = false;
@@ -441,7 +444,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
std::string strOutput = uriParts[i].substr(uriParts[i].find("-")+1);
if (!ParseInt32(strOutput, &nOutput) || !IsHex(strTxid))
- return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Parse error");
+ return RESTERR(req, HTTP_BAD_REQUEST, "Parse error");
txid.SetHex(strTxid);
vOutPoints.push_back(COutPoint(txid, (uint32_t)nOutput));
@@ -450,7 +453,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
if (vOutPoints.size() > 0)
fInputParsed = true;
else
- return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
+ return RESTERR(req, HTTP_BAD_REQUEST, "Error: empty request");
}
switch (rf) {
@@ -466,7 +469,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
if (strRequestMutable.size() > 0)
{
if (fInputParsed) //don't allow sending input over URI and HTTP RAW DATA
- return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Combination of URI scheme inputs and raw post data is not allowed");
+ return RESTERR(req, HTTP_BAD_REQUEST, "Combination of URI scheme inputs and raw post data is not allowed");
CDataStream oss(SER_NETWORK, PROTOCOL_VERSION);
oss << strRequestMutable;
@@ -475,14 +478,14 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
}
} catch (const std::ios_base::failure& e) {
// abort in case of unreadable binary data
- return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Parse error");
+ return RESTERR(req, HTTP_BAD_REQUEST, "Parse error");
}
break;
}
case RF_JSON: {
if (!fInputParsed)
- return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
+ return RESTERR(req, HTTP_BAD_REQUEST, "Error: empty request");
break;
}
default: {
@@ -492,7 +495,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
// limit max outpoints
if (vOutPoints.size() > MAX_GETUTXOS_OUTPOINTS)
- return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, strprintf("Error: max outpoints exceeded (max: %d, tried: %d)", MAX_GETUTXOS_OUTPOINTS, vOutPoints.size()));
+ return RESTERR(req, HTTP_BAD_REQUEST, 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-readable string representation)
vector<unsigned char> bitmap;
diff --git a/src/reverselock.h b/src/reverselock.h
index 567636e16a..1fd8de5d80 100644
--- a/src/reverselock.h
+++ b/src/reverselock.h
@@ -13,12 +13,14 @@ class reverse_lock
{
public:
- explicit reverse_lock(Lock& lock) : lock(lock) {
- lock.unlock();
+ explicit reverse_lock(Lock& _lock) : lock(_lock) {
+ _lock.unlock();
+ _lock.swap(templock);
}
~reverse_lock() {
- lock.lock();
+ templock.lock();
+ templock.swap(lock);
}
private:
@@ -26,6 +28,7 @@ private:
reverse_lock& operator=(reverse_lock const&);
Lock& lock;
+ Lock templock;
};
#endif // BITCOIN_REVERSELOCK_H
diff --git a/src/rpcblockchain.cpp b/src/rpc/blockchain.cpp
index ee04636ce8..1e04fcc01c 100644
--- a/src/rpcblockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -1,5 +1,5 @@
// 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.
@@ -12,19 +12,34 @@
#include "main.h"
#include "policy/policy.h"
#include "primitives/transaction.h"
-#include "rpcserver.h"
+#include "rpc/server.h"
#include "streams.h"
#include "sync.h"
#include "txmempool.h"
#include "util.h"
#include "utilstrencodings.h"
+#include "hash.h"
#include <stdint.h>
#include <univalue.h>
+#include <boost/thread/thread.hpp> // boost::thread::interrupt
+
+#include <mutex>
+#include <condition_variable>
using namespace std;
+struct CUpdatedBlock
+{
+ uint256 hash;
+ int height;
+};
+
+static std::mutex cs_blockchange;
+static std::condition_variable cond_blockchange;
+static CUpdatedBlock latestblock;
+
extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry);
void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex);
@@ -70,6 +85,7 @@ UniValue blockheaderToJSON(const CBlockIndex* blockindex)
result.push_back(Pair("confirmations", confirmations));
result.push_back(Pair("height", blockindex->nHeight));
result.push_back(Pair("version", blockindex->nVersion));
+ result.push_back(Pair("versionHex", strprintf("%08x", blockindex->nVersion)));
result.push_back(Pair("merkleroot", blockindex->hashMerkleRoot.GetHex()));
result.push_back(Pair("time", (int64_t)blockindex->nTime));
result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast()));
@@ -89,15 +105,18 @@ UniValue blockheaderToJSON(const CBlockIndex* blockindex)
UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false)
{
UniValue result(UniValue::VOBJ);
- result.push_back(Pair("hash", block.GetHash().GetHex()));
+ 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("strippedsize", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS)));
result.push_back(Pair("size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION)));
+ result.push_back(Pair("weight", (int)::GetBlockWeight(block)));
result.push_back(Pair("height", blockindex->nHeight));
result.push_back(Pair("version", block.nVersion));
+ result.push_back(Pair("versionHex", strprintf("%08x", block.nVersion)));
result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex()));
UniValue txs(UniValue::VARR);
BOOST_FOREACH(const CTransaction&tx, block.vtx)
@@ -161,6 +180,138 @@ UniValue getbestblockhash(const UniValue& params, bool fHelp)
return chainActive.Tip()->GetBlockHash().GetHex();
}
+void RPCNotifyBlockChange(bool ibd, const CBlockIndex * pindex)
+{
+ if(pindex) {
+ std::lock_guard<std::mutex> lock(cs_blockchange);
+ latestblock.hash = pindex->GetBlockHash();
+ latestblock.height = pindex->nHeight;
+ }
+ cond_blockchange.notify_all();
+}
+
+UniValue waitfornewblock(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() > 1)
+ throw runtime_error(
+ "waitfornewblock\n"
+ "\nWaits for a specific new block and returns useful info about it.\n"
+ "\nReturns the current block on timeout or exit.\n"
+ "\nArguments:\n"
+ "1. timeout (milliseconds) (int, optional, default=false)\n"
+ "\nResult::\n"
+ "{ (json object)\n"
+ " \"hash\" : { (string) The blockhash\n"
+ " \"height\" : { (int) Block height\n"
+ "}\n"
+ "\nExamples\n"
+ + HelpExampleCli("waitfornewblock", "1000")
+ + HelpExampleRpc("waitfornewblock", "1000")
+ );
+ int timeout = 0;
+ if (params.size() > 0)
+ timeout = params[0].get_int();
+
+ CUpdatedBlock block;
+ {
+ std::unique_lock<std::mutex> lock(cs_blockchange);
+ block = latestblock;
+ if(timeout)
+ cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&block]{return latestblock.height != block.height || latestblock.hash != block.hash || !IsRPCRunning(); });
+ else
+ cond_blockchange.wait(lock, [&block]{return latestblock.height != block.height || latestblock.hash != block.hash || !IsRPCRunning(); });
+ block = latestblock;
+ }
+ UniValue ret(UniValue::VOBJ);
+ ret.push_back(Pair("hash", block.hash.GetHex()));
+ ret.push_back(Pair("height", block.height));
+ return ret;
+}
+
+UniValue waitforblock(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() < 1 || params.size() > 2)
+ throw runtime_error(
+ "waitforblock\n"
+ "\nWaits for a specific new block and returns useful info about it.\n"
+ "\nReturns the current block on timeout or exit.\n"
+ "\nArguments:\n"
+ "1. blockhash to wait for (string)\n"
+ "2. timeout (milliseconds) (int, optional, default=false)\n"
+ "\nResult::\n"
+ "{ (json object)\n"
+ " \"hash\" : { (string) The blockhash\n"
+ " \"height\" : { (int) Block height\n"
+ "}\n"
+ "\nExamples\n"
+ + HelpExampleCli("waitforblock", "\"0000000000079f8ef3d2c688c244eb7a4570b24c9ed7b4a8c619eb02596f8862\", 1000")
+ + HelpExampleRpc("waitforblock", "\"0000000000079f8ef3d2c688c244eb7a4570b24c9ed7b4a8c619eb02596f8862\", 1000")
+ );
+ int timeout = 0;
+
+ uint256 hash = uint256S(params[0].get_str());
+
+ if (params.size() > 1)
+ timeout = params[1].get_int();
+
+ CUpdatedBlock block;
+ {
+ std::unique_lock<std::mutex> lock(cs_blockchange);
+ if(timeout)
+ cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&hash]{return latestblock.hash == hash || !IsRPCRunning();});
+ else
+ cond_blockchange.wait(lock, [&hash]{return latestblock.hash == hash || !IsRPCRunning(); });
+ block = latestblock;
+ }
+
+ UniValue ret(UniValue::VOBJ);
+ ret.push_back(Pair("hash", block.hash.GetHex()));
+ ret.push_back(Pair("height", block.height));
+ return ret;
+}
+
+UniValue waitforblockheight(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() < 1 || params.size() > 2)
+ throw runtime_error(
+ "waitforblock\n"
+ "\nWaits for (at least) block height and returns the height and hash\n"
+ "\nof the current tip.\n"
+ "\nReturns the current block on timeout or exit.\n"
+ "\nArguments:\n"
+ "1. block height to wait for (int)\n"
+ "2. timeout (milliseconds) (int, optional, default=false)\n"
+ "\nResult::\n"
+ "{ (json object)\n"
+ " \"hash\" : { (string) The blockhash\n"
+ " \"height\" : { (int) Block height\n"
+ "}\n"
+ "\nExamples\n"
+ + HelpExampleCli("waitforblockheight", "\"100\", 1000")
+ + HelpExampleRpc("waitforblockheight", "\"100\", 1000")
+ );
+ int timeout = 0;
+
+ int height = params[0].get_int();
+
+ if (params.size() > 1)
+ timeout = params[1].get_int();
+
+ CUpdatedBlock block;
+ {
+ std::unique_lock<std::mutex> lock(cs_blockchange);
+ if(timeout)
+ cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&height]{return latestblock.height >= height || !IsRPCRunning();});
+ else
+ cond_blockchange.wait(lock, [&height]{return latestblock.height >= height || !IsRPCRunning(); });
+ block = latestblock;
+ }
+ UniValue ret(UniValue::VOBJ);
+ ret.push_back(Pair("hash", block.hash.GetHex()));
+ ret.push_back(Pair("height", block.height));
+ return ret;
+}
+
UniValue getdifficulty(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
@@ -178,6 +329,60 @@ UniValue getdifficulty(const UniValue& params, bool fHelp)
return GetDifficulty();
}
+std::string EntryDescriptionString()
+{
+ return " \"size\" : n, (numeric) transaction size in bytes\n"
+ " \"fee\" : n, (numeric) transaction fee in " + CURRENCY_UNIT + "\n"
+ " \"modifiedfee\" : n, (numeric) transaction fee with fee deltas used for mining priority\n"
+ " \"time\" : n, (numeric) local time transaction entered pool in seconds since 1 Jan 1970 GMT\n"
+ " \"height\" : n, (numeric) block height when transaction entered pool\n"
+ " \"startingpriority\" : n, (numeric) priority when transaction entered pool\n"
+ " \"currentpriority\" : n, (numeric) transaction priority now\n"
+ " \"descendantcount\" : n, (numeric) number of in-mempool descendant transactions (including this one)\n"
+ " \"descendantsize\" : n, (numeric) size of in-mempool descendants (including this one)\n"
+ " \"descendantfees\" : n, (numeric) modified fees (see above) of in-mempool descendants (including this one)\n"
+ " \"ancestorcount\" : n, (numeric) number of in-mempool ancestor transactions (including this one)\n"
+ " \"ancestorsize\" : n, (numeric) size of in-mempool ancestors (including this one)\n"
+ " \"ancestorfees\" : n, (numeric) modified fees (see above) of in-mempool ancestors (including this one)\n"
+ " \"depends\" : [ (array) unconfirmed transactions used as inputs for this transaction\n"
+ " \"transactionid\", (string) parent transaction id\n"
+ " ... ]\n";
+}
+
+void entryToJSON(UniValue &info, const CTxMemPoolEntry &e)
+{
+ AssertLockHeld(mempool.cs);
+
+ info.push_back(Pair("size", (int)e.GetTxSize()));
+ info.push_back(Pair("fee", ValueFromAmount(e.GetFee())));
+ info.push_back(Pair("modifiedfee", ValueFromAmount(e.GetModifiedFee())));
+ info.push_back(Pair("time", e.GetTime()));
+ info.push_back(Pair("height", (int)e.GetHeight()));
+ info.push_back(Pair("startingpriority", e.GetPriority(e.GetHeight())));
+ info.push_back(Pair("currentpriority", e.GetPriority(chainActive.Height())));
+ info.push_back(Pair("descendantcount", e.GetCountWithDescendants()));
+ info.push_back(Pair("descendantsize", e.GetSizeWithDescendants()));
+ info.push_back(Pair("descendantfees", e.GetModFeesWithDescendants()));
+ info.push_back(Pair("ancestorcount", e.GetCountWithAncestors()));
+ info.push_back(Pair("ancestorsize", e.GetSizeWithAncestors()));
+ info.push_back(Pair("ancestorfees", e.GetModFeesWithAncestors()));
+ const CTransaction& tx = e.GetTx();
+ set<string> setDepends;
+ BOOST_FOREACH(const CTxIn& txin, tx.vin)
+ {
+ if (mempool.exists(txin.prevout.hash))
+ setDepends.insert(txin.prevout.hash.ToString());
+ }
+
+ UniValue depends(UniValue::VARR);
+ BOOST_FOREACH(const string& dep, setDepends)
+ {
+ depends.push_back(dep);
+ }
+
+ info.push_back(Pair("depends", depends));
+}
+
UniValue mempoolToJSON(bool fVerbose = false)
{
if (fVerbose)
@@ -188,31 +393,7 @@ UniValue mempoolToJSON(bool fVerbose = false)
{
const uint256& hash = e.GetTx().GetHash();
UniValue info(UniValue::VOBJ);
- info.push_back(Pair("size", (int)e.GetTxSize()));
- info.push_back(Pair("fee", ValueFromAmount(e.GetFee())));
- info.push_back(Pair("modifiedfee", ValueFromAmount(e.GetModifiedFee())));
- info.push_back(Pair("time", e.GetTime()));
- info.push_back(Pair("height", (int)e.GetHeight()));
- info.push_back(Pair("startingpriority", e.GetPriority(e.GetHeight())));
- info.push_back(Pair("currentpriority", e.GetPriority(chainActive.Height())));
- info.push_back(Pair("descendantcount", e.GetCountWithDescendants()));
- info.push_back(Pair("descendantsize", e.GetSizeWithDescendants()));
- info.push_back(Pair("descendantfees", e.GetFeesWithDescendants()));
- const CTransaction& tx = e.GetTx();
- set<string> setDepends;
- BOOST_FOREACH(const CTxIn& txin, tx.vin)
- {
- if (mempool.exists(txin.prevout.hash))
- setDepends.insert(txin.prevout.hash.ToString());
- }
-
- UniValue depends(UniValue::VARR);
- BOOST_FOREACH(const string& dep, setDepends)
- {
- depends.push_back(dep);
- }
-
- info.push_back(Pair("depends", depends));
+ entryToJSON(info, e);
o.push_back(Pair(hash.ToString(), info));
}
return o;
@@ -246,28 +427,14 @@ UniValue getrawmempool(const UniValue& params, bool fHelp)
"\nResult: (for verbose = true):\n"
"{ (json object)\n"
" \"transactionid\" : { (json object)\n"
- " \"size\" : n, (numeric) transaction size in bytes\n"
- " \"fee\" : n, (numeric) transaction fee in " + CURRENCY_UNIT + "\n"
- " \"modifiedfee\" : n, (numeric) transaction fee with fee deltas used for mining priority\n"
- " \"time\" : n, (numeric) local time transaction entered pool in seconds since 1 Jan 1970 GMT\n"
- " \"height\" : n, (numeric) block height when transaction entered pool\n"
- " \"startingpriority\" : n, (numeric) priority when transaction entered pool\n"
- " \"currentpriority\" : n, (numeric) transaction priority now\n"
- " \"descendantcount\" : n, (numeric) number of in-mempool descendant transactions (including this one)\n"
- " \"descendantsize\" : n, (numeric) size of in-mempool descendants (including this one)\n"
- " \"descendantfees\" : n, (numeric) fees of in-mempool descendants (including this one)\n"
- " \"depends\" : [ (array) unconfirmed transactions used as inputs for this transaction\n"
- " \"transactionid\", (string) parent transaction id\n"
- " ... ]\n"
- " }, ...\n"
+ + EntryDescriptionString()
+ + " }, ...\n"
"}\n"
"\nExamples\n"
+ HelpExampleCli("getrawmempool", "true")
+ HelpExampleRpc("getrawmempool", "true")
);
- LOCK(cs_main);
-
bool fVerbose = false;
if (params.size() > 0)
fVerbose = params[0].get_bool();
@@ -275,6 +442,167 @@ UniValue getrawmempool(const UniValue& params, bool fHelp)
return mempoolToJSON(fVerbose);
}
+UniValue getmempoolancestors(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() < 1 || params.size() > 2) {
+ throw runtime_error(
+ "getmempoolancestors txid (verbose)\n"
+ "\nIf txid is in the mempool, returns all in-mempool ancestors.\n"
+ "\nArguments:\n"
+ "1. \"txid\" (string, required) The transaction id (must be in mempool)\n"
+ "2. verbose (boolean, optional, default=false) true for a json object, false for array of transaction ids\n"
+ "\nResult (for verbose=false):\n"
+ "[ (json array of strings)\n"
+ " \"transactionid\" (string) The transaction id of an in-mempool ancestor transaction\n"
+ " ,...\n"
+ "]\n"
+ "\nResult (for verbose=true):\n"
+ "{ (json object)\n"
+ " \"transactionid\" : { (json object)\n"
+ + EntryDescriptionString()
+ + " }, ...\n"
+ "}\n"
+ "\nExamples\n"
+ + HelpExampleCli("getmempoolancestors", "\"mytxid\"")
+ + HelpExampleRpc("getmempoolancestors", "\"mytxid\"")
+ );
+ }
+
+ bool fVerbose = false;
+ if (params.size() > 1)
+ fVerbose = params[1].get_bool();
+
+ uint256 hash = ParseHashV(params[0], "parameter 1");
+
+ LOCK(mempool.cs);
+
+ CTxMemPool::txiter it = mempool.mapTx.find(hash);
+ if (it == mempool.mapTx.end()) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not in mempool");
+ }
+
+ CTxMemPool::setEntries setAncestors;
+ uint64_t noLimit = std::numeric_limits<uint64_t>::max();
+ std::string dummy;
+ mempool.CalculateMemPoolAncestors(*it, setAncestors, noLimit, noLimit, noLimit, noLimit, dummy, false);
+
+ if (!fVerbose) {
+ UniValue o(UniValue::VARR);
+ BOOST_FOREACH(CTxMemPool::txiter ancestorIt, setAncestors) {
+ o.push_back(ancestorIt->GetTx().GetHash().ToString());
+ }
+
+ return o;
+ } else {
+ UniValue o(UniValue::VOBJ);
+ BOOST_FOREACH(CTxMemPool::txiter ancestorIt, setAncestors) {
+ const CTxMemPoolEntry &e = *ancestorIt;
+ const uint256& _hash = e.GetTx().GetHash();
+ UniValue info(UniValue::VOBJ);
+ entryToJSON(info, e);
+ o.push_back(Pair(_hash.ToString(), info));
+ }
+ return o;
+ }
+}
+
+UniValue getmempooldescendants(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() < 1 || params.size() > 2) {
+ throw runtime_error(
+ "getmempooldescendants txid (verbose)\n"
+ "\nIf txid is in the mempool, returns all in-mempool descendants.\n"
+ "\nArguments:\n"
+ "1. \"txid\" (string, required) The transaction id (must be in mempool)\n"
+ "2. verbose (boolean, optional, default=false) true for a json object, false for array of transaction ids\n"
+ "\nResult (for verbose=false):\n"
+ "[ (json array of strings)\n"
+ " \"transactionid\" (string) The transaction id of an in-mempool descendant transaction\n"
+ " ,...\n"
+ "]\n"
+ "\nResult (for verbose=true):\n"
+ "{ (json object)\n"
+ " \"transactionid\" : { (json object)\n"
+ + EntryDescriptionString()
+ + " }, ...\n"
+ "}\n"
+ "\nExamples\n"
+ + HelpExampleCli("getmempooldescendants", "\"mytxid\"")
+ + HelpExampleRpc("getmempooldescendants", "\"mytxid\"")
+ );
+ }
+
+ bool fVerbose = false;
+ if (params.size() > 1)
+ fVerbose = params[1].get_bool();
+
+ uint256 hash = ParseHashV(params[0], "parameter 1");
+
+ LOCK(mempool.cs);
+
+ CTxMemPool::txiter it = mempool.mapTx.find(hash);
+ if (it == mempool.mapTx.end()) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not in mempool");
+ }
+
+ CTxMemPool::setEntries setDescendants;
+ mempool.CalculateDescendants(it, setDescendants);
+ // CTxMemPool::CalculateDescendants will include the given tx
+ setDescendants.erase(it);
+
+ if (!fVerbose) {
+ UniValue o(UniValue::VARR);
+ BOOST_FOREACH(CTxMemPool::txiter descendantIt, setDescendants) {
+ o.push_back(descendantIt->GetTx().GetHash().ToString());
+ }
+
+ return o;
+ } else {
+ UniValue o(UniValue::VOBJ);
+ BOOST_FOREACH(CTxMemPool::txiter descendantIt, setDescendants) {
+ const CTxMemPoolEntry &e = *descendantIt;
+ const uint256& _hash = e.GetTx().GetHash();
+ UniValue info(UniValue::VOBJ);
+ entryToJSON(info, e);
+ o.push_back(Pair(_hash.ToString(), info));
+ }
+ return o;
+ }
+}
+
+UniValue getmempoolentry(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() != 1) {
+ throw runtime_error(
+ "getmempoolentry txid\n"
+ "\nReturns mempool data for given transaction\n"
+ "\nArguments:\n"
+ "1. \"txid\" (string, required) The transaction id (must be in mempool)\n"
+ "\nResult:\n"
+ "{ (json object)\n"
+ + EntryDescriptionString()
+ + "}\n"
+ "\nExamples\n"
+ + HelpExampleCli("getmempoolentry", "\"mytxid\"")
+ + HelpExampleRpc("getmempoolentry", "\"mytxid\"")
+ );
+ }
+
+ uint256 hash = ParseHashV(params[0], "parameter 1");
+
+ LOCK(mempool.cs);
+
+ CTxMemPool::txiter it = mempool.mapTx.find(hash);
+ if (it == mempool.mapTx.end()) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not in mempool");
+ }
+
+ const CTxMemPoolEntry &e = *it;
+ UniValue info(UniValue::VOBJ);
+ entryToJSON(info, e);
+ return info;
+}
+
UniValue getblockhash(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
@@ -316,6 +644,7 @@ UniValue getblockheader(const UniValue& params, bool fHelp)
" \"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"
+ " \"versionHex\" : \"00000000\", (string) The block version formatted in hexadecimal\n"
" \"merkleroot\" : \"xxxx\", (string) The merkle root\n"
" \"time\" : ttt, (numeric) The block time in seconds since epoch (Jan 1 1970 GMT)\n"
" \"mediantime\" : ttt, (numeric) The median block time in seconds since epoch (Jan 1 1970 GMT)\n"
@@ -323,7 +652,8 @@ UniValue getblockheader(const UniValue& params, bool fHelp)
" \"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"
+ " \"nextblockhash\" : \"hash\", (string) The hash of the next block\n"
+ " \"chainwork\" : \"0000...1f3\" (string) Expected number of hashes required to produce the current chain (in hex)\n"
"}\n"
"\nResult (for verbose=false):\n"
"\"data\" (string) A string that is serialized, hex-encoded data for block 'hash'.\n"
@@ -372,8 +702,11 @@ UniValue getblock(const UniValue& params, bool fHelp)
" \"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"
" \"size\" : n, (numeric) The block size\n"
+ " \"strippedsize\" : n, (numeric) The block size excluding witness data\n"
+ " \"weight\" : n (numeric) The block weight (BIP 141)\n"
" \"height\" : n, (numeric) The block height or index\n"
" \"version\" : n, (numeric) The block version\n"
+ " \"versionHex\" : \"00000000\", (string) The block version formatted in hexadecimal\n"
" \"merkleroot\" : \"xxxx\", (string) The merkle root\n"
" \"tx\" : [ (array of string) The transaction ids\n"
" \"transactionid\" (string) The transaction id\n"
@@ -384,6 +717,7 @@ UniValue getblock(const UniValue& params, bool fHelp)
" \"nonce\" : n, (numeric) The nonce\n"
" \"bits\" : \"1d00ffff\", (string) The bits\n"
" \"difficulty\" : x.xxx, (numeric) The difficulty\n"
+ " \"chainwork\" : \"xxxx\", (string) Expected number of hashes required to produce the chain up to this block (in hex)\n"
" \"previousblockhash\" : \"hash\", (string) The hash of the previous block\n"
" \"nextblockhash\" : \"hash\" (string) The hash of the next block\n"
"}\n"
@@ -426,6 +760,60 @@ UniValue getblock(const UniValue& params, bool fHelp)
return blockToJSON(block, pblockindex);
}
+struct CCoinsStats
+{
+ int nHeight;
+ uint256 hashBlock;
+ uint64_t nTransactions;
+ uint64_t nTransactionOutputs;
+ uint64_t nSerializedSize;
+ uint256 hashSerialized;
+ CAmount nTotalAmount;
+
+ CCoinsStats() : nHeight(0), nTransactions(0), nTransactionOutputs(0), nSerializedSize(0), nTotalAmount(0) {}
+};
+
+//! Calculate statistics about the unspent transaction output set
+static bool GetUTXOStats(CCoinsView *view, CCoinsStats &stats)
+{
+ std::unique_ptr<CCoinsViewCursor> pcursor(view->Cursor());
+
+ CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
+ stats.hashBlock = pcursor->GetBestBlock();
+ {
+ LOCK(cs_main);
+ stats.nHeight = mapBlockIndex.find(stats.hashBlock)->second->nHeight;
+ }
+ ss << stats.hashBlock;
+ CAmount nTotalAmount = 0;
+ while (pcursor->Valid()) {
+ boost::this_thread::interruption_point();
+ uint256 key;
+ CCoins coins;
+ if (pcursor->GetKey(key) && pcursor->GetValue(coins)) {
+ stats.nTransactions++;
+ ss << key;
+ for (unsigned int i=0; i<coins.vout.size(); i++) {
+ const CTxOut &out = coins.vout[i];
+ if (!out.IsNull()) {
+ stats.nTransactionOutputs++;
+ ss << VARINT(i+1);
+ ss << out;
+ nTotalAmount += out.nValue;
+ }
+ }
+ stats.nSerializedSize += 32 + pcursor->GetValueSize();
+ ss << VARINT(0);
+ } else {
+ return error("%s: unable to read value", __func__);
+ }
+ pcursor->Next();
+ }
+ stats.hashSerialized = ss.GetHash();
+ stats.nTotalAmount = nTotalAmount;
+ return true;
+}
+
UniValue gettxoutsetinfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
@@ -452,7 +840,7 @@ UniValue gettxoutsetinfo(const UniValue& params, bool fHelp)
CCoinsStats stats;
FlushStateToDisk();
- if (pcoinsTip->GetStats(stats)) {
+ if (GetUTXOStats(pcoinsTip, stats)) {
ret.push_back(Pair("height", (int64_t)stats.nHeight));
ret.push_back(Pair("bestblock", stats.hashBlock.GetHex()));
ret.push_back(Pair("transactions", (int64_t)stats.nTransactions));
@@ -460,6 +848,8 @@ UniValue gettxoutsetinfo(const UniValue& params, bool fHelp)
ret.push_back(Pair("bytes_serialized", (int64_t)stats.nSerializedSize));
ret.push_back(Pair("hash_serialized", stats.hashSerialized.GetHex()));
ret.push_back(Pair("total_amount", ValueFromAmount(stats.nTotalAmount)));
+ } else {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to read UTXO set");
}
return ret;
}
@@ -472,8 +862,8 @@ UniValue gettxout(const UniValue& params, bool fHelp)
"\nReturns details about an unspent transaction output.\n"
"\nArguments:\n"
"1. \"txid\" (string, required) The transaction id\n"
- "2. n (numeric, required) vout value\n"
- "3. includemempool (boolean, optional) Whether to included the mem pool\n"
+ "2. n (numeric, required) vout number\n"
+ "3. includemempool (boolean, optional) Whether to include the mem pool\n"
"\nResult:\n"
"{\n"
" \"bestblock\" : \"hash\", (string) the block hash\n"
@@ -573,22 +963,23 @@ UniValue verifychain(const UniValue& params, bool fHelp)
}
/** Implementation of IsSuperMajority with better feedback */
-static UniValue SoftForkMajorityDesc(int minVersion, CBlockIndex* pindex, int nRequired, const Consensus::Params& consensusParams)
+static UniValue SoftForkMajorityDesc(int version, CBlockIndex* pindex, const Consensus::Params& consensusParams)
{
- int nFound = 0;
- CBlockIndex* pstart = pindex;
- for (int i = 0; i < consensusParams.nMajorityWindow && pstart != NULL; i++)
+ UniValue rv(UniValue::VOBJ);
+ bool activated = false;
+ switch(version)
{
- if (pstart->nVersion >= minVersion)
- ++nFound;
- pstart = pstart->pprev;
+ case 2:
+ activated = pindex->nHeight >= consensusParams.BIP34Height;
+ break;
+ case 3:
+ activated = pindex->nHeight >= consensusParams.BIP66Height;
+ break;
+ case 4:
+ activated = pindex->nHeight >= consensusParams.BIP65Height;
+ break;
}
-
- 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));
+ rv.push_back(Pair("status", activated));
return rv;
}
@@ -597,11 +988,39 @@ static UniValue SoftForkDesc(const std::string &name, int version, CBlockIndex*
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)));
+ rv.push_back(Pair("reject", SoftForkMajorityDesc(version, pindex, consensusParams)));
+ return rv;
+}
+
+static UniValue BIP9SoftForkDesc(const Consensus::Params& consensusParams, Consensus::DeploymentPos id)
+{
+ UniValue rv(UniValue::VOBJ);
+ const ThresholdState thresholdState = VersionBitsTipState(consensusParams, id);
+ switch (thresholdState) {
+ case THRESHOLD_DEFINED: rv.push_back(Pair("status", "defined")); break;
+ case THRESHOLD_STARTED: rv.push_back(Pair("status", "started")); break;
+ case THRESHOLD_LOCKED_IN: rv.push_back(Pair("status", "locked_in")); break;
+ case THRESHOLD_ACTIVE: rv.push_back(Pair("status", "active")); break;
+ case THRESHOLD_FAILED: rv.push_back(Pair("status", "failed")); break;
+ }
+ if (THRESHOLD_STARTED == thresholdState)
+ {
+ rv.push_back(Pair("bit", consensusParams.vDeployments[id].bit));
+ }
+ rv.push_back(Pair("startTime", consensusParams.vDeployments[id].nStartTime));
+ rv.push_back(Pair("timeout", consensusParams.vDeployments[id].nTimeout));
return rv;
}
+void BIP9SoftForkDescPushBack(UniValue& bip9_softforks, const std::string &name, const Consensus::Params& consensusParams, Consensus::DeploymentPos id)
+{
+ // Deployments with timeout value of 0 are hidden.
+ // A timeout value of 0 guarantees a softfork will never be activated.
+ // This is used when softfork codes are merged without specifying the deployment schedule.
+ if (consensusParams.vDeployments[id].nTimeout > 0)
+ bip9_softforks.push_back(Pair(name, BIP9SoftForkDesc(consensusParams, id)));
+}
+
UniValue getblockchaininfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
@@ -619,20 +1038,24 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp)
" \"verificationprogress\": xxxx, (numeric) estimate of verification progress [0..1]\n"
" \"chainwork\": \"xxxx\" (string) total amount of work in active chain, in hexadecimal\n"
" \"pruned\": xx, (boolean) if the blocks are subject to pruning\n"
- " \"pruneheight\": xxxxxx, (numeric) heighest block available\n"
+ " \"pruneheight\": xxxxxx, (numeric) lowest-height complete block stored\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"
+ " \"reject\": { (object) progress toward rejecting pre-softfork 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"
+ " \"bip9_softforks\": { (object) status of BIP9 softforks in progress\n"
+ " \"xxxx\" : { (string) name of the softfork\n"
+ " \"status\": \"xxxx\", (string) one of \"defined\", \"started\", \"locked_in\", \"active\", \"failed\"\n"
+ " \"bit\": xx, (numeric) the bit (0-28) in the block version field used to signal this softfork (only for \"started\" status)\n"
+ " \"startTime\": xx, (numeric) the minimum median time past of a block at which the bit gains its meaning\n"
+ " \"timeout\": xx (numeric) the median time past of a block at which the deployment is considered failed if not yet locked in\n"
+ " }\n"
+ " }\n"
"}\n"
"\nExamples:\n"
+ HelpExampleCli("getblockchaininfo", "")
@@ -655,10 +1078,14 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp)
const Consensus::Params& consensusParams = Params().GetConsensus();
CBlockIndex* tip = chainActive.Tip();
UniValue softforks(UniValue::VARR);
+ UniValue bip9_softforks(UniValue::VOBJ);
softforks.push_back(SoftForkDesc("bip34", 2, tip, consensusParams));
softforks.push_back(SoftForkDesc("bip66", 3, tip, consensusParams));
softforks.push_back(SoftForkDesc("bip65", 4, tip, consensusParams));
+ BIP9SoftForkDescPushBack(bip9_softforks, "csv", consensusParams, Consensus::DEPLOYMENT_CSV);
+ BIP9SoftForkDescPushBack(bip9_softforks, "segwit", consensusParams, Consensus::DEPLOYMENT_SEGWIT);
obj.push_back(Pair("softforks", softforks));
+ obj.push_back(Pair("bip9_softforks", bip9_softforks));
if (fPruneMode)
{
@@ -721,17 +1148,30 @@ UniValue getchaintips(const UniValue& params, bool fHelp)
LOCK(cs_main);
- /* Build up a list of chain tips. We start with the list of all
- known blocks, and successively remove blocks that appear as pprev
- of another block. */
+ /*
+ * Idea: the set of chain tips is chainActive.tip, plus orphan blocks which do not have another orphan building off of them.
+ * Algorithm:
+ * - Make one pass through mapBlockIndex, picking out the orphan blocks, and also storing a set of the orphan block's pprev pointers.
+ * - Iterate through the orphan blocks. If the block isn't pointed to by another orphan, it is a chain tip.
+ * - add chainActive.Tip()
+ */
std::set<const CBlockIndex*, CompareBlocksByHeight> setTips;
+ std::set<const CBlockIndex*> setOrphans;
+ std::set<const CBlockIndex*> setPrevs;
+
BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex)
- setTips.insert(item.second);
- BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex)
{
- const CBlockIndex* pprev = item.second->pprev;
- if (pprev)
- setTips.erase(pprev);
+ if (!chainActive.Contains(item.second)) {
+ setOrphans.insert(item.second);
+ setPrevs.insert(item.second->pprev);
+ }
+ }
+
+ for (std::set<const CBlockIndex*>::iterator it = setOrphans.begin(); it != setOrphans.end(); ++it)
+ {
+ if (setPrevs.erase(*it) == 0) {
+ setTips.insert(*it);
+ }
}
// Always report the currently active tip.
@@ -835,11 +1275,11 @@ UniValue invalidateblock(const UniValue& params, bool fHelp)
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
CBlockIndex* pblockindex = mapBlockIndex[hash];
- InvalidateBlock(state, Params().GetConsensus(), pblockindex);
+ InvalidateBlock(state, Params(), pblockindex);
}
if (state.IsValid()) {
- ActivateBestChain(state, Params());
+ ActivateBestChain(state, Params(), NULL, g_connman.get());
}
if (!state.IsValid()) {
@@ -866,7 +1306,6 @@ UniValue reconsiderblock(const UniValue& params, bool fHelp)
std::string strHash = params[0].get_str();
uint256 hash(uint256S(strHash));
- CValidationState state;
{
LOCK(cs_main);
@@ -874,12 +1313,11 @@ UniValue reconsiderblock(const UniValue& params, bool fHelp)
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
CBlockIndex* pblockindex = mapBlockIndex[hash];
- ReconsiderBlock(state, pblockindex);
+ ResetBlockFailureFlags(pblockindex);
}
- if (state.IsValid()) {
- ActivateBestChain(state, Params());
- }
+ CValidationState state;
+ ActivateBestChain(state, Params(), NULL, g_connman.get());
if (!state.IsValid()) {
throw JSONRPCError(RPC_DATABASE_ERROR, state.GetRejectReason());
@@ -887,3 +1325,37 @@ UniValue reconsiderblock(const UniValue& params, bool fHelp)
return NullUniValue;
}
+
+static const CRPCCommand commands[] =
+{ // category name actor (function) okSafeMode
+ // --------------------- ------------------------ ----------------------- ----------
+ { "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", "getmempoolancestors", &getmempoolancestors, true },
+ { "blockchain", "getmempooldescendants", &getmempooldescendants, true },
+ { "blockchain", "getmempoolentry", &getmempoolentry, true },
+ { "blockchain", "getmempoolinfo", &getmempoolinfo, true },
+ { "blockchain", "getrawmempool", &getrawmempool, true },
+ { "blockchain", "gettxout", &gettxout, true },
+ { "blockchain", "gettxoutsetinfo", &gettxoutsetinfo, true },
+ { "blockchain", "verifychain", &verifychain, true },
+
+ /* Not shown in help */
+ { "hidden", "invalidateblock", &invalidateblock, true },
+ { "hidden", "reconsiderblock", &reconsiderblock, true },
+ { "hidden", "waitfornewblock", &waitfornewblock, true },
+ { "hidden", "waitforblock", &waitforblock, true },
+ { "hidden", "waitforblockheight", &waitforblockheight, true },
+};
+
+void RegisterBlockchainRPCCommands(CRPCTable &t)
+{
+ for (unsigned int vcidx = 0; vcidx < ARRAYLEN(commands); vcidx++)
+ t.appendCommand(commands[vcidx].name, &commands[vcidx]);
+}
diff --git a/src/rpcclient.cpp b/src/rpc/client.cpp
index cab5819017..c14d9d6747 100644
--- a/src/rpcclient.cpp
+++ b/src/rpc/client.cpp
@@ -1,11 +1,10 @@
// 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 "rpcclient.h"
-
-#include "rpcprotocol.h"
+#include "rpc/client.h"
+#include "rpc/protocol.h"
#include "util.h"
#include <set>
@@ -19,18 +18,18 @@ using namespace std;
class CRPCConvertParam
{
public:
- std::string methodName; //! method whose params want conversion
- int paramIdx; //! 0-based idx of param to convert
+ std::string methodName; //!< method whose params want conversion
+ int paramIdx; //!< 0-based idx of param to convert
};
static const CRPCConvertParam vRPCConvertParams[] =
{
{ "stop", 0 },
{ "setmocktime", 0 },
- { "getaddednodeinfo", 0 },
- { "setgenerate", 0 },
- { "setgenerate", 1 },
{ "generate", 0 },
+ { "generate", 1 },
+ { "generatetoaddress", 0 },
+ { "generatetoaddress", 2 },
{ "getnetworkhashps", 0 },
{ "getnetworkhashps", 1 },
{ "sendtoaddress", 1 },
@@ -47,6 +46,12 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "getbalance", 1 },
{ "getbalance", 2 },
{ "getblockhash", 0 },
+ { "waitforblockheight", 0 },
+ { "waitforblockheight", 1 },
+ { "waitforblock", 1 },
+ { "waitforblock", 2 },
+ { "waitfornewblock", 0 },
+ { "waitfornewblock", 1 },
{ "move", 2 },
{ "move", 3 },
{ "sendfrom", 2 },
@@ -102,6 +107,8 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "prioritisetransaction", 2 },
{ "setban", 2 },
{ "setban", 3 },
+ { "getmempoolancestors", 1 },
+ { "getmempooldescendants", 1 },
};
class CRPCConvertTable
@@ -161,4 +168,3 @@ UniValue RPCConvertValues(const std::string &strMethod, const std::vector<std::s
return params;
}
-
diff --git a/src/rpcclient.h b/src/rpc/client.h
index 8937a56f03..ae015860b6 100644
--- a/src/rpcclient.h
+++ b/src/rpc/client.h
@@ -1,5 +1,5 @@
// 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.
diff --git a/src/rpcmining.cpp b/src/rpc/mining.cpp
index c8649ec27d..6b13aa5bab 100644
--- a/src/rpcmining.cpp
+++ b/src/rpc/mining.cpp
@@ -1,12 +1,14 @@
// 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 "amount.h"
#include "chain.h"
#include "chainparams.h"
#include "consensus/consensus.h"
+#include "consensus/params.h"
#include "consensus/validation.h"
#include "core_io.h"
#include "init.h"
@@ -14,7 +16,7 @@
#include "miner.h"
#include "net.h"
#include "pow.h"
-#include "rpcserver.h"
+#include "rpc/server.h"
#include "txmempool.h"
#include "util.h"
#include "utilstrencodings.h"
@@ -68,7 +70,7 @@ UniValue GetNetworkHashPS(int lookup, int height) {
arith_uint256 workDiff = pb->nChainWork - pb0->nChainWork;
int64_t timeDiff = maxTime - minTime;
- return (int64_t)(workDiff.getdouble() / timeDiff);
+ return workDiff.getdouble() / timeDiff;
}
UniValue getnetworkhashps(const UniValue& params, bool fHelp)
@@ -93,59 +95,12 @@ UniValue getnetworkhashps(const UniValue& params, bool fHelp)
return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
}
-UniValue getgenerate(const UniValue& params, bool fHelp)
+UniValue generateBlocks(boost::shared_ptr<CReserveScript> coinbaseScript, int nGenerate, uint64_t nMaxTries, bool keepScript)
{
- if (fHelp || params.size() != 0)
- throw runtime_error(
- "getgenerate\n"
- "\nReturn if the server is set to generate coins or not. The default is false.\n"
- "It is set with the command line argument -gen (or " + std::string(BITCOIN_CONF_FILENAME) + " setting gen)\n"
- "It can also be set with the setgenerate call.\n"
- "\nResult\n"
- "true|false (boolean) If the server is set to generate coins or not\n"
- "\nExamples:\n"
- + HelpExampleCli("getgenerate", "")
- + HelpExampleRpc("getgenerate", "")
- );
-
- LOCK(cs_main);
- return GetBoolArg("-gen", DEFAULT_GENERATE);
-}
-
-UniValue generate(const UniValue& params, bool fHelp)
-{
- if (fHelp || params.size() < 1 || params.size() > 1)
- throw runtime_error(
- "generate numblocks\n"
- "\nMine blocks immediately (before the RPC call returns)\n"
- "\nNote: this function can only be used on the regtest network\n"
- "\nArguments:\n"
- "1. numblocks (numeric, required) How many blocks are generated immediately.\n"
- "\nResult\n"
- "[ blockhashes ] (array) hashes of blocks generated\n"
- "\nExamples:\n"
- "\nGenerate 11 blocks\n"
- + HelpExampleCli("generate", "11")
- );
-
- if (!Params().MineBlocksOnDemand())
- throw JSONRPCError(RPC_METHOD_NOT_FOUND, "This method can only be used on regtest");
-
+ static const int nInnerLoopCount = 0x10000;
int nHeightStart = 0;
int nHeightEnd = 0;
int nHeight = 0;
- int nGenerate = params[0].get_int();
-
- boost::shared_ptr<CReserveScript> coinbaseScript;
- GetMainSignals().ScriptForMining(coinbaseScript);
-
- // If the keypool is exhausted, no script is returned at all. Catch this.
- if (!coinbaseScript)
- throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
-
- //throw an error if no script was provided
- if (coinbaseScript->reserveScript.empty())
- throw JSONRPCError(RPC_INTERNAL_ERROR, "No coinbase script available (mining requires a wallet)");
{ // Don't keep cs_main locked
LOCK(cs_main);
@@ -157,7 +112,7 @@ UniValue generate(const UniValue& params, bool fHelp)
UniValue blockHashes(UniValue::VARR);
while (nHeight < nHeightEnd)
{
- auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlock(Params(), coinbaseScript->reserveScript));
+ std::unique_ptr<CBlockTemplate> pblocktemplate(BlockAssembler(Params()).CreateNewBlock(coinbaseScript->reserveScript));
if (!pblocktemplate.get())
throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
CBlock *pblock = &pblocktemplate->block;
@@ -165,65 +120,98 @@ UniValue generate(const UniValue& params, bool fHelp)
LOCK(cs_main);
IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce);
}
- while (!CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) {
- // Yes, there is a chance every nonce could fail to satisfy the -regtest
- // target -- 1 in 2^(2^32). That ain't gonna happen.
+ while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) {
++pblock->nNonce;
+ --nMaxTries;
+ }
+ if (nMaxTries == 0) {
+ break;
+ }
+ if (pblock->nNonce == nInnerLoopCount) {
+ continue;
}
CValidationState state;
- if (!ProcessNewBlock(state, Params(), NULL, pblock, true, NULL))
+ if (!ProcessNewBlock(state, Params(), NULL, pblock, true, NULL, g_connman.get()))
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();
+ //mark script as important because it was used at least for one coinbase output if the script came from the wallet
+ if (keepScript)
+ {
+ coinbaseScript->KeepScript();
+ }
}
return blockHashes;
}
-UniValue setgenerate(const UniValue& params, bool fHelp)
+UniValue generate(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
- "setgenerate generate ( genproclimit )\n"
- "\nSet 'generate' true or false to turn generation on or off.\n"
- "Generation is limited to 'genproclimit' processors, -1 is unlimited.\n"
- "See the getgenerate call for the current setting.\n"
+ "generate numblocks ( maxtries )\n"
+ "\nMine up to numblocks blocks immediately (before the RPC call returns)\n"
"\nArguments:\n"
- "1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n"
- "2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n"
+ "1. numblocks (numeric, required) How many blocks are generated immediately.\n"
+ "2. maxtries (numeric, optional) How many iterations to try (default = 1000000).\n"
+ "\nResult\n"
+ "[ blockhashes ] (array) hashes of blocks generated\n"
"\nExamples:\n"
- "\nSet the generation on with a limit of one processor\n"
- + HelpExampleCli("setgenerate", "true 1") +
- "\nCheck the setting\n"
- + HelpExampleCli("getgenerate", "") +
- "\nTurn off generation\n"
- + HelpExampleCli("setgenerate", "false") +
- "\nUsing json rpc\n"
- + HelpExampleRpc("setgenerate", "true, 1")
+ "\nGenerate 11 blocks\n"
+ + HelpExampleCli("generate", "11")
);
- if (Params().MineBlocksOnDemand())
- throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Use the generate method instead of setgenerate on this network");
+ int nGenerate = params[0].get_int();
+ uint64_t nMaxTries = 1000000;
+ if (params.size() > 1) {
+ nMaxTries = params[1].get_int();
+ }
- bool fGenerate = true;
- if (params.size() > 0)
- fGenerate = params[0].get_bool();
+ boost::shared_ptr<CReserveScript> coinbaseScript;
+ GetMainSignals().ScriptForMining(coinbaseScript);
- int nGenProcLimit = GetArg("-genproclimit", DEFAULT_GENERATE_THREADS);
- if (params.size() > 1)
- {
- nGenProcLimit = params[1].get_int();
- if (nGenProcLimit == 0)
- fGenerate = false;
+ // If the keypool is exhausted, no script is returned at all. Catch this.
+ if (!coinbaseScript)
+ throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
+
+ //throw an error if no script was provided
+ if (coinbaseScript->reserveScript.empty())
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "No coinbase script available (mining requires a wallet)");
+
+ return generateBlocks(coinbaseScript, nGenerate, nMaxTries, true);
+}
+
+UniValue generatetoaddress(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() < 2 || params.size() > 3)
+ throw runtime_error(
+ "generatetoaddress numblocks address (maxtries)\n"
+ "\nMine blocks immediately to a specified address (before the RPC call returns)\n"
+ "\nArguments:\n"
+ "1. numblocks (numeric, required) How many blocks are generated immediately.\n"
+ "2. address (string, required) The address to send the newly generated bitcoin to.\n"
+ "3. maxtries (numeric, optional) How many iterations to try (default = 1000000).\n"
+ "\nResult\n"
+ "[ blockhashes ] (array) hashes of blocks generated\n"
+ "\nExamples:\n"
+ "\nGenerate 11 blocks to myaddress\n"
+ + HelpExampleCli("generatetoaddress", "11 \"myaddress\"")
+ );
+
+ int nGenerate = params[0].get_int();
+ uint64_t nMaxTries = 1000000;
+ if (params.size() > 2) {
+ nMaxTries = params[2].get_int();
}
- mapArgs["-gen"] = (fGenerate ? "1" : "0");
- mapArgs ["-genproclimit"] = itostr(nGenProcLimit);
- GenerateBitcoins(fGenerate, nGenProcLimit, Params());
+ CBitcoinAddress address(params[1].get_str());
+ if (!address.IsValid())
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Error: Invalid address");
+
+ boost::shared_ptr<CReserveScript> coinbaseScript(new CReserveScript());
+ coinbaseScript->reserveScript = GetScriptForDestination(address.Get());
- return NullUniValue;
+ return generateBlocks(coinbaseScript, nGenerate, nMaxTries, false);
}
UniValue getmininginfo(const UniValue& params, bool fHelp)
@@ -236,14 +224,14 @@ UniValue getmininginfo(const UniValue& params, bool fHelp)
"{\n"
" \"blocks\": nnn, (numeric) The current block\n"
" \"currentblocksize\": nnn, (numeric) The last block size\n"
+ " \"currentblockweight\": nnn, (numeric) The last block weight\n"
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
- " \"errors\": \"...\" (string) Current errors\n"
- " \"generate\": true|false (boolean) If the generation is on or off (see getgenerate or setgenerate calls)\n"
- " \"genproclimit\": n (numeric) The processor limit for generation. -1 if no generation. (see getgenerate or setgenerate calls)\n"
+ " \"errors\": \"...\" (string) Current errors\n"
+ " \"networkhashps\": nnn, (numeric) The network hashes per second\n"
" \"pooledtx\": n (numeric) The size of the mem pool\n"
" \"testnet\": true|false (boolean) If using testnet or not\n"
- " \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
+ " \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
"}\n"
"\nExamples:\n"
+ HelpExampleCli("getmininginfo", "")
@@ -256,15 +244,14 @@ UniValue getmininginfo(const UniValue& params, bool fHelp)
UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("blocks", (int)chainActive.Height()));
obj.push_back(Pair("currentblocksize", (uint64_t)nLastBlockSize));
+ obj.push_back(Pair("currentblockweight", (uint64_t)nLastBlockWeight));
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
obj.push_back(Pair("errors", GetWarnings("statusbar")));
- obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", DEFAULT_GENERATE_THREADS)));
obj.push_back(Pair("networkhashps", getnetworkhashps(params, false)));
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
obj.push_back(Pair("chain", Params().NetworkIDString()));
- obj.push_back(Pair("generate", getgenerate(params, false)));
return obj;
}
@@ -320,6 +307,15 @@ static UniValue BIP22ValidationResult(const CValidationState& state)
return "valid?";
}
+std::string gbt_vb_name(const Consensus::DeploymentPos pos) {
+ const struct BIP9DeploymentInfo& vbinfo = VersionBitsDeploymentInfo[pos];
+ std::string s = vbinfo.name;
+ if (!vbinfo.gbt_force) {
+ s.insert(s.begin(), '!');
+ }
+ return s;
+}
+
UniValue getblocktemplate(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() > 1)
@@ -327,7 +323,9 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
"getblocktemplate ( \"jsonrequestobject\" )\n"
"\nIf the request parameters include a 'mode' key, that is used to explicitly select between the default 'template' request or a 'proposal'.\n"
"It returns data needed to construct a block to work on.\n"
- "See https://en.bitcoin.it/wiki/BIP_0022 for full specification.\n"
+ "For full specification, see BIPs 22 and 9:\n"
+ " https://github.com/bitcoin/bips/blob/master/bip-0022.mediawiki\n"
+ " https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki#getblocktemplate_changes\n"
"\nArguments:\n"
"1. \"jsonrequestobject\" (string, optional) A json object in the following spec\n"
@@ -343,17 +341,25 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
"\nResult:\n"
"{\n"
" \"version\" : n, (numeric) The block version\n"
+ " \"rules\" : [ \"rulename\", ... ], (array of strings) specific block rules that are to be enforced\n"
+ " \"vbavailable\" : { (json object) set of pending, supported versionbit (BIP 9) softfork deployments\n"
+ " \"rulename\" : bitnumber (numeric) identifies the bit number as indicating acceptance and readiness for the named softfork rule\n"
+ " ,...\n"
+ " },\n"
+ " \"vbrequired\" : n, (numeric) bit mask of versionbits the server requires set in submissions\n"
" \"previousblockhash\" : \"xxxx\", (string) The hash of current highest block\n"
" \"transactions\" : [ (array) contents of non-coinbase transactions that should be included in the next block\n"
" {\n"
" \"data\" : \"xxxx\", (string) transaction data encoded in hexadecimal (byte-for-byte)\n"
- " \"hash\" : \"xxxx\", (string) hash/id encoded in little-endian hexadecimal\n"
+ " \"txid\" : \"xxxx\", (string) transaction id encoded in little-endian hexadecimal\n"
+ " \"hash\" : \"xxxx\", (string) hash encoded in little-endian hexadecimal (including witness data)\n"
" \"depends\" : [ (array) array of numbers \n"
" n (numeric) transactions before this one (by 1-based index in 'transactions' list) that must be present in the final block if this one is\n"
" ,...\n"
" ],\n"
" \"fee\": n, (numeric) difference in value between transaction inputs and outputs (in Satoshis); for coinbase transactions, this is a negative Number of the total collected block fees (ie, not including the block subsidy); if key is not present, fee is unknown and clients MUST NOT assume there isn't one\n"
- " \"sigops\" : n, (numeric) total number of SigOps, as counted for purposes of block limits; if key is not present, sigop count is unknown and clients MUST NOT assume there aren't any\n"
+ " \"sigops\" : n, (numeric) total SigOps cost, as counted for purposes of block limits; if key is not present, sigop cost is unknown and clients MUST NOT assume it is zero\n"
+ " \"weight\" : n, (numeric) total transaction weight, as counted for purposes of block limits\n"
" \"required\" : true|false (boolean) if provided and true, this transaction must be in the final block\n"
" }\n"
" ,...\n"
@@ -370,8 +376,9 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
" ,...\n"
" ],\n"
" \"noncerange\" : \"00000000ffffffff\", (string) A range of valid nonces\n"
- " \"sigoplimit\" : n, (numeric) limit of sigops in blocks\n"
+ " \"sigoplimit\" : n, (numeric) cost limit of sigops in blocks\n"
" \"sizelimit\" : n, (numeric) limit of block size\n"
+ " \"weightlimit\" : n, (numeric) limit of block weight\n"
" \"curtime\" : ttt, (numeric) current timestamp in seconds since epoch (Jan 1 1970 GMT)\n"
" \"bits\" : \"xxx\", (string) compressed target of next block\n"
" \"height\" : n (numeric) The height of the next block\n"
@@ -386,6 +393,8 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
std::string strMode = "template";
UniValue lpval = NullUniValue;
+ std::set<std::string> setClientRules;
+ int64_t nMaxVersionPreVB = -1;
if (params.size() > 0)
{
const UniValue& oparam = params[0].get_obj();
@@ -429,12 +438,29 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
TestBlockValidity(state, Params(), block, pindexPrev, false, true);
return BIP22ValidationResult(state);
}
+
+ const UniValue& aClientRules = find_value(oparam, "rules");
+ if (aClientRules.isArray()) {
+ for (unsigned int i = 0; i < aClientRules.size(); ++i) {
+ const UniValue& v = aClientRules[i];
+ setClientRules.insert(v.get_str());
+ }
+ } else {
+ // NOTE: It is important that this NOT be read if versionbits is supported
+ const UniValue& uvMaxVersion = find_value(oparam, "maxversion");
+ if (uvMaxVersion.isNum()) {
+ nMaxVersionPreVB = uvMaxVersion.get_int64();
+ }
+ }
}
if (strMode != "template")
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
- if (vNodes.empty())
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
+
+ if (g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL) == 0)
throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");
if (IsInitialBlockDownload())
@@ -510,7 +536,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
pblocktemplate = NULL;
}
CScript scriptDummy = CScript() << OP_TRUE;
- pblocktemplate = CreateNewBlock(Params(), scriptDummy);
+ pblocktemplate = BlockAssembler(Params()).CreateNewBlock(scriptDummy);
if (!pblocktemplate)
throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");
@@ -518,17 +544,21 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
pindexPrev = pindexPrevNew;
}
CBlock* pblock = &pblocktemplate->block; // pointer for convenience
+ const Consensus::Params& consensusParams = Params().GetConsensus();
// Update nTime
- UpdateTime(pblock, Params().GetConsensus(), pindexPrev);
+ UpdateTime(pblock, consensusParams, pindexPrev);
pblock->nNonce = 0;
+ // NOTE: If at some point we support pre-segwit miners post-segwit-activation, this needs to take segwit support into consideration
+ const bool fPreSegWit = (THRESHOLD_ACTIVE != VersionBitsState(pindexPrev, consensusParams, Consensus::DEPLOYMENT_SEGWIT, versionbitscache));
+
UniValue aCaps(UniValue::VARR); aCaps.push_back("proposal");
UniValue transactions(UniValue::VARR);
map<uint256, int64_t> setTxIndex;
int i = 0;
- BOOST_FOREACH (const CTransaction& tx, pblock->vtx) {
+ BOOST_FOREACH (CTransaction& tx, pblock->vtx) {
uint256 txHash = tx.GetHash();
setTxIndex[txHash] = i++;
@@ -538,8 +568,8 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
UniValue entry(UniValue::VOBJ);
entry.push_back(Pair("data", EncodeHexTx(tx)));
-
- entry.push_back(Pair("hash", txHash.GetHex()));
+ entry.push_back(Pair("txid", txHash.GetHex()));
+ entry.push_back(Pair("hash", tx.GetWitnessHash().GetHex()));
UniValue deps(UniValue::VARR);
BOOST_FOREACH (const CTxIn &in, tx.vin)
@@ -551,7 +581,13 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
int index_in_template = i - 1;
entry.push_back(Pair("fee", pblocktemplate->vTxFees[index_in_template]));
- entry.push_back(Pair("sigops", pblocktemplate->vTxSigOps[index_in_template]));
+ int64_t nTxSigOps = pblocktemplate->vTxSigOpsCost[index_in_template];
+ if (fPreSegWit) {
+ assert(nTxSigOps % WITNESS_SCALE_FACTOR == 0);
+ nTxSigOps /= WITNESS_SCALE_FACTOR;
+ }
+ entry.push_back(Pair("sigops", nTxSigOps));
+ entry.push_back(Pair("weight", GetTransactionWeight(tx)));
transactions.push_back(entry);
}
@@ -561,17 +597,69 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
- static UniValue aMutable(UniValue::VARR);
- if (aMutable.empty())
- {
- aMutable.push_back("time");
- aMutable.push_back("transactions");
- aMutable.push_back("prevblock");
- }
+ UniValue aMutable(UniValue::VARR);
+ aMutable.push_back("time");
+ aMutable.push_back("transactions");
+ aMutable.push_back("prevblock");
UniValue result(UniValue::VOBJ);
result.push_back(Pair("capabilities", aCaps));
+
+ UniValue aRules(UniValue::VARR);
+ UniValue vbavailable(UniValue::VOBJ);
+ for (int j = 0; j < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++j) {
+ Consensus::DeploymentPos pos = Consensus::DeploymentPos(j);
+ ThresholdState state = VersionBitsState(pindexPrev, consensusParams, pos, versionbitscache);
+ switch (state) {
+ case THRESHOLD_DEFINED:
+ case THRESHOLD_FAILED:
+ // Not exposed to GBT at all
+ break;
+ case THRESHOLD_LOCKED_IN:
+ // Ensure bit is set in block version
+ pblock->nVersion |= VersionBitsMask(consensusParams, pos);
+ // FALL THROUGH to get vbavailable set...
+ case THRESHOLD_STARTED:
+ {
+ const struct BIP9DeploymentInfo& vbinfo = VersionBitsDeploymentInfo[pos];
+ vbavailable.push_back(Pair(gbt_vb_name(pos), consensusParams.vDeployments[pos].bit));
+ if (setClientRules.find(vbinfo.name) == setClientRules.end()) {
+ if (!vbinfo.gbt_force) {
+ // If the client doesn't support this, don't indicate it in the [default] version
+ pblock->nVersion &= ~VersionBitsMask(consensusParams, pos);
+ }
+ }
+ break;
+ }
+ case THRESHOLD_ACTIVE:
+ {
+ // Add to rules only
+ const struct BIP9DeploymentInfo& vbinfo = VersionBitsDeploymentInfo[pos];
+ aRules.push_back(gbt_vb_name(pos));
+ if (setClientRules.find(vbinfo.name) == setClientRules.end()) {
+ // Not supported by the client; make sure it's safe to proceed
+ if (!vbinfo.gbt_force) {
+ // If we do anything other than throw an exception here, be sure version/force isn't sent to old clients
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Support for '%s' rule requires explicit client support", vbinfo.name));
+ }
+ }
+ break;
+ }
+ }
+ }
result.push_back(Pair("version", pblock->nVersion));
+ result.push_back(Pair("rules", aRules));
+ result.push_back(Pair("vbavailable", vbavailable));
+ result.push_back(Pair("vbrequired", int(0)));
+
+ if (nMaxVersionPreVB >= 2) {
+ // If VB is supported by the client, nMaxVersionPreVB is -1, so we won't get here
+ // Because BIP 34 changed how the generation transaction is serialized, we can only use version/force back to v2 blocks
+ // This is safe to do [otherwise-]unconditionally only because we are throwing an exception above if a non-force deployment gets activated
+ // Note that this can probably also be removed entirely after the first BIP9 non-force deployment (ie, probably segwit) gets activated
+ aMutable.push_back("version/force");
+ }
+
result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex()));
result.push_back(Pair("transactions", transactions));
result.push_back(Pair("coinbaseaux", aux));
@@ -581,11 +669,20 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1));
result.push_back(Pair("mutable", aMutable));
result.push_back(Pair("noncerange", "00000000ffffffff"));
- result.push_back(Pair("sigoplimit", (int64_t)MAX_BLOCK_SIGOPS));
- result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SIZE));
+ int64_t nSigOpLimit = MAX_BLOCK_SIGOPS_COST;
+ if (fPreSegWit) {
+ assert(nSigOpLimit % WITNESS_SCALE_FACTOR == 0);
+ nSigOpLimit /= WITNESS_SCALE_FACTOR;
+ }
+ result.push_back(Pair("sigoplimit", nSigOpLimit));
+ result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SERIALIZED_SIZE));
+ result.push_back(Pair("weightlimit", (int64_t)MAX_BLOCK_WEIGHT));
result.push_back(Pair("curtime", pblock->GetBlockTime()));
result.push_back(Pair("bits", strprintf("%08x", pblock->nBits)));
result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1)));
+ if (!pblocktemplate->vchCoinbaseCommitment.empty()) {
+ result.push_back(Pair("default_witness_commitment", HexStr(pblocktemplate->vchCoinbaseCommitment.begin(), pblocktemplate->vchCoinbaseCommitment.end())));
+ }
return result;
}
@@ -649,10 +746,18 @@ UniValue submitblock(const UniValue& params, bool fHelp)
}
}
+ {
+ LOCK(cs_main);
+ BlockMap::iterator mi = mapBlockIndex.find(block.hashPrevBlock);
+ if (mi != mapBlockIndex.end()) {
+ UpdateUncommittedBlockStructures(block, mi->second, Params().GetConsensus());
+ }
+ }
+
CValidationState state;
submitblock_StateCatcher sc(block.GetHash());
RegisterValidationInterface(&sc);
- bool fAccepted = ProcessNewBlock(state, Params(), NULL, &block, true, NULL);
+ bool fAccepted = ProcessNewBlock(state, Params(), NULL, &block, true, NULL, g_connman.get());
UnregisterValidationInterface(&sc);
if (fBlockPresent)
{
@@ -798,3 +903,27 @@ UniValue estimatesmartpriority(const UniValue& params, bool fHelp)
result.push_back(Pair("blocks", answerFound));
return result;
}
+
+static const CRPCCommand commands[] =
+{ // category name actor (function) okSafeMode
+ // --------------------- ------------------------ ----------------------- ----------
+ { "mining", "getnetworkhashps", &getnetworkhashps, true },
+ { "mining", "getmininginfo", &getmininginfo, true },
+ { "mining", "prioritisetransaction", &prioritisetransaction, true },
+ { "mining", "getblocktemplate", &getblocktemplate, true },
+ { "mining", "submitblock", &submitblock, true },
+
+ { "generating", "generate", &generate, true },
+ { "generating", "generatetoaddress", &generatetoaddress, true },
+
+ { "util", "estimatefee", &estimatefee, true },
+ { "util", "estimatepriority", &estimatepriority, true },
+ { "util", "estimatesmartfee", &estimatesmartfee, true },
+ { "util", "estimatesmartpriority", &estimatesmartpriority, true },
+};
+
+void RegisterMiningRPCCommands(CRPCTable &t)
+{
+ for (unsigned int vcidx = 0; vcidx < ARRAYLEN(commands); vcidx++)
+ t.appendCommand(commands[vcidx].name, &commands[vcidx]);
+}
diff --git a/src/rpcmisc.cpp b/src/rpc/misc.cpp
index 0c656d5cf1..f0b7e0a07c 100644
--- a/src/rpcmisc.cpp
+++ b/src/rpc/misc.cpp
@@ -1,5 +1,5 @@
// 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.
@@ -9,7 +9,7 @@
#include "main.h"
#include "net.h"
#include "netbase.h"
-#include "rpcserver.h"
+#include "rpc/server.h"
#include "timedata.h"
#include "util.h"
#include "utilstrencodings.h"
@@ -44,7 +44,7 @@ UniValue getinfo(const UniValue& params, bool fHelp)
if (fHelp || params.size() != 0)
throw runtime_error(
"getinfo\n"
- "Returns an object containing various state info.\n"
+ "\nDEPRECATED. Returns an object containing various state info.\n"
"\nResult:\n"
"{\n"
" \"version\": xxxxx, (numeric) the server version\n"
@@ -89,7 +89,8 @@ UniValue getinfo(const UniValue& params, bool fHelp)
#endif
obj.push_back(Pair("blocks", (int)chainActive.Height()));
obj.push_back(Pair("timeoffset", GetTimeOffset()));
- obj.push_back(Pair("connections", (int)vNodes.size()));
+ if(g_connman)
+ obj.push_back(Pair("connections", (int)g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL)));
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()));
@@ -166,6 +167,8 @@ UniValue validateaddress(const UniValue& params, bool fHelp)
" \"pubkey\" : \"publickeyhex\", (string) The hex value of the raw public key\n"
" \"iscompressed\" : true|false, (boolean) If the address is compressed\n"
" \"account\" : \"account\" (string) DEPRECATED. The account associated with the address, \"\" is the default account\n"
+ " \"hdkeypath\" : \"keypath\" (string, optional) The HD keypath if the key is HD and available\n"
+ " \"hdmasterkeyid\" : \"<hash160>\" (string, optional) The Hash160 of the HD master pubkey\n"
"}\n"
"\nExamples:\n"
+ HelpExampleCli("validateaddress", "\"1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc\"")
@@ -200,6 +203,12 @@ UniValue validateaddress(const UniValue& params, bool fHelp)
ret.pushKVs(detail);
if (pwalletMain && pwalletMain->mapAddressBook.count(dest))
ret.push_back(Pair("account", pwalletMain->mapAddressBook[dest].name));
+ CKeyID keyID;
+ if (pwalletMain && address.GetKeyID(keyID) && pwalletMain->mapKeyMetadata.count(keyID) && !pwalletMain->mapKeyMetadata[keyID].hdKeypath.empty())
+ {
+ ret.push_back(Pair("hdkeypath", pwalletMain->mapKeyMetadata[keyID].hdKeypath));
+ ret.push_back(Pair("hdmasterkeyid", pwalletMain->mapKeyMetadata[keyID].hdMasterKeyID.GetHex()));
+ }
#endif
}
return ret;
@@ -366,6 +375,48 @@ UniValue verifymessage(const UniValue& params, bool fHelp)
return (pubkey.GetID() == keyID);
}
+UniValue signmessagewithprivkey(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() != 2)
+ throw runtime_error(
+ "signmessagewithprivkey \"privkey\" \"message\"\n"
+ "\nSign a message with the private key of an address\n"
+ "\nArguments:\n"
+ "1. \"privkey\" (string, required) The private key to sign the message with.\n"
+ "2. \"message\" (string, required) The message to create a signature of.\n"
+ "\nResult:\n"
+ "\"signature\" (string) The signature of the message encoded in base 64\n"
+ "\nExamples:\n"
+ "\nCreate the signature\n"
+ + HelpExampleCli("signmessagewithprivkey", "\"privkey\" \"my message\"") +
+ "\nVerify the signature\n"
+ + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"signature\" \"my message\"") +
+ "\nAs json rpc\n"
+ + HelpExampleRpc("signmessagewithprivkey", "\"privkey\", \"my message\"")
+ );
+
+ string strPrivkey = params[0].get_str();
+ string strMessage = params[1].get_str();
+
+ CBitcoinSecret vchSecret;
+ bool fGood = vchSecret.SetString(strPrivkey);
+ if (!fGood)
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
+ CKey key = vchSecret.GetKey();
+ if (!key.IsValid())
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Private key outside allowed range");
+
+ CHashWriter ss(SER_GETHASH, 0);
+ ss << strMessageMagic;
+ ss << strMessage;
+
+ vector<unsigned char> vchSig;
+ if (!key.SignCompact(ss.GetHash(), vchSig))
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Sign failed");
+
+ return EncodeBase64(&vchSig[0], vchSig.size());
+}
+
UniValue setmocktime(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
@@ -384,15 +435,36 @@ UniValue setmocktime(const UniValue& params, bool fHelp)
// 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);
+ LOCK(cs_main);
RPCTypeCheck(params, boost::assign::list_of(UniValue::VNUM));
SetMockTime(params[0].get_int64());
uint64_t t = GetTime();
- BOOST_FOREACH(CNode* pnode, vNodes) {
- pnode->nLastSend = pnode->nLastRecv = t;
+ if(g_connman) {
+ g_connman->ForEachNode([t](CNode* pnode) {
+ pnode->nLastSend = pnode->nLastRecv = t;
+ });
}
return NullUniValue;
}
+
+static const CRPCCommand commands[] =
+{ // category name actor (function) okSafeMode
+ // --------------------- ------------------------ ----------------------- ----------
+ { "control", "getinfo", &getinfo, true }, /* uses wallet if enabled */
+ { "util", "validateaddress", &validateaddress, true }, /* uses wallet if enabled */
+ { "util", "createmultisig", &createmultisig, true },
+ { "util", "verifymessage", &verifymessage, true },
+ { "util", "signmessagewithprivkey", &signmessagewithprivkey, true },
+
+ /* Not shown in help */
+ { "hidden", "setmocktime", &setmocktime, true },
+};
+
+void RegisterMiscRPCCommands(CRPCTable &t)
+{
+ for (unsigned int vcidx = 0; vcidx < ARRAYLEN(commands); vcidx++)
+ t.appendCommand(commands[vcidx].name, &commands[vcidx]);
+}
diff --git a/src/rpcnet.cpp b/src/rpc/net.cpp
index 2578848891..b011029f51 100644
--- a/src/rpcnet.cpp
+++ b/src/rpc/net.cpp
@@ -1,8 +1,8 @@
-// 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 "rpcserver.h"
+#include "rpc/server.h"
#include "chainparams.h"
#include "clientversion.h"
@@ -36,9 +36,10 @@ UniValue getconnectioncount(const UniValue& params, bool fHelp)
+ HelpExampleRpc("getconnectioncount", "")
);
- LOCK2(cs_main, cs_vNodes);
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
- return (int)vNodes.size();
+ return (int)g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL);
}
UniValue ping(const UniValue& params, bool fHelp)
@@ -54,29 +55,16 @@ UniValue ping(const UniValue& params, bool fHelp)
+ HelpExampleRpc("ping", "")
);
- // Request that each node send a ping during next message processing pass
- LOCK2(cs_main, cs_vNodes);
-
- BOOST_FOREACH(CNode* pNode, vNodes) {
- pNode->fPingQueued = true;
- }
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
+ // Request that each node send a ping during next message processing pass
+ g_connman->ForEachNode([](CNode* pnode) {
+ pnode->fPingQueued = true;
+ });
return NullUniValue;
}
-static void CopyNodeStats(std::vector<CNodeStats>& vstats)
-{
- vstats.clear();
-
- LOCK(cs_vNodes);
- vstats.reserve(vNodes.size());
- BOOST_FOREACH(CNode* pnode, vNodes) {
- CNodeStats stats;
- pnode->copyStats(stats);
- vstats.push_back(stats);
- }
-}
-
UniValue getpeerinfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
@@ -97,9 +85,9 @@ UniValue getpeerinfo(const UniValue& params, bool fHelp)
" \"bytesrecv\": n, (numeric) The total bytes received\n"
" \"conntime\": ttt, (numeric) The connection time in seconds since epoch (Jan 1 1970 GMT)\n"
" \"timeoffset\": ttt, (numeric) The time offset in seconds\n"
- " \"pingtime\": n, (numeric) ping time\n"
- " \"minping\": n, (numeric) minimum observed ping time\n"
- " \"pingwait\": n, (numeric) ping wait\n"
+ " \"pingtime\": n, (numeric) ping time (if available)\n"
+ " \"minping\": n, (numeric) minimum observed ping time (if any at all)\n"
+ " \"pingwait\": n, (numeric) ping wait (if non-zero)\n"
" \"version\": v, (numeric) The peer version, such as 7001\n"
" \"subver\": \"/Satoshi:0.8.5/\", (string) The string version\n"
" \"inbound\": true|false, (boolean) Inbound (true) or Outbound (false)\n"
@@ -111,6 +99,14 @@ UniValue getpeerinfo(const UniValue& params, bool fHelp)
" n, (numeric) The heights of blocks we're currently asking from this peer\n"
" ...\n"
" ]\n"
+ " \"bytessent_per_msg\": {\n"
+ " \"addr\": n, (numeric) The total bytes sent aggregated by message type\n"
+ " ...\n"
+ " }\n"
+ " \"bytesrecv_per_msg\": {\n"
+ " \"addr\": n, (numeric) The total bytes received aggregated by message type\n"
+ " ...\n"
+ " }\n"
" }\n"
" ,...\n"
"]\n"
@@ -119,10 +115,11 @@ UniValue getpeerinfo(const UniValue& params, bool fHelp)
+ HelpExampleRpc("getpeerinfo", "")
);
- LOCK(cs_main);
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
vector<CNodeStats> vstats;
- CopyNodeStats(vstats);
+ g_connman->GetNodeStats(vstats);
UniValue ret(UniValue::VARR);
@@ -142,8 +139,10 @@ UniValue getpeerinfo(const UniValue& params, bool fHelp)
obj.push_back(Pair("bytesrecv", stats.nRecvBytes));
obj.push_back(Pair("conntime", stats.nTimeConnected));
obj.push_back(Pair("timeoffset", stats.nTimeOffset));
- obj.push_back(Pair("pingtime", stats.dPingTime));
- obj.push_back(Pair("minping", stats.dPingMin));
+ if (stats.dPingTime > 0.0)
+ obj.push_back(Pair("pingtime", stats.dPingTime));
+ if (stats.dPingMin < std::numeric_limits<int64_t>::max()/1e6)
+ obj.push_back(Pair("minping", stats.dPingMin));
if (stats.dPingWait > 0.0)
obj.push_back(Pair("pingwait", stats.dPingWait));
obj.push_back(Pair("version", stats.nVersion));
@@ -165,6 +164,20 @@ UniValue getpeerinfo(const UniValue& params, bool fHelp)
}
obj.push_back(Pair("whitelisted", stats.fWhitelisted));
+ UniValue sendPerMsgCmd(UniValue::VOBJ);
+ BOOST_FOREACH(const mapMsgCmdSize::value_type &i, stats.mapSendBytesPerMsgCmd) {
+ if (i.second > 0)
+ sendPerMsgCmd.push_back(Pair(i.first, i.second));
+ }
+ obj.push_back(Pair("bytessent_per_msg", sendPerMsgCmd));
+
+ UniValue recvPerMsgCmd(UniValue::VOBJ);
+ BOOST_FOREACH(const mapMsgCmdSize::value_type &i, stats.mapRecvBytesPerMsgCmd) {
+ if (i.second > 0)
+ recvPerMsgCmd.push_back(Pair(i.first, i.second));
+ }
+ obj.push_back(Pair("bytesrecv_per_msg", recvPerMsgCmd));
+
ret.push_back(obj);
}
@@ -190,32 +203,27 @@ UniValue addnode(const UniValue& params, bool fHelp)
+ HelpExampleRpc("addnode", "\"192.168.0.6:8333\", \"onetry\"")
);
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
+
string strNode = params[0].get_str();
if (strCommand == "onetry")
{
CAddress addr;
- OpenNetworkConnection(addr, NULL, strNode.c_str());
+ g_connman->OpenNetworkConnection(addr, false, NULL, strNode.c_str());
return NullUniValue;
}
- LOCK(cs_vAddedNodes);
- vector<string>::iterator it = vAddedNodes.begin();
- for(; it != vAddedNodes.end(); it++)
- if (strNode == *it)
- break;
-
if (strCommand == "add")
{
- if (it != vAddedNodes.end())
+ if(!g_connman->AddNode(strNode))
throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: Node already added");
- vAddedNodes.push_back(strNode);
}
else if(strCommand == "remove")
{
- if (it == vAddedNodes.end())
+ if(!g_connman->RemoveAddedNode(strNode))
throw JSONRPCError(RPC_CLIENT_NODE_NOT_ADDED, "Error: Node has not been added.");
- vAddedNodes.erase(it);
}
return NullUniValue;
@@ -234,38 +242,35 @@ UniValue disconnectnode(const UniValue& params, bool fHelp)
+ 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");
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
- pNode->fDisconnect = true;
+ bool ret = g_connman->DisconnectNode(params[0].get_str());
+ if (!ret)
+ throw JSONRPCError(RPC_CLIENT_NODE_NOT_CONNECTED, "Node not found in connected nodes");
return NullUniValue;
}
UniValue getaddednodeinfo(const UniValue& params, bool fHelp)
{
- if (fHelp || params.size() < 1 || params.size() > 2)
+ if (fHelp || params.size() > 1)
throw runtime_error(
- "getaddednodeinfo dns ( \"node\" )\n"
+ "getaddednodeinfo ( \"node\" )\n"
"\nReturns information about the given added node, or all added nodes\n"
"(note that onetry addnodes are not listed here)\n"
- "If dns is false, only a list of added nodes will be provided,\n"
- "otherwise connected information will also be available.\n"
"\nArguments:\n"
- "1. dns (boolean, required) If false, only a list of added nodes will be provided, otherwise connected information will also be available.\n"
- "2. \"node\" (string, optional) If provided, return information about this specific node, otherwise all nodes are returned.\n"
+ "1. \"node\" (string, optional) If provided, return information about this specific node, otherwise all nodes are returned.\n"
"\nResult:\n"
"[\n"
" {\n"
- " \"addednode\" : \"192.168.0.201\", (string) The node ip address\n"
+ " \"addednode\" : \"192.168.0.201\", (string) The node ip address or name (as provided to addnode)\n"
" \"connected\" : true|false, (boolean) If connected\n"
- " \"addresses\" : [\n"
+ " \"addresses\" : [ (list of objects) Only when connected = true\n"
" {\n"
- " \"address\" : \"192.168.0.201:8333\", (string) The bitcoin server host and port\n"
+ " \"address\" : \"192.168.0.201:8333\", (string) The bitcoin server IP and port we're connected to\n"
" \"connected\" : \"outbound\" (string) connection, inbound or outbound\n"
" }\n"
- " ,...\n"
" ]\n"
" }\n"
" ,...\n"
@@ -276,82 +281,38 @@ UniValue getaddednodeinfo(const UniValue& params, bool fHelp)
+ HelpExampleRpc("getaddednodeinfo", "true, \"192.168.0.201\"")
);
- bool fDns = params[0].get_bool();
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
- list<string> laddedNodes(0);
- if (params.size() == 1)
- {
- LOCK(cs_vAddedNodes);
- BOOST_FOREACH(const std::string& strAddNode, vAddedNodes)
- laddedNodes.push_back(strAddNode);
- }
- else
- {
- string strNode = params[1].get_str();
- LOCK(cs_vAddedNodes);
- BOOST_FOREACH(const std::string& strAddNode, vAddedNodes) {
- if (strAddNode == strNode)
- {
- laddedNodes.push_back(strAddNode);
+ std::vector<AddedNodeInfo> vInfo = g_connman->GetAddedNodeInfo();
+
+ if (params.size() == 1) {
+ bool found = false;
+ for (const AddedNodeInfo& info : vInfo) {
+ if (info.strAddedNode == params[0].get_str()) {
+ vInfo.assign(1, info);
+ found = true;
break;
}
}
- if (laddedNodes.size() == 0)
+ if (!found) {
throw JSONRPCError(RPC_CLIENT_NODE_NOT_ADDED, "Error: Node has not been added.");
- }
-
- UniValue ret(UniValue::VARR);
- if (!fDns)
- {
- BOOST_FOREACH (const std::string& strAddNode, laddedNodes) {
- UniValue obj(UniValue::VOBJ);
- obj.push_back(Pair("addednode", strAddNode));
- ret.push_back(obj);
}
- return ret;
}
- list<pair<string, vector<CService> > > laddedAddreses(0);
- 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
- {
- UniValue obj(UniValue::VOBJ);
- obj.push_back(Pair("addednode", strAddNode));
- obj.push_back(Pair("connected", false));
- UniValue addresses(UniValue::VARR);
- obj.push_back(Pair("addresses", addresses));
- }
- }
+ UniValue ret(UniValue::VARR);
- LOCK(cs_vNodes);
- for (list<pair<string, vector<CService> > >::iterator it = laddedAddreses.begin(); it != laddedAddreses.end(); it++)
- {
+ for (const AddedNodeInfo& info : vInfo) {
UniValue obj(UniValue::VOBJ);
- obj.push_back(Pair("addednode", it->first));
-
+ obj.push_back(Pair("addednode", info.strAddedNode));
+ obj.push_back(Pair("connected", info.fConnected));
UniValue addresses(UniValue::VARR);
- bool fConnected = false;
- BOOST_FOREACH(const CService& addrNode, it->second) {
- bool fFound = false;
- UniValue node(UniValue::VOBJ);
- node.push_back(Pair("address", addrNode.ToString()));
- BOOST_FOREACH(CNode* pnode, vNodes) {
- if (pnode->addr == addrNode)
- {
- fFound = true;
- fConnected = true;
- node.push_back(Pair("connected", pnode->fInbound ? "inbound" : "outbound"));
- break;
- }
- }
- if (!fFound)
- node.push_back(Pair("connected", "false"));
- addresses.push_back(node);
+ if (info.fConnected) {
+ UniValue address(UniValue::VOBJ);
+ address.push_back(Pair("address", info.resolvedAddress.ToString()));
+ address.push_back(Pair("connected", info.fInbound ? "inbound" : "outbound"));
+ addresses.push_back(address);
}
- obj.push_back(Pair("connected", fConnected));
obj.push_back(Pair("addresses", addresses));
ret.push_back(obj);
}
@@ -385,19 +346,21 @@ UniValue getnettotals(const UniValue& params, bool fHelp)
+ HelpExampleCli("getnettotals", "")
+ HelpExampleRpc("getnettotals", "")
);
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
UniValue obj(UniValue::VOBJ);
- obj.push_back(Pair("totalbytesrecv", CNode::GetTotalBytesRecv()));
- obj.push_back(Pair("totalbytessent", CNode::GetTotalBytesSent()));
+ obj.push_back(Pair("totalbytesrecv", g_connman->GetTotalBytesRecv()));
+ obj.push_back(Pair("totalbytessent", g_connman->GetTotalBytesSent()));
obj.push_back(Pair("timemillis", GetTimeMillis()));
UniValue outboundLimit(UniValue::VOBJ);
- outboundLimit.push_back(Pair("timeframe", CNode::GetMaxOutboundTimeframe()));
- outboundLimit.push_back(Pair("target", CNode::GetMaxOutboundTarget()));
- outboundLimit.push_back(Pair("target_reached", CNode::OutboundTargetReached(false)));
- outboundLimit.push_back(Pair("serve_historical_blocks", !CNode::OutboundTargetReached(true)));
- outboundLimit.push_back(Pair("bytes_left_in_cycle", CNode::GetOutboundTargetBytesLeft()));
- outboundLimit.push_back(Pair("time_left_in_cycle", CNode::GetMaxOutboundTimeLeftInCycle()));
+ outboundLimit.push_back(Pair("timeframe", g_connman->GetMaxOutboundTimeframe()));
+ outboundLimit.push_back(Pair("target", g_connman->GetMaxOutboundTarget()));
+ outboundLimit.push_back(Pair("target_reached", g_connman->OutboundTargetReached(false)));
+ outboundLimit.push_back(Pair("serve_historical_blocks", !g_connman->OutboundTargetReached(true)));
+ outboundLimit.push_back(Pair("bytes_left_in_cycle", g_connman->GetOutboundTargetBytesLeft()));
+ outboundLimit.push_back(Pair("time_left_in_cycle", g_connman->GetMaxOutboundTimeLeftInCycle()));
obj.push_back(Pair("uploadtarget", outboundLimit));
return obj;
}
@@ -435,6 +398,7 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp)
" \"subversion\": \"/Satoshi:x.x.x/\", (string) the server subversion string\n"
" \"protocolversion\": xxxxx, (numeric) the protocol version\n"
" \"localservices\": \"xxxxxxxxxxxxxxxx\", (string) the services we offer to the network\n"
+ " \"localrelay\": true|false, (bool) true if transaction relay is requested from peers\n"
" \"timeoffset\": xxxxx, (numeric) the time offset\n"
" \"connections\": xxxxx, (numeric) the number of connections\n"
" \"networks\": [ (array) information per network\n"
@@ -463,14 +427,16 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp)
);
LOCK(cs_main);
-
UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("version", CLIENT_VERSION));
obj.push_back(Pair("subversion", strSubVersion));
obj.push_back(Pair("protocolversion",PROTOCOL_VERSION));
- obj.push_back(Pair("localservices", strprintf("%016x", nLocalServices)));
+ if(g_connman)
+ obj.push_back(Pair("localservices", strprintf("%016x", g_connman->GetLocalServices())));
+ obj.push_back(Pair("localrelay", fRelayTxes));
obj.push_back(Pair("timeoffset", GetTimeOffset()));
- obj.push_back(Pair("connections", (int)vNodes.size()));
+ if(g_connman)
+ obj.push_back(Pair("connections", (int)g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL)));
obj.push_back(Pair("networks", GetNetworksInfo()));
obj.push_back(Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK())));
UniValue localAddresses(UniValue::VARR);
@@ -508,8 +474,10 @@ UniValue setban(const UniValue& params, bool fHelp)
"\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")
+ + HelpExampleRpc("setban", "\"192.168.0.6\", \"add\", 86400")
);
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
CSubNet subNet;
CNetAddr netAddr;
@@ -518,17 +486,20 @@ UniValue setban(const UniValue& params, bool fHelp)
if (params[0].get_str().find("/") != string::npos)
isSubnet = true;
- if (!isSubnet)
- netAddr = CNetAddr(params[0].get_str());
+ if (!isSubnet) {
+ CNetAddr resolved;
+ LookupHost(params[0].get_str().c_str(), resolved, false);
+ netAddr = resolved;
+ }
else
- subNet = CSubNet(params[0].get_str());
+ LookupSubNet(params[0].get_str().c_str(), subNet);
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))
+ if (isSubnet ? g_connman->IsBanned(subNet) : g_connman->IsBanned(netAddr))
throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: IP/Subnet already banned");
int64_t banTime = 0; //use standard bantime if not specified
@@ -539,21 +510,13 @@ UniValue setban(const UniValue& params, bool fHelp)
if (params.size() == 4 && params[3].isTrue())
absolute = true;
- isSubnet ? CNode::Ban(subNet, BanReasonManuallyAdded, banTime, absolute) : CNode::Ban(netAddr, BanReasonManuallyAdded, banTime, absolute);
-
- //disconnect possible nodes
- while(CNode *bannedNode = (isSubnet ? FindNode(subNet) : FindNode(netAddr)))
- bannedNode->fDisconnect = true;
+ isSubnet ? g_connman->Ban(subNet, BanReasonManuallyAdded, banTime, absolute) : g_connman->Ban(netAddr, BanReasonManuallyAdded, banTime, absolute);
}
else if(strCommand == "remove")
{
- if (!( isSubnet ? CNode::Unban(subNet) : CNode::Unban(netAddr) ))
+ if (!( isSubnet ? g_connman->Unban(subNet) : g_connman->Unban(netAddr) ))
throw JSONRPCError(RPC_MISC_ERROR, "Error: Unban failed");
}
-
- DumpBanlist(); //store banlist to disk
- uiInterface.BannedListChanged();
-
return NullUniValue;
}
@@ -568,8 +531,11 @@ UniValue listbanned(const UniValue& params, bool fHelp)
+ HelpExampleRpc("listbanned", "")
);
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
+
banmap_t banMap;
- CNode::GetBanned(banMap);
+ g_connman->GetBanned(banMap);
UniValue bannedAddresses(UniValue::VARR);
for (banmap_t::iterator it = banMap.begin(); it != banMap.end(); it++)
@@ -597,10 +563,32 @@ UniValue clearbanned(const UniValue& params, bool fHelp)
+ HelpExampleCli("clearbanned", "")
+ HelpExampleRpc("clearbanned", "")
);
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
- CNode::ClearBanned();
- DumpBanlist(); //store banlist to disk
- uiInterface.BannedListChanged();
+ g_connman->ClearBanned();
return NullUniValue;
}
+
+static const CRPCCommand commands[] =
+{ // category name actor (function) okSafeMode
+ // --------------------- ------------------------ ----------------------- ----------
+ { "network", "getconnectioncount", &getconnectioncount, true },
+ { "network", "ping", &ping, true },
+ { "network", "getpeerinfo", &getpeerinfo, true },
+ { "network", "addnode", &addnode, true },
+ { "network", "disconnectnode", &disconnectnode, true },
+ { "network", "getaddednodeinfo", &getaddednodeinfo, true },
+ { "network", "getnettotals", &getnettotals, true },
+ { "network", "getnetworkinfo", &getnetworkinfo, true },
+ { "network", "setban", &setban, true },
+ { "network", "listbanned", &listbanned, true },
+ { "network", "clearbanned", &clearbanned, true },
+};
+
+void RegisterNetRPCCommands(CRPCTable &t)
+{
+ for (unsigned int vcidx = 0; vcidx < ARRAYLEN(commands); vcidx++)
+ t.appendCommand(commands[vcidx].name, &commands[vcidx]);
+}
diff --git a/src/rpcprotocol.cpp b/src/rpc/protocol.cpp
index d83cd87f94..bb885bb5a6 100644
--- a/src/rpcprotocol.cpp
+++ b/src/rpc/protocol.cpp
@@ -1,9 +1,9 @@
// 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 "rpcprotocol.h"
+#include "rpc/protocol.h"
#include "random.h"
#include "tinyformat.h"
@@ -77,9 +77,10 @@ boost::filesystem::path GetAuthCookieFile()
bool GenerateAuthCookie(std::string *cookie_out)
{
- unsigned char rand_pwd[32];
- GetRandBytes(rand_pwd, 32);
- std::string cookie = COOKIEAUTH_USER + ":" + EncodeBase64(&rand_pwd[0],32);
+ const size_t COOKIE_SIZE = 32;
+ unsigned char rand_pwd[COOKIE_SIZE];
+ GetRandBytes(rand_pwd, COOKIE_SIZE);
+ std::string cookie = COOKIEAUTH_USER + ":" + HexStr(rand_pwd, rand_pwd+COOKIE_SIZE);
/** the umask determines what permissions are used to create this file -
* these are set to 077 in init.cpp unless overridden with -sysperms.
diff --git a/src/rpc/protocol.h b/src/rpc/protocol.h
new file mode 100644
index 0000000000..1d2ef0e41e
--- /dev/null
+++ b/src/rpc/protocol.h
@@ -0,0 +1,94 @@
+// Copyright (c) 2010 Satoshi Nakamoto
+// 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.
+
+#ifndef BITCOIN_RPCPROTOCOL_H
+#define BITCOIN_RPCPROTOCOL_H
+
+#include <list>
+#include <map>
+#include <stdint.h>
+#include <string>
+#include <boost/filesystem.hpp>
+
+#include <univalue.h>
+
+//! HTTP status codes
+enum HTTPStatusCode
+{
+ HTTP_OK = 200,
+ HTTP_BAD_REQUEST = 400,
+ HTTP_UNAUTHORIZED = 401,
+ HTTP_FORBIDDEN = 403,
+ HTTP_NOT_FOUND = 404,
+ HTTP_BAD_METHOD = 405,
+ HTTP_INTERNAL_SERVER_ERROR = 500,
+ HTTP_SERVICE_UNAVAILABLE = 503,
+};
+
+//! Bitcoin RPC error codes
+enum RPCErrorCode
+{
+ //! Standard JSON-RPC 2.0 errors
+ RPC_INVALID_REQUEST = -32600,
+ RPC_METHOD_NOT_FOUND = -32601,
+ RPC_INVALID_PARAMS = -32602,
+ RPC_INTERNAL_ERROR = -32603,
+ RPC_PARSE_ERROR = -32700,
+
+ //! General application defined errors
+ RPC_MISC_ERROR = -1, //!< std::exception thrown in command handling
+ RPC_FORBIDDEN_BY_SAFE_MODE = -2, //!< Server is in safe mode, and command is not allowed in safe mode
+ RPC_TYPE_ERROR = -3, //!< Unexpected type was passed as parameter
+ RPC_INVALID_ADDRESS_OR_KEY = -5, //!< Invalid address or key
+ RPC_OUT_OF_MEMORY = -7, //!< Ran out of memory during operation
+ RPC_INVALID_PARAMETER = -8, //!< Invalid, missing or duplicate parameter
+ RPC_DATABASE_ERROR = -20, //!< Database error
+ RPC_DESERIALIZATION_ERROR = -22, //!< Error parsing or validating structure in raw format
+ RPC_VERIFY_ERROR = -25, //!< General error during transaction or block submission
+ RPC_VERIFY_REJECTED = -26, //!< Transaction or block was rejected by network rules
+ RPC_VERIFY_ALREADY_IN_CHAIN = -27, //!< Transaction already in chain
+ RPC_IN_WARMUP = -28, //!< Client still warming up
+
+ //! Aliases for backward compatibility
+ RPC_TRANSACTION_ERROR = RPC_VERIFY_ERROR,
+ RPC_TRANSACTION_REJECTED = RPC_VERIFY_REJECTED,
+ RPC_TRANSACTION_ALREADY_IN_CHAIN= RPC_VERIFY_ALREADY_IN_CHAIN,
+
+ //! P2P client errors
+ RPC_CLIENT_NOT_CONNECTED = -9, //!< Bitcoin is not connected
+ 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
+ RPC_CLIENT_P2P_DISABLED = -31, //!< No valid connection manager instance found
+
+ //! Wallet errors
+ RPC_WALLET_ERROR = -4, //!< Unspecified problem with wallet (key not found etc.)
+ RPC_WALLET_INSUFFICIENT_FUNDS = -6, //!< Not enough funds in wallet or account
+ RPC_WALLET_INVALID_ACCOUNT_NAME = -11, //!< Invalid account name
+ RPC_WALLET_KEYPOOL_RAN_OUT = -12, //!< Keypool ran out, call keypoolrefill first
+ RPC_WALLET_UNLOCK_NEEDED = -13, //!< Enter the wallet passphrase with walletpassphrase first
+ RPC_WALLET_PASSPHRASE_INCORRECT = -14, //!< The wallet passphrase entered was incorrect
+ RPC_WALLET_WRONG_ENC_STATE = -15, //!< Command given in wrong wallet encryption state (encrypting an encrypted wallet etc.)
+ RPC_WALLET_ENCRYPTION_FAILED = -16, //!< Failed to encrypt the wallet
+ RPC_WALLET_ALREADY_UNLOCKED = -17, //!< Wallet is already unlocked
+};
+
+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);
+
+/** Get name of RPC authentication cookie file */
+boost::filesystem::path GetAuthCookieFile();
+/** Generate a new RPC authentication cookie and write it to disk */
+bool GenerateAuthCookie(std::string *cookie_out);
+/** Read the RPC authentication cookie from disk */
+bool GetAuthCookie(std::string *cookie_out);
+/** Delete RPC authentication cookie from disk */
+void DeleteAuthCookie();
+
+#endif // BITCOIN_RPCPROTOCOL_H
diff --git a/src/rpcrawtransaction.cpp b/src/rpc/rawtransaction.cpp
index 1f2d77aef0..d2ad0a52b7 100644
--- a/src/rpcrawtransaction.cpp
+++ b/src/rpc/rawtransaction.cpp
@@ -15,7 +15,7 @@
#include "net.h"
#include "policy/policy.h"
#include "primitives/transaction.h"
-#include "rpcserver.h"
+#include "rpc/server.h"
#include "script/script.h"
#include "script/script_error.h"
#include "script/sign.h"
@@ -62,11 +62,15 @@ void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fInclud
void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry)
{
entry.push_back(Pair("txid", tx.GetHash().GetHex()));
+ entry.push_back(Pair("hash", tx.GetWitnessHash().GetHex()));
entry.push_back(Pair("size", (int)::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION)));
+ entry.push_back(Pair("vsize", (int)::GetVirtualTransactionSize(tx)));
entry.push_back(Pair("version", tx.nVersion));
entry.push_back(Pair("locktime", (int64_t)tx.nLockTime));
+
UniValue vin(UniValue::VARR);
- BOOST_FOREACH(const CTxIn& txin, tx.vin) {
+ for (unsigned int i = 0; i < tx.vin.size(); i++) {
+ const CTxIn& txin = tx.vin[i];
UniValue in(UniValue::VOBJ);
if (tx.IsCoinBase())
in.push_back(Pair("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())));
@@ -78,6 +82,17 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry)
o.push_back(Pair("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())));
in.push_back(Pair("scriptSig", o));
}
+ if (!tx.wit.IsNull()) {
+ if (!tx.wit.vtxinwit[i].IsNull()) {
+ UniValue txinwitness(UniValue::VARR);
+ for (unsigned int j = 0; j < tx.wit.vtxinwit[i].scriptWitness.stack.size(); j++) {
+ std::vector<unsigned char> item = tx.wit.vtxinwit[i].scriptWitness.stack[j];
+ txinwitness.push_back(HexStr(item.begin(), item.end()));
+ }
+ in.push_back(Pair("txinwitness", txinwitness));
+ }
+
+ }
in.push_back(Pair("sequence", (int64_t)txin.nSequence));
vin.push_back(in);
}
@@ -134,7 +149,9 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp)
"{\n"
" \"hex\" : \"data\", (string) The serialized, hex-encoded data for 'txid'\n"
" \"txid\" : \"id\", (string) The transaction id (same as provided)\n"
- " \"size\" : n, (numeric) The transaction size\n"
+ " \"hash\" : \"id\", (string) The transaction hash (differs from txid for witness transactions)\n"
+ " \"size\" : n, (numeric) The serialized transaction size\n"
+ " \"vsize\" : n, (numeric) The virtual transaction size (differs from size for witness transactions)\n"
" \"version\" : n, (numeric) The version\n"
" \"locktime\" : ttt, (numeric) The lock time\n"
" \"vin\" : [ (array of json objects)\n"
@@ -146,6 +163,7 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp)
" \"hex\": \"hex\" (string) hex\n"
" },\n"
" \"sequence\": n (numeric) The script sequence number\n"
+ " \"txinwitness\": [\"hex\", ...] (array of string) hex-encoded witness data (if any)\n"
" }\n"
" ,...\n"
" ],\n"
@@ -211,7 +229,7 @@ UniValue gettxoutproof(const UniValue& params, bool fHelp)
"\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"
+ "specify the block in which the transaction is included manually (by blockhash).\n"
"\nReturn the raw transaction data.\n"
"\nArguments:\n"
"1. \"txids\" (string) A json array of txids to filter\n"
@@ -276,7 +294,7 @@ UniValue gettxoutproof(const UniValue& params, bool fHelp)
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);
+ CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS);
CMerkleBlock mb(block, setTxids);
ssMB << mb;
std::string strHex = HexStr(ssMB.begin(), ssMB.end());
@@ -296,14 +314,15 @@ UniValue verifytxoutproof(const UniValue& params, bool fHelp)
"[\"txid\"] (array, strings) The txid(s) which the proof commits to, or empty array if the proof is invalid\n"
);
- CDataStream ssMB(ParseHexV(params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION);
+ CDataStream ssMB(ParseHexV(params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS);
CMerkleBlock merkleBlock;
ssMB >> merkleBlock;
UniValue res(UniValue::VARR);
vector<uint256> vMatch;
- if (merkleBlock.txn.ExtractMatches(vMatch) != merkleBlock.header.hashMerkleRoot)
+ vector<unsigned int> vIndex;
+ if (merkleBlock.txn.ExtractMatches(vMatch, vIndex) != merkleBlock.header.hashMerkleRoot)
return res;
LOCK(cs_main);
@@ -333,12 +352,13 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp)
" {\n"
" \"txid\":\"id\", (string, required) The transaction id\n"
" \"vout\":n (numeric, required) The output number\n"
+ " \"sequence\":n (numeric, optional) The sequence number\n"
" }\n"
" ,...\n"
" ]\n"
"2. \"outputs\" (string, required) a json object with outputs\n"
" {\n"
- " \"address\": x.xxx (numeric, required) The key is the bitcoin address, the value is the " + CURRENCY_UNIT + " amount\n"
+ " \"address\": x.xxx (numeric or string, required) The key is the bitcoin address, the numeric value (can be string) is the " + CURRENCY_UNIT + " amount\n"
" \"data\": \"hex\", (string, required) The key is \"data\", the value is hex encoded data\n"
" ...\n"
" }\n"
@@ -353,7 +373,6 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp)
+ HelpExampleRpc("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"data\\\":\\\"00010203\\\"}\"")
);
- LOCK(cs_main);
RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VOBJ)(UniValue::VNUM), true);
if (params[0].isNull() || params[1].isNull())
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, arguments 1 and 2 must be non-null");
@@ -384,6 +403,17 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp)
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive");
uint32_t nSequence = (rawTx.nLockTime ? std::numeric_limits<uint32_t>::max() - 1 : std::numeric_limits<uint32_t>::max());
+
+ // set the sequence number if passed in the parameters object
+ const UniValue& sequenceObj = find_value(o, "sequence");
+ if (sequenceObj.isNum()) {
+ int64_t seqNr64 = sequenceObj.get_int64();
+ if (seqNr64 < 0 || seqNr64 > std::numeric_limits<uint32_t>::max())
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, sequence number is out of range");
+ else
+ nSequence = (uint32_t)seqNr64;
+ }
+
CTxIn in(COutPoint(txid, nOutput), CScript(), nSequence);
rawTx.vin.push_back(in);
@@ -431,7 +461,9 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp)
"\nResult:\n"
"{\n"
" \"txid\" : \"id\", (string) The transaction id\n"
+ " \"hash\" : \"id\", (string) The transaction hash (differs from txid for witness transactions)\n"
" \"size\" : n, (numeric) The transaction size\n"
+ " \"vsize\" : n, (numeric) The virtual transaction size (differs from size for witness transactions)\n"
" \"version\" : n, (numeric) The version\n"
" \"locktime\" : ttt, (numeric) The lock time\n"
" \"vin\" : [ (array of json objects)\n"
@@ -442,6 +474,7 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp)
" \"asm\": \"asm\", (string) asm\n"
" \"hex\": \"hex\" (string) hex\n"
" },\n"
+ " \"txinwitness\": [\"hex\", ...] (array of string) hex-encoded witness data (if any)\n"
" \"sequence\": n (numeric) The script sequence number\n"
" }\n"
" ,...\n"
@@ -475,7 +508,7 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp)
CTransaction tx;
- if (!DecodeHexTx(tx, params[0].get_str()))
+ if (!DecodeHexTx(tx, params[0].get_str(), true))
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
UniValue result(UniValue::VOBJ);
@@ -559,7 +592,8 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp)
" \"txid\":\"id\", (string, required) The transaction id\n"
" \"vout\":n, (numeric, required) The output number\n"
" \"scriptPubKey\": \"hex\", (string, required) script key\n"
- " \"redeemScript\": \"hex\" (string, required for P2SH) redeem script\n"
+ " \"redeemScript\": \"hex\", (string, required for P2SH or P2WSH) redeem script\n"
+ " \"amount\": value (numeric, required) The amount spent\n"
" }\n"
" ,...\n"
" ]\n"
@@ -675,7 +709,12 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp)
UniValue prevOut = p.get_obj();
- RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR));
+ RPCTypeCheckObj(prevOut,
+ {
+ {"txid", UniValueType(UniValue::VSTR)},
+ {"vout", UniValueType(UniValue::VNUM)},
+ {"scriptPubKey", UniValueType(UniValue::VSTR)},
+ });
uint256 txid = ParseHashO(prevOut, "txid");
@@ -697,13 +736,22 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp)
if ((unsigned int)nOut >= coins->vout.size())
coins->vout.resize(nOut+1);
coins->vout[nOut].scriptPubKey = scriptPubKey;
- coins->vout[nOut].nValue = 0; // we don't know the actual output value
+ coins->vout[nOut].nValue = 0;
+ if (prevOut.exists("amount")) {
+ coins->vout[nOut].nValue = AmountFromValue(find_value(prevOut, "amount"));
+ }
}
// 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()) {
- RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)("redeemScript",UniValue::VSTR));
+ if (fGivenKeys && (scriptPubKey.IsPayToScriptHash() || scriptPubKey.IsPayToWitnessScriptHash())) {
+ RPCTypeCheckObj(prevOut,
+ {
+ {"txid", UniValueType(UniValue::VSTR)},
+ {"vout", UniValueType(UniValue::VNUM)},
+ {"scriptPubKey", UniValueType(UniValue::VSTR)},
+ {"redeemScript", UniValueType(UniValue::VSTR)},
+ });
UniValue v = find_value(prevOut, "redeemScript");
if (!v.isNull()) {
vector<unsigned char> rsData(ParseHexV(v, "redeemScript"));
@@ -743,6 +791,9 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp)
// Script verification errors
UniValue vErrors(UniValue::VARR);
+ // Use CTransaction for the constant parts of the
+ // transaction to avoid rehashing.
+ const CTransaction txConst(mergedTx);
// Sign what we can:
for (unsigned int i = 0; i < mergedTx.vin.size(); i++) {
CTxIn& txin = mergedTx.vin[i];
@@ -752,18 +803,22 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp)
continue;
}
const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey;
+ const CAmount& amount = coins->vout[txin.prevout.n].nValue;
- txin.scriptSig.clear();
+ SignatureData sigdata;
// Only sign SIGHASH_SINGLE if there's a corresponding output:
if (!fHashSingle || (i < mergedTx.vout.size()))
- SignSignature(keystore, prevPubKey, mergedTx, i, nHashType);
+ ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata);
// ... and merge in other signatures:
BOOST_FOREACH(const CMutableTransaction& txv, txVariants) {
- txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig);
+ sigdata = CombineSignatures(prevPubKey, TransactionSignatureChecker(&txConst, i, amount), sigdata, DataFromTransaction(txv, i));
}
+
+ UpdateTransaction(mergedTx, i, sigdata);
+
ScriptError serror = SCRIPT_ERR_OK;
- if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) {
+ if (!VerifyScript(txin.scriptSig, prevPubKey, mergedTx.wit.vtxinwit.size() > i ? &mergedTx.wit.vtxinwit[i].scriptWitness : NULL, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount), &serror)) {
TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror));
}
}
@@ -811,9 +866,9 @@ UniValue sendrawtransaction(const UniValue& params, bool fHelp)
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
uint256 hashTx = tx.GetHash();
- bool fOverrideFees = false;
- if (params.size() > 1)
- fOverrideFees = params[1].get_bool();
+ CAmount nMaxRawTxFee = maxTxFee;
+ if (params.size() > 1 && params[1].get_bool())
+ nMaxRawTxFee = 0;
CCoinsViewCache &view = *pcoinsTip;
const CCoins* existingCoins = view.AccessCoins(hashTx);
@@ -823,7 +878,7 @@ UniValue sendrawtransaction(const UniValue& params, bool fHelp)
// push to local node and sync with wallets
CValidationState state;
bool fMissingInputs;
- if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, false, !fOverrideFees)) {
+ if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, false, nMaxRawTxFee)) {
if (state.IsInvalid()) {
throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason()));
} else {
@@ -836,7 +891,33 @@ UniValue sendrawtransaction(const UniValue& params, bool fHelp)
} else if (fHaveChain) {
throw JSONRPCError(RPC_TRANSACTION_ALREADY_IN_CHAIN, "transaction already in block chain");
}
- RelayTransaction(tx);
+ if(!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
+ CInv inv(MSG_TX, hashTx);
+ g_connman->ForEachNode([&inv](CNode* pnode)
+ {
+ pnode->PushInventory(inv);
+ });
return hashTx.GetHex();
}
+
+static const CRPCCommand commands[] =
+{ // category name actor (function) okSafeMode
+ // --------------------- ------------------------ ----------------------- ----------
+ { "rawtransactions", "getrawtransaction", &getrawtransaction, true },
+ { "rawtransactions", "createrawtransaction", &createrawtransaction, true },
+ { "rawtransactions", "decoderawtransaction", &decoderawtransaction, true },
+ { "rawtransactions", "decodescript", &decodescript, true },
+ { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false },
+ { "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */
+
+ { "blockchain", "gettxoutproof", &gettxoutproof, true },
+ { "blockchain", "verifytxoutproof", &verifytxoutproof, true },
+};
+
+void RegisterRawTransactionRPCCommands(CRPCTable &t)
+{
+ for (unsigned int vcidx = 0; vcidx < ARRAYLEN(commands); vcidx++)
+ t.appendCommand(commands[vcidx].name, &commands[vcidx]);
+}
diff --git a/src/rpc/register.h b/src/rpc/register.h
new file mode 100644
index 0000000000..49aee2365f
--- /dev/null
+++ b/src/rpc/register.h
@@ -0,0 +1,32 @@
+// Copyright (c) 2009-2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_RPCREGISTER_H
+#define BITCOIN_RPCREGISTER_H
+
+/** These are in one header file to avoid creating tons of single-function
+ * headers for everything under src/rpc/ */
+class CRPCTable;
+
+/** Register block chain RPC commands */
+void RegisterBlockchainRPCCommands(CRPCTable &tableRPC);
+/** Register P2P networking RPC commands */
+void RegisterNetRPCCommands(CRPCTable &tableRPC);
+/** Register miscellaneous RPC commands */
+void RegisterMiscRPCCommands(CRPCTable &tableRPC);
+/** Register mining RPC commands */
+void RegisterMiningRPCCommands(CRPCTable &tableRPC);
+/** Register raw transaction RPC commands */
+void RegisterRawTransactionRPCCommands(CRPCTable &tableRPC);
+
+static inline void RegisterAllCoreRPCCommands(CRPCTable &t)
+{
+ RegisterBlockchainRPCCommands(t);
+ RegisterNetRPCCommands(t);
+ RegisterMiscRPCCommands(t);
+ RegisterMiningRPCCommands(t);
+ RegisterRawTransactionRPCCommands(t);
+}
+
+#endif
diff --git a/src/rpcserver.cpp b/src/rpc/server.cpp
index 83d2c2d503..5fb97f7496 100644
--- a/src/rpcserver.cpp
+++ b/src/rpc/server.cpp
@@ -1,9 +1,9 @@
// 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 "rpcserver.h"
+#include "rpc/server.h"
#include "base58.h"
#include "init.h"
@@ -25,6 +25,8 @@
#include <boost/thread.hpp>
#include <boost/algorithm/string/case_conv.hpp> // for to_upper()
+#include <memory> // for unique_ptr
+
using namespace RPCServer;
using namespace std;
@@ -33,10 +35,9 @@ static bool fRPCInWarmup = true;
static std::string rpcWarmupStatus("RPC server started");
static CCriticalSection cs_rpcWarmup;
/* Timer-creating functions */
-static std::vector<RPCTimerInterface*> timerInterfaces;
-/* Map of name to timer.
- * @note Can be changed to std::unique_ptr when C++11 */
-static std::map<std::string, boost::shared_ptr<RPCTimerBase> > deadlineTimers;
+static RPCTimerInterface* timerInterface = NULL;
+/* Map of name to timer. */
+static std::map<std::string, std::unique_ptr<RPCTimerBase> > deadlineTimers;
static struct CRPCSignals
{
@@ -88,22 +89,33 @@ void RPCTypeCheck(const UniValue& params,
}
void RPCTypeCheckObj(const UniValue& o,
- const map<string, UniValue::VType>& typesExpected,
- bool fAllowNull)
+ const map<string, UniValueType>& typesExpected,
+ bool fAllowNull,
+ bool fStrict)
{
- BOOST_FOREACH(const PAIRTYPE(string, UniValue::VType)& t, typesExpected)
- {
+ for (const auto& t : typesExpected) {
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.isNull()))))
- {
+ if (!(t.second.typeAny || v.type() == t.second.type || (fAllowNull && v.isNull()))) {
string err = strprintf("Expected type %s for %s, got %s",
- uvTypeName(t.second), t.first, uvTypeName(v.type()));
+ uvTypeName(t.second.type), t.first, uvTypeName(v.type()));
throw JSONRPCError(RPC_TYPE_ERROR, err);
}
}
+
+ if (fStrict)
+ {
+ BOOST_FOREACH(const string& k, o.getKeys())
+ {
+ if (typesExpected.count(k) == 0)
+ {
+ string err = strprintf("Unexpected key %s", k);
+ throw JSONRPCError(RPC_TYPE_ERROR, err);
+ }
+ }
+ }
}
CAmount AmountFromValue(const UniValue& value)
@@ -256,123 +268,8 @@ static const CRPCCommand vRPCCommands[] =
{ // category name actor (function) okSafeMode
// --------------------- ------------------------ ----------------------- ----------
/* Overall control/query calls */
- { "control", "getinfo", &getinfo, true }, /* uses wallet if enabled */
{ "control", "help", &help, true },
{ "control", "stop", &stop, true },
-
- /* P2P networking */
- { "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 },
- { "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 },
- { "mining", "getmininginfo", &getmininginfo, true },
- { "mining", "getnetworkhashps", &getnetworkhashps, true },
- { "mining", "prioritisetransaction", &prioritisetransaction, true },
- { "mining", "submitblock", &submitblock, true },
-
- /* Coin generation */
- { "generating", "getgenerate", &getgenerate, true },
- { "generating", "setgenerate", &setgenerate, true },
- { "generating", "generate", &generate, true },
-
- /* Raw transactions */
- { "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 },
- { "util", "validateaddress", &validateaddress, true }, /* uses wallet if enabled */
- { "util", "verifymessage", &verifymessage, true },
- { "util", "estimatefee", &estimatefee, true },
- { "util", "estimatepriority", &estimatepriority, true },
- { "util", "estimatesmartfee", &estimatesmartfee, true },
- { "util", "estimatesmartpriority", &estimatesmartpriority, true },
-
- /* Not shown in help */
- { "hidden", "invalidateblock", &invalidateblock, true },
- { "hidden", "reconsiderblock", &reconsiderblock, true },
- { "hidden", "setmocktime", &setmocktime, true },
-#ifdef ENABLE_WALLET
- { "hidden", "resendwallettransactions", &resendwallettransactions, true},
-#endif
-
-#ifdef ENABLE_WALLET
- /* Wallet */
- { "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", "importpubkey", &importpubkey, 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
};
CRPCTable::CRPCTable()
@@ -395,6 +292,20 @@ const CRPCCommand *CRPCTable::operator[](const std::string &name) const
return (*it).second;
}
+bool CRPCTable::appendCommand(const std::string& name, const CRPCCommand* pcmd)
+{
+ if (IsRPCRunning())
+ return false;
+
+ // don't allow overwriting for now
+ map<string, const CRPCCommand*>::const_iterator it = mapCommands.find(name);
+ if (it != mapCommands.end())
+ return false;
+
+ mapCommands[name] = pcmd;
+ return true;
+}
+
bool StartRPC()
{
LogPrint("rpc", "Starting RPC\n");
@@ -535,6 +446,17 @@ UniValue CRPCTable::execute(const std::string &strMethod, const UniValue &params
g_rpcSignals.PostCommand(*pcmd);
}
+std::vector<std::string> CRPCTable::listCommands() const
+{
+ std::vector<std::string> commandList;
+ typedef std::map<std::string, const CRPCCommand*> commandMap;
+
+ std::transform( mapCommands.begin(), mapCommands.end(),
+ std::back_inserter(commandList),
+ boost::bind(&commandMap::value_type::first,_1) );
+ return commandList;
+}
+
std::string HelpExampleCli(const std::string& methodname, const std::string& args)
{
return "> bitcoin-cli " + methodname + " " + args + "\n";
@@ -546,26 +468,30 @@ std::string HelpExampleRpc(const std::string& methodname, const std::string& arg
"\"method\": \"" + methodname + "\", \"params\": [" + args + "] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/\n";
}
-void RPCRegisterTimerInterface(RPCTimerInterface *iface)
+void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)
+{
+ if (!timerInterface)
+ timerInterface = iface;
+}
+
+void RPCSetTimerInterface(RPCTimerInterface *iface)
{
- timerInterfaces.push_back(iface);
+ timerInterface = iface;
}
-void RPCUnregisterTimerInterface(RPCTimerInterface *iface)
+void RPCUnsetTimerInterface(RPCTimerInterface *iface)
{
- std::vector<RPCTimerInterface*>::iterator i = std::find(timerInterfaces.begin(), timerInterfaces.end(), iface);
- assert(i != timerInterfaces.end());
- timerInterfaces.erase(i);
+ if (timerInterface == iface)
+ timerInterface = NULL;
}
void RPCRunLater(const std::string& name, boost::function<void(void)> func, int64_t nSeconds)
{
- if (timerInterfaces.empty())
+ if (!timerInterface)
throw JSONRPCError(RPC_INTERNAL_ERROR, "No timer handler registered for RPC");
deadlineTimers.erase(name);
- RPCTimerInterface* timerInterface = timerInterfaces[0];
LogPrint("rpc", "queue run of timer %s in %i seconds (using %s)\n", name, nSeconds, timerInterface->Name());
- deadlineTimers.insert(std::make_pair(name, boost::shared_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000))));
+ deadlineTimers.emplace(name, std::unique_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000)));
}
-const CRPCTable tableRPC;
+CRPCTable tableRPC;
diff --git a/src/rpc/server.h b/src/rpc/server.h
new file mode 100644
index 0000000000..4e0aa2c6d6
--- /dev/null
+++ b/src/rpc/server.h
@@ -0,0 +1,199 @@
+// Copyright (c) 2010 Satoshi Nakamoto
+// 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.
+
+#ifndef BITCOIN_RPCSERVER_H
+#define BITCOIN_RPCSERVER_H
+
+#include "amount.h"
+#include "rpc/protocol.h"
+#include "uint256.h"
+
+#include <list>
+#include <map>
+#include <stdint.h>
+#include <string>
+
+#include <boost/function.hpp>
+
+#include <univalue.h>
+
+class CRPCCommand;
+
+namespace RPCServer
+{
+ void OnStarted(boost::function<void ()> slot);
+ void OnStopped(boost::function<void ()> slot);
+ void OnPreCommand(boost::function<void (const CRPCCommand&)> slot);
+ void OnPostCommand(boost::function<void (const CRPCCommand&)> slot);
+}
+
+class CBlockIndex;
+class CNetAddr;
+
+/** Wrapper for UniValue::VType, which includes typeAny:
+ * Used to denote don't care type. Only used by RPCTypeCheckObj */
+struct UniValueType {
+ UniValueType(UniValue::VType _type) : typeAny(false), type(_type) {}
+ UniValueType() : typeAny(true) {}
+ bool typeAny;
+ UniValue::VType type;
+};
+
+class JSONRequest
+{
+public:
+ UniValue id;
+ std::string strMethod;
+ UniValue params;
+
+ JSONRequest() { id = NullUniValue; }
+ void parse(const UniValue& valRequest);
+};
+
+/** 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.
+ */
+void SetRPCWarmupStatus(const std::string& newStatus);
+/* Mark warmup as done. RPC calls will be processed from now on. */
+void SetRPCWarmupFinished();
+
+/* returns the current warmup state. */
+bool RPCIsInWarmup(std::string *statusOut);
+
+/**
+ * Type-check arguments; throws JSONRPCError if wrong type given. Does not check that
+ * the right number of arguments are passed, just that any passed are the correct type.
+ */
+void RPCTypeCheck(const UniValue& params,
+ const std::list<UniValue::VType>& typesExpected, bool fAllowNull=false);
+
+/*
+ Check for expected keys/value types in an Object.
+*/
+void RPCTypeCheckObj(const UniValue& o,
+ const std::map<std::string, UniValueType>& typesExpected,
+ bool fAllowNull = false,
+ bool fStrict = false);
+
+/** Opaque base class for timers returned by NewTimerFunc.
+ * This provides no methods at the moment, but makes sure that delete
+ * cleans up the whole state.
+ */
+class RPCTimerBase
+{
+public:
+ virtual ~RPCTimerBase() {}
+};
+
+/**
+ * RPC timer "driver".
+ */
+class RPCTimerInterface
+{
+public:
+ virtual ~RPCTimerInterface() {}
+ /** Implementation name */
+ virtual const char *Name() = 0;
+ /** Factory function for timers.
+ * RPC will call the function to create a timer that will call func in *millis* milliseconds.
+ * @note As the RPC mechanism is backend-neutral, it can use different implementations of timers.
+ * This is needed to cope with the case in which there is no HTTP server, but
+ * only GUI RPC console, and to break the dependency of pcserver on httprpc.
+ */
+ virtual RPCTimerBase* NewTimer(boost::function<void(void)>& func, int64_t millis) = 0;
+};
+
+/** Set the factory function for timers */
+void RPCSetTimerInterface(RPCTimerInterface *iface);
+/** Set the factory function for timer, but only, if unset */
+void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface);
+/** Unset factory function for timers */
+void RPCUnsetTimerInterface(RPCTimerInterface *iface);
+
+/**
+ * Run func nSeconds from now.
+ * Overrides previous timer <name> (if any).
+ */
+void RPCRunLater(const std::string& name, boost::function<void(void)> func, int64_t nSeconds);
+
+typedef UniValue(*rpcfn_type)(const UniValue& params, bool fHelp);
+
+class CRPCCommand
+{
+public:
+ std::string category;
+ std::string name;
+ rpcfn_type actor;
+ bool okSafeMode;
+};
+
+/**
+ * Bitcoin RPC command dispatcher.
+ */
+class CRPCTable
+{
+private:
+ std::map<std::string, const CRPCCommand*> mapCommands;
+public:
+ CRPCTable();
+ 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 UniValue Array of arguments (JSON objects)
+ * @returns Result of the call.
+ * @throws an exception (UniValue) when an error happens.
+ */
+ UniValue execute(const std::string &method, const UniValue &params) const;
+
+ /**
+ * Returns a list of registered commands
+ * @returns List of registered commands.
+ */
+ std::vector<std::string> listCommands() const;
+
+
+ /**
+ * Appends a CRPCCommand to the dispatch table.
+ * Returns false if RPC server is already running (dump concurrency protection).
+ * Commands cannot be overwritten (returns false).
+ */
+ bool appendCommand(const std::string& name, const CRPCCommand* pcmd);
+};
+
+extern CRPCTable tableRPC;
+
+/**
+ * Utilities: convert hex-encoded Values
+ * (throws error if not hex).
+ */
+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 int64_t nWalletUnlockTime;
+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(const std::string& methodname, const std::string& args);
+extern std::string HelpExampleRpc(const std::string& methodname, const std::string& args);
+
+extern void EnsureWalletIsUnlocked();
+
+bool StartRPC();
+void InterruptRPC();
+void StopRPC();
+std::string JSONRPCExecBatch(const UniValue& vReq);
+void RPCNotifyBlockChange(bool ibd, const CBlockIndex *);
+
+#endif // BITCOIN_RPCSERVER_H
diff --git a/src/rpcprotocol.h b/src/rpcprotocol.h
deleted file mode 100644
index 9cf1ab6d99..0000000000
--- a/src/rpcprotocol.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (c) 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_RPCPROTOCOL_H
-#define BITCOIN_RPCPROTOCOL_H
-
-#include <list>
-#include <map>
-#include <stdint.h>
-#include <string>
-#include <boost/filesystem.hpp>
-
-#include <univalue.h>
-
-//! HTTP status codes
-enum HTTPStatusCode
-{
- HTTP_OK = 200,
- HTTP_BAD_REQUEST = 400,
- HTTP_UNAUTHORIZED = 401,
- HTTP_FORBIDDEN = 403,
- HTTP_NOT_FOUND = 404,
- HTTP_BAD_METHOD = 405,
- HTTP_INTERNAL_SERVER_ERROR = 500,
- HTTP_SERVICE_UNAVAILABLE = 503,
-};
-
-//! Bitcoin RPC error codes
-enum RPCErrorCode
-{
- //! Standard JSON-RPC 2.0 errors
- RPC_INVALID_REQUEST = -32600,
- RPC_METHOD_NOT_FOUND = -32601,
- RPC_INVALID_PARAMS = -32602,
- RPC_INTERNAL_ERROR = -32603,
- RPC_PARSE_ERROR = -32700,
-
- //! General application defined errors
- RPC_MISC_ERROR = -1, //! std::exception thrown in command handling
- RPC_FORBIDDEN_BY_SAFE_MODE = -2, //! Server is in safe mode, and command is not allowed in safe mode
- RPC_TYPE_ERROR = -3, //! Unexpected type was passed as parameter
- RPC_INVALID_ADDRESS_OR_KEY = -5, //! Invalid address or key
- RPC_OUT_OF_MEMORY = -7, //! Ran out of memory during operation
- RPC_INVALID_PARAMETER = -8, //! Invalid, missing or duplicate parameter
- RPC_DATABASE_ERROR = -20, //! Database error
- RPC_DESERIALIZATION_ERROR = -22, //! Error parsing or validating structure in raw format
- RPC_VERIFY_ERROR = -25, //! General error during transaction or block submission
- RPC_VERIFY_REJECTED = -26, //! Transaction or block was rejected by network rules
- RPC_VERIFY_ALREADY_IN_CHAIN = -27, //! Transaction already in chain
- RPC_IN_WARMUP = -28, //! Client still warming up
-
- //! Aliases for backward compatibility
- RPC_TRANSACTION_ERROR = RPC_VERIFY_ERROR,
- RPC_TRANSACTION_REJECTED = RPC_VERIFY_REJECTED,
- RPC_TRANSACTION_ALREADY_IN_CHAIN= RPC_VERIFY_ALREADY_IN_CHAIN,
-
- //! P2P client errors
- RPC_CLIENT_NOT_CONNECTED = -9, //! Bitcoin is not connected
- 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.)
- RPC_WALLET_INSUFFICIENT_FUNDS = -6, //! Not enough funds in wallet or account
- RPC_WALLET_INVALID_ACCOUNT_NAME = -11, //! Invalid account name
- RPC_WALLET_KEYPOOL_RAN_OUT = -12, //! Keypool ran out, call keypoolrefill first
- RPC_WALLET_UNLOCK_NEEDED = -13, //! Enter the wallet passphrase with walletpassphrase first
- RPC_WALLET_PASSPHRASE_INCORRECT = -14, //! The wallet passphrase entered was incorrect
- RPC_WALLET_WRONG_ENC_STATE = -15, //! Command given in wrong wallet encryption state (encrypting an encrypted wallet etc.)
- RPC_WALLET_ENCRYPTION_FAILED = -16, //! Failed to encrypt the wallet
- RPC_WALLET_ALREADY_UNLOCKED = -17, //! Wallet is already unlocked
-};
-
-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);
-
-/** Get name of RPC authentication cookie file */
-boost::filesystem::path GetAuthCookieFile();
-/** Generate a new RPC authentication cookie and write it to disk */
-bool GenerateAuthCookie(std::string *cookie_out);
-/** Read the RPC authentication cookie from disk */
-bool GetAuthCookie(std::string *cookie_out);
-/** Delete RPC authentication cookie from disk */
-void DeleteAuthCookie();
-
-#endif // BITCOIN_RPCPROTOCOL_H
diff --git a/src/rpcserver.h b/src/rpcserver.h
deleted file mode 100644
index fc88f82be8..0000000000
--- a/src/rpcserver.h
+++ /dev/null
@@ -1,272 +0,0 @@
-// Copyright (c) 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_RPCSERVER_H
-#define BITCOIN_RPCSERVER_H
-
-#include "amount.h"
-#include "rpcprotocol.h"
-#include "uint256.h"
-
-#include <list>
-#include <map>
-#include <stdint.h>
-#include <string>
-
-#include <boost/function.hpp>
-
-#include <univalue.h>
-
-class CRPCCommand;
-
-namespace RPCServer
-{
- void OnStarted(boost::function<void ()> slot);
- void OnStopped(boost::function<void ()> slot);
- void OnPreCommand(boost::function<void (const CRPCCommand&)> slot);
- void OnPostCommand(boost::function<void (const CRPCCommand&)> slot);
-}
-
-class CBlockIndex;
-class CNetAddr;
-
-class JSONRequest
-{
-public:
- UniValue id;
- std::string strMethod;
- UniValue params;
-
- JSONRequest() { id = NullUniValue; }
- void parse(const UniValue& valRequest);
-};
-
-/** 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.
- */
-void SetRPCWarmupStatus(const std::string& newStatus);
-/* Mark warmup as done. RPC calls will be processed from now on. */
-void SetRPCWarmupFinished();
-
-/* returns the current warmup state. */
-bool RPCIsInWarmup(std::string *statusOut);
-
-/**
- * Type-check arguments; throws JSONRPCError if wrong type given. Does not check that
- * 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 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);
-
-/** Opaque base class for timers returned by NewTimerFunc.
- * This provides no methods at the moment, but makes sure that delete
- * cleans up the whole state.
- */
-class RPCTimerBase
-{
-public:
- virtual ~RPCTimerBase() {}
-};
-
-/**
- * RPC timer "driver".
- */
-class RPCTimerInterface
-{
-public:
- virtual ~RPCTimerInterface() {}
- /** Implementation name */
- virtual const char *Name() = 0;
- /** Factory function for timers.
- * RPC will call the function to create a timer that will call func in *millis* milliseconds.
- * @note As the RPC mechanism is backend-neutral, it can use different implementations of timers.
- * This is needed to cope with the case in which there is no HTTP server, but
- * only GUI RPC console, and to break the dependency of pcserver on httprpc.
- */
- virtual RPCTimerBase* NewTimer(boost::function<void(void)>& func, int64_t millis) = 0;
-};
-
-/** Register factory function for timers */
-void RPCRegisterTimerInterface(RPCTimerInterface *iface);
-/** Unregister factory function for timers */
-void RPCUnregisterTimerInterface(RPCTimerInterface *iface);
-
-/**
- * Run func nSeconds from now.
- * Overrides previous timer <name> (if any).
- */
-void RPCRunLater(const std::string& name, boost::function<void(void)> func, int64_t nSeconds);
-
-typedef UniValue(*rpcfn_type)(const UniValue& params, bool fHelp);
-
-class CRPCCommand
-{
-public:
- std::string category;
- std::string name;
- rpcfn_type actor;
- bool okSafeMode;
-};
-
-/**
- * Bitcoin RPC command dispatcher.
- */
-class CRPCTable
-{
-private:
- std::map<std::string, const CRPCCommand*> mapCommands;
-public:
- CRPCTable();
- 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 UniValue Array of arguments (JSON objects)
- * @returns Result of the call.
- * @throws an exception (UniValue) when an error happens.
- */
- UniValue execute(const std::string &method, const UniValue &params) const;
-};
-
-extern const CRPCTable tableRPC;
-
-/**
- * Utilities: convert hex-encoded Values
- * (throws error if not hex).
- */
-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 int64_t nWalletUnlockTime;
-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(const std::string& methodname, const std::string& args);
-extern std::string HelpExampleRpc(const std::string& methodname, const std::string& args);
-
-extern void EnsureWalletIsUnlocked();
-
-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 importpubkey(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 estimatesmartfee(const UniValue& params, bool fHelp);
-extern UniValue estimatesmartpriority(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);
-
-bool StartRPC();
-void InterruptRPC();
-void StopRPC();
-std::string JSONRPCExecBatch(const UniValue& vReq);
-
-#endif // BITCOIN_RPCSERVER_H
diff --git a/src/scheduler.cpp b/src/scheduler.cpp
index 184ddc28ab..52777b61f9 100644
--- a/src/scheduler.cpp
+++ b/src/scheduler.cpp
@@ -79,6 +79,7 @@ void CScheduler::serviceQueue()
}
}
--nThreadsServicingQueue;
+ newTaskScheduled.notify_one();
}
void CScheduler::stop(bool drain)
diff --git a/src/script/bitcoinconsensus.cpp b/src/script/bitcoinconsensus.cpp
index 79504f6ad3..b629f4278b 100644
--- a/src/script/bitcoinconsensus.cpp
+++ b/src/script/bitcoinconsensus.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -69,7 +69,7 @@ struct ECCryptoClosure
ECCryptoClosure instance_of_eccryptoclosure;
}
-int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen,
+static int verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, CAmount amount,
const unsigned char *txTo , unsigned int txToLen,
unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err)
{
@@ -82,15 +82,36 @@ int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned i
if (tx.GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION) != txToLen)
return set_error(err, bitcoinconsensus_ERR_TX_SIZE_MISMATCH);
- // Regardless of the verification result, the tx did not error.
- set_error(err, bitcoinconsensus_ERR_OK);
-
- return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn), NULL);
+ // Regardless of the verification result, the tx did not error.
+ set_error(err, bitcoinconsensus_ERR_OK);
+ PrecomputedTransactionData txdata(tx);
+ return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), nIn < tx.wit.vtxinwit.size() ? &tx.wit.vtxinwit[nIn].scriptWitness : NULL, flags, TransactionSignatureChecker(&tx, nIn, amount, txdata), NULL);
} catch (const std::exception&) {
return set_error(err, bitcoinconsensus_ERR_TX_DESERIALIZE); // Error deserializing
}
}
+int bitcoinconsensus_verify_script_with_amount(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, int64_t amount,
+ const unsigned char *txTo , unsigned int txToLen,
+ unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err)
+{
+ CAmount am(amount);
+ return ::verify_script(scriptPubKey, scriptPubKeyLen, am, txTo, txToLen, nIn, flags, err);
+}
+
+
+int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen,
+ const unsigned char *txTo , unsigned int txToLen,
+ unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err)
+{
+ if (flags & bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS) {
+ return set_error(err, bitcoinconsensus_ERR_AMOUNT_REQUIRED);
+ }
+
+ CAmount am(0);
+ return ::verify_script(scriptPubKey, scriptPubKeyLen, am, txTo, txToLen, nIn, flags, err);
+}
+
unsigned int bitcoinconsensus_version()
{
// Just use the API version for now
diff --git a/src/script/bitcoinconsensus.h b/src/script/bitcoinconsensus.h
index a48ff1e18d..1d2d5c23e4 100644
--- a/src/script/bitcoinconsensus.h
+++ b/src/script/bitcoinconsensus.h
@@ -1,11 +1,13 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Copyright (c) 2009-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_BITCOINCONSENSUS_H
#define BITCOIN_BITCOINCONSENSUS_H
+#include <stdint.h>
+
#if defined(BUILD_BITCOIN_INTERNAL) && defined(HAVE_CONFIG_H)
#include "config/bitcoin-config.h"
#if defined(_WIN32)
@@ -31,7 +33,7 @@
extern "C" {
#endif
-#define BITCOINCONSENSUS_API_VER 0
+#define BITCOINCONSENSUS_API_VER 1
typedef enum bitcoinconsensus_error_t
{
@@ -39,6 +41,7 @@ typedef enum bitcoinconsensus_error_t
bitcoinconsensus_ERR_TX_INDEX,
bitcoinconsensus_ERR_TX_SIZE_MISMATCH,
bitcoinconsensus_ERR_TX_DESERIALIZE,
+ bitcoinconsensus_ERR_AMOUNT_REQUIRED,
} bitcoinconsensus_error;
/** Script verification flags */
@@ -47,7 +50,10 @@ enum
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0,
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_DERSIG = (1U << 2), // enforce strict DER (BIP66) compliance
+ bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NULLDUMMY = (1U << 4), // enforce NULLDUMMY (BIP147)
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), // enable CHECKLOCKTIMEVERIFY (BIP65)
+ bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKSEQUENCEVERIFY = (1U << 10), // enable CHECKSEQUENCEVERIFY (BIP112)
+ bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS = (1U << 11), // enable WITNESS (BIP141)
};
/// Returns 1 if the input nIn of the serialized transaction pointed to by
@@ -55,6 +61,10 @@ enum
/// the additional constraints specified by flags.
/// If not NULL, err will contain an error/success code for the operation
EXPORT_SYMBOL int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen,
+ const unsigned char *txTo , unsigned int txToLen,
+ unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err);
+
+EXPORT_SYMBOL int bitcoinconsensus_verify_script_with_amount(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, int64_t amount,
const unsigned char *txTo , unsigned int txToLen,
unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err);
diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp
index 57e0edc4b4..836cf9ee35 100644
--- a/src/script/interpreter.cpp
+++ b/src/script/interpreter.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -79,8 +79,20 @@ bool static IsCompressedOrUncompressedPubKey(const valtype &vchPubKey) {
return false;
}
} else {
- // Non-canonical public key: neither compressed nor uncompressed
- return false;
+ // Non-canonical public key: neither compressed nor uncompressed
+ return false;
+ }
+ return true;
+}
+
+bool static IsCompressedPubKey(const valtype &vchPubKey) {
+ if (vchPubKey.size() != 33) {
+ // Non-canonical public key: invalid length for compressed key
+ return false;
+ }
+ if (vchPubKey[0] != 0x02 && vchPubKey[0] != 0x03) {
+ // Non-canonical public key: invalid prefix for compressed key
+ return false;
}
return true;
}
@@ -165,7 +177,10 @@ bool static IsLowDERSignature(const valtype &vchSig, ScriptError* serror) {
return set_error(serror, SCRIPT_ERR_SIG_DER);
}
std::vector<unsigned char> vchSigCopy(vchSig.begin(), vchSig.begin() + vchSig.size() - 1);
- return CPubKey::CheckLowS(vchSigCopy);
+ if (!CPubKey::CheckLowS(vchSigCopy)) {
+ return set_error(serror, SCRIPT_ERR_SIG_HIGH_S);
+ }
+ return true;
}
bool static IsDefinedHashtypeSignature(const valtype &vchSig) {
@@ -196,10 +211,14 @@ bool CheckSignatureEncoding(const vector<unsigned char> &vchSig, unsigned int fl
return true;
}
-bool static CheckPubKeyEncoding(const valtype &vchSig, unsigned int flags, ScriptError* serror) {
- if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsCompressedOrUncompressedPubKey(vchSig)) {
+bool static CheckPubKeyEncoding(const valtype &vchPubKey, unsigned int flags, const SigVersion &sigversion, ScriptError* serror) {
+ if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsCompressedOrUncompressedPubKey(vchPubKey)) {
return set_error(serror, SCRIPT_ERR_PUBKEYTYPE);
}
+ // Only compressed keys are accepted in segwit
+ if ((flags & SCRIPT_VERIFY_WITNESS_PUBKEYTYPE) != 0 && sigversion == SIGVERSION_WITNESS_V0 && !IsCompressedPubKey(vchPubKey)) {
+ return set_error(serror, SCRIPT_ERR_WITNESS_PUBKEYTYPE);
+ }
return true;
}
@@ -226,7 +245,7 @@ bool static CheckMinimalPush(const valtype& data, opcodetype opcode) {
return true;
}
-bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
+bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror)
{
static const CScriptNum bnZero(0);
static const CScriptNum bnOne(1);
@@ -244,7 +263,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
vector<bool> vfExec;
vector<valtype> altstack;
set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
- if (script.size() > 10000)
+ if (script.size() > MAX_SCRIPT_SIZE)
return set_error(serror, SCRIPT_ERR_SCRIPT_SIZE);
int nOpCount = 0;
bool fRequireMinimal = (flags & SCRIPT_VERIFY_MINIMALDATA) != 0;
@@ -370,7 +389,44 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
break;
}
- case OP_NOP1: case OP_NOP3: case OP_NOP4: case OP_NOP5:
+ case OP_CHECKSEQUENCEVERIFY:
+ {
+ if (!(flags & SCRIPT_VERIFY_CHECKSEQUENCEVERIFY)) {
+ // not enabled; treat as a NOP3
+ 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);
+
+ // nSequence, like nLockTime, is a 32-bit unsigned integer
+ // field. See the comment in CHECKLOCKTIMEVERIFY regarding
+ // 5-byte numeric operands.
+ const CScriptNum nSequence(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 CHECKSEQUENCEVERIFY.
+ if (nSequence < 0)
+ return set_error(serror, SCRIPT_ERR_NEGATIVE_LOCKTIME);
+
+ // To provide for future soft-fork extensibility, if the
+ // operand has the disabled lock-time flag set,
+ // CHECKSEQUENCEVERIFY behaves as a NOP.
+ if ((nSequence & CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG) != 0)
+ break;
+
+ // Compare the specified sequence number with the input.
+ if (!checker.CheckSequence(nSequence))
+ return set_error(serror, SCRIPT_ERR_UNSATISFIED_LOCKTIME);
+
+ break;
+ }
+
+ case OP_NOP1: 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)
@@ -388,6 +444,12 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
if (stack.size() < 1)
return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL);
valtype& vch = stacktop(-1);
+ if (sigversion == SIGVERSION_WITNESS_V0 && (flags & SCRIPT_VERIFY_MINIMALIF)) {
+ if (vch.size() > 1)
+ return set_error(serror, SCRIPT_ERR_MINIMALIF);
+ if (vch.size() == 1 && vch[0] != 1)
+ return set_error(serror, SCRIPT_ERR_MINIMALIF);
+ }
fValue = CastToBool(vch);
if (opcode == OP_NOTIF)
fValue = !fValue;
@@ -829,13 +891,18 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
CScript scriptCode(pbegincodehash, pend);
// Drop the signature, since there's no way for a signature to sign itself
- scriptCode.FindAndDelete(CScript(vchSig));
+ if (sigversion == SIGVERSION_BASE) {
+ scriptCode.FindAndDelete(CScript(vchSig));
+ }
- if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, serror)) {
+ if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, sigversion, serror)) {
//serror is set
return false;
}
- bool fSuccess = checker.CheckSig(vchSig, vchPubKey, scriptCode);
+ bool fSuccess = checker.CheckSig(vchSig, vchPubKey, scriptCode, sigversion);
+
+ if (!fSuccess && (flags & SCRIPT_VERIFY_NULLFAIL) && vchSig.size())
+ return set_error(serror, SCRIPT_ERR_SIG_NULLFAIL);
popstack(stack);
popstack(stack);
@@ -866,6 +933,9 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
if (nOpCount > MAX_OPS_PER_SCRIPT)
return set_error(serror, SCRIPT_ERR_OP_COUNT);
int ikey = ++i;
+ // ikey2 is the position of last non-signature item in the stack. Top stack item = 1.
+ // With SCRIPT_VERIFY_NULLFAIL, this is used for cleanup if operation fails.
+ int ikey2 = nKeysCount + 2;
i += nKeysCount;
if ((int)stack.size() < i)
return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
@@ -885,7 +955,9 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
for (int k = 0; k < nSigsCount; k++)
{
valtype& vchSig = stacktop(-isig-k);
- scriptCode.FindAndDelete(CScript(vchSig));
+ if (sigversion == SIGVERSION_BASE) {
+ scriptCode.FindAndDelete(CScript(vchSig));
+ }
}
bool fSuccess = true;
@@ -897,13 +969,13 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
// Note how this makes the exact order of pubkey/signature evaluation
// distinguishable by CHECKMULTISIG NOT if the STRICTENC flag is set.
// See the script_(in)valid tests for details.
- if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, serror)) {
+ if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, sigversion, serror)) {
// serror is set
return false;
}
// Check signature
- bool fOk = checker.CheckSig(vchSig, vchPubKey, scriptCode);
+ bool fOk = checker.CheckSig(vchSig, vchPubKey, scriptCode, sigversion);
if (fOk) {
isig++;
@@ -920,8 +992,14 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
}
// Clean up stack of actual arguments
- while (i-- > 1)
+ while (i-- > 1) {
+ // If the operation failed, we require that all signatures must be empty vector
+ if (!fSuccess && (flags & SCRIPT_VERIFY_NULLFAIL) && !ikey2 && stacktop(-1).size())
+ return set_error(serror, SCRIPT_ERR_SIG_NULLFAIL);
+ if (ikey2 > 0)
+ ikey2--;
popstack(stack);
+ }
// A bug causes CHECKMULTISIG to consume one extra argument
// whose contents were not checked in any way.
@@ -975,12 +1053,12 @@ namespace {
*/
class CTransactionSignatureSerializer {
private:
- const CTransaction &txTo; //! reference to the spending transaction (the one being serialized)
- const CScript &scriptCode; //! output script being consumed
- const unsigned int nIn; //! input index of txTo being signed
- const bool fAnyoneCanPay; //! whether the hashtype has the SIGHASH_ANYONECANPAY flag set
- const bool fHashSingle; //! whether the hashtype is SIGHASH_SINGLE
- const bool fHashNone; //! whether the hashtype is SIGHASH_NONE
+ const CTransaction& txTo; //!< reference to the spending transaction (the one being serialized)
+ const CScript& scriptCode; //!< output script being consumed
+ const unsigned int nIn; //!< input index of txTo being signed
+ const bool fAnyoneCanPay; //!< whether the hashtype has the SIGHASH_ANYONECANPAY flag set
+ const bool fHashSingle; //!< whether the hashtype is SIGHASH_SINGLE
+ const bool fHashNone; //!< whether the hashtype is SIGHASH_NONE
public:
CTransactionSignatureSerializer(const CTransaction &txToIn, const CScript &scriptCodeIn, unsigned int nInIn, int nHashTypeIn) :
@@ -1064,10 +1142,86 @@ public:
}
};
+uint256 GetPrevoutHash(const CTransaction& txTo) {
+ CHashWriter ss(SER_GETHASH, 0);
+ for (unsigned int n = 0; n < txTo.vin.size(); n++) {
+ ss << txTo.vin[n].prevout;
+ }
+ return ss.GetHash();
+}
+
+uint256 GetSequenceHash(const CTransaction& txTo) {
+ CHashWriter ss(SER_GETHASH, 0);
+ for (unsigned int n = 0; n < txTo.vin.size(); n++) {
+ ss << txTo.vin[n].nSequence;
+ }
+ return ss.GetHash();
+}
+
+uint256 GetOutputsHash(const CTransaction& txTo) {
+ CHashWriter ss(SER_GETHASH, 0);
+ for (unsigned int n = 0; n < txTo.vout.size(); n++) {
+ ss << txTo.vout[n];
+ }
+ return ss.GetHash();
+}
+
} // anon namespace
-uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType)
+PrecomputedTransactionData::PrecomputedTransactionData(const CTransaction& txTo)
{
+ hashPrevouts = GetPrevoutHash(txTo);
+ hashSequence = GetSequenceHash(txTo);
+ hashOutputs = GetOutputsHash(txTo);
+}
+
+uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache)
+{
+ if (sigversion == SIGVERSION_WITNESS_V0) {
+ uint256 hashPrevouts;
+ uint256 hashSequence;
+ uint256 hashOutputs;
+
+ if (!(nHashType & SIGHASH_ANYONECANPAY)) {
+ hashPrevouts = cache ? cache->hashPrevouts : GetPrevoutHash(txTo);
+ }
+
+ if (!(nHashType & SIGHASH_ANYONECANPAY) && (nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) {
+ hashSequence = cache ? cache->hashSequence : GetSequenceHash(txTo);
+ }
+
+
+ if ((nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) {
+ hashOutputs = cache ? cache->hashOutputs : GetOutputsHash(txTo);
+ } else if ((nHashType & 0x1f) == SIGHASH_SINGLE && nIn < txTo.vout.size()) {
+ CHashWriter ss(SER_GETHASH, 0);
+ ss << txTo.vout[nIn];
+ hashOutputs = ss.GetHash();
+ }
+
+ CHashWriter ss(SER_GETHASH, 0);
+ // Version
+ ss << txTo.nVersion;
+ // Input prevouts/nSequence (none/all, depending on flags)
+ ss << hashPrevouts;
+ ss << hashSequence;
+ // The input being signed (replacing the scriptSig with scriptCode + amount)
+ // The prevout may already be contained in hashPrevout, and the nSequence
+ // may already be contain in hashSequence.
+ ss << txTo.vin[nIn].prevout;
+ ss << static_cast<const CScriptBase&>(scriptCode);
+ ss << amount;
+ ss << txTo.vin[nIn].nSequence;
+ // Outputs (none/one/all, depending on flags)
+ ss << hashOutputs;
+ // Locktime
+ ss << txTo.nLockTime;
+ // Sighash type
+ ss << nHashType;
+
+ return ss.GetHash();
+ }
+
static const uint256 one(uint256S("0000000000000000000000000000000000000000000000000000000000000001"));
if (nIn >= txTo.vin.size()) {
// nIn out of range
@@ -1096,7 +1250,7 @@ bool TransactionSignatureChecker::VerifySignature(const std::vector<unsigned cha
return pubkey.Verify(sighash, vchSig);
}
-bool TransactionSignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn, const vector<unsigned char>& vchPubKey, const CScript& scriptCode) const
+bool TransactionSignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn, const vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const
{
CPubKey pubkey(vchPubKey);
if (!pubkey.IsValid())
@@ -1109,7 +1263,7 @@ bool TransactionSignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn
int nHashType = vchSig.back();
vchSig.pop_back();
- uint256 sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType);
+ uint256 sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->txdata);
if (!VerifySignature(vchSig, pubkey, sighash))
return false;
@@ -1147,15 +1301,119 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con
// 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())
+ if (CTxIn::SEQUENCE_FINAL == txTo->vin[nIn].nSequence)
+ return false;
+
+ return true;
+}
+
+bool TransactionSignatureChecker::CheckSequence(const CScriptNum& nSequence) const
+{
+ // Relative lock times are supported by comparing the passed
+ // in operand to the sequence number of the input.
+ const int64_t txToSequence = (int64_t)txTo->vin[nIn].nSequence;
+
+ // Fail if the transaction's version number is not set high
+ // enough to trigger BIP 68 rules.
+ if (static_cast<uint32_t>(txTo->nVersion) < 2)
+ return false;
+
+ // Sequence numbers with their most significant bit set are not
+ // consensus constrained. Testing that the transaction's sequence
+ // number do not have this bit set prevents using this property
+ // to get around a CHECKSEQUENCEVERIFY check.
+ if (txToSequence & CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG)
+ return false;
+
+ // Mask off any bits that do not have consensus-enforced meaning
+ // before doing the integer comparisons
+ const uint32_t nLockTimeMask = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | CTxIn::SEQUENCE_LOCKTIME_MASK;
+ const int64_t txToSequenceMasked = txToSequence & nLockTimeMask;
+ const CScriptNum nSequenceMasked = nSequence & nLockTimeMask;
+
+ // There are two kinds of nSequence: lock-by-blockheight
+ // and lock-by-blocktime, distinguished by whether
+ // nSequenceMasked < CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG.
+ //
+ // We want to compare apples to apples, so fail the script
+ // unless the type of nSequenceMasked being tested is the same as
+ // the nSequenceMasked in the transaction.
+ if (!(
+ (txToSequenceMasked < CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG && nSequenceMasked < CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG) ||
+ (txToSequenceMasked >= CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG && nSequenceMasked >= CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG)
+ )) {
+ return false;
+ }
+
+ // Now that we know we're comparing apples-to-apples, the
+ // comparison is a simple numeric one.
+ if (nSequenceMasked > txToSequenceMasked)
return false;
return true;
}
+static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion, const std::vector<unsigned char>& program, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
+{
+ vector<vector<unsigned char> > stack;
+ CScript scriptPubKey;
+
+ if (witversion == 0) {
+ if (program.size() == 32) {
+ // Version 0 segregated witness program: SHA256(CScript) inside the program, CScript + inputs in witness
+ if (witness.stack.size() == 0) {
+ return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY);
+ }
+ scriptPubKey = CScript(witness.stack.back().begin(), witness.stack.back().end());
+ stack = std::vector<std::vector<unsigned char> >(witness.stack.begin(), witness.stack.end() - 1);
+ uint256 hashScriptPubKey;
+ CSHA256().Write(&scriptPubKey[0], scriptPubKey.size()).Finalize(hashScriptPubKey.begin());
+ if (memcmp(hashScriptPubKey.begin(), &program[0], 32)) {
+ return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH);
+ }
+ } else if (program.size() == 20) {
+ // Special case for pay-to-pubkeyhash; signature + pubkey in witness
+ if (witness.stack.size() != 2) {
+ return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH); // 2 items in witness
+ }
+ scriptPubKey << OP_DUP << OP_HASH160 << program << OP_EQUALVERIFY << OP_CHECKSIG;
+ stack = witness.stack;
+ } else {
+ return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH);
+ }
+ } else if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM) {
+ return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM);
+ } else {
+ // Higher version witness scripts return true for future softfork compatibility
+ return set_success(serror);
+ }
+
+ // Disallow stack item size > MAX_SCRIPT_ELEMENT_SIZE in witness stack
+ for (unsigned int i = 0; i < stack.size(); i++) {
+ if (stack.at(i).size() > MAX_SCRIPT_ELEMENT_SIZE)
+ return set_error(serror, SCRIPT_ERR_PUSH_SIZE);
+ }
-bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
+ if (!EvalScript(stack, scriptPubKey, flags, checker, SIGVERSION_WITNESS_V0, serror)) {
+ return false;
+ }
+
+ // Scripts inside witness implicitly require cleanstack behaviour
+ if (stack.size() != 1)
+ return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
+ if (!CastToBool(stack.back()))
+ return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
+ return true;
+}
+
+bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
{
+ static const CScriptWitness emptyWitness;
+ if (witness == NULL) {
+ witness = &emptyWitness;
+ }
+ bool hadWitness = false;
+
set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
if ((flags & SCRIPT_VERIFY_SIGPUSHONLY) != 0 && !scriptSig.IsPushOnly()) {
@@ -1163,12 +1421,12 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne
}
vector<vector<unsigned char> > stack, stackCopy;
- if (!EvalScript(stack, scriptSig, flags, checker, serror))
+ if (!EvalScript(stack, scriptSig, flags, checker, SIGVERSION_BASE, serror))
// serror is set
return false;
if (flags & SCRIPT_VERIFY_P2SH)
stackCopy = stack;
- if (!EvalScript(stack, scriptPubKey, flags, checker, serror))
+ if (!EvalScript(stack, scriptPubKey, flags, checker, SIGVERSION_BASE, serror))
// serror is set
return false;
if (stack.empty())
@@ -1176,6 +1434,25 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne
if (CastToBool(stack.back()) == false)
return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
+ // Bare witness programs
+ int witnessversion;
+ std::vector<unsigned char> witnessprogram;
+ if (flags & SCRIPT_VERIFY_WITNESS) {
+ if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) {
+ hadWitness = true;
+ if (scriptSig.size() != 0) {
+ // The scriptSig must be _exactly_ CScript(), otherwise we reintroduce malleability.
+ return set_error(serror, SCRIPT_ERR_WITNESS_MALLEATED);
+ }
+ if (!VerifyWitnessProgram(*witness, witnessversion, witnessprogram, flags, checker, serror)) {
+ return false;
+ }
+ // Bypass the cleanstack check at the end. The actual stack is obviously not clean
+ // for witness programs.
+ stack.resize(1);
+ }
+ }
+
// Additional validation for spend-to-script-hash transactions:
if ((flags & SCRIPT_VERIFY_P2SH) && scriptPubKey.IsPayToScriptHash())
{
@@ -1195,26 +1472,102 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne
CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end());
popstack(stack);
- if (!EvalScript(stack, pubKey2, flags, checker, serror))
+ if (!EvalScript(stack, pubKey2, flags, checker, SIGVERSION_BASE, serror))
// serror is set
return false;
if (stack.empty())
return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
if (!CastToBool(stack.back()))
return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
+
+ // P2SH witness program
+ if (flags & SCRIPT_VERIFY_WITNESS) {
+ if (pubKey2.IsWitnessProgram(witnessversion, witnessprogram)) {
+ hadWitness = true;
+ if (scriptSig != CScript() << std::vector<unsigned char>(pubKey2.begin(), pubKey2.end())) {
+ // The scriptSig must be _exactly_ a single push of the redeemScript. Otherwise we
+ // reintroduce malleability.
+ return set_error(serror, SCRIPT_ERR_WITNESS_MALLEATED_P2SH);
+ }
+ if (!VerifyWitnessProgram(*witness, witnessversion, witnessprogram, flags, checker, serror)) {
+ return false;
+ }
+ // Bypass the cleanstack check at the end. The actual stack is obviously not clean
+ // for witness programs.
+ stack.resize(1);
+ }
+ }
}
// The CLEANSTACK check is only performed after potential P2SH evaluation,
// as the non-P2SH evaluation of a P2SH script will obviously not result in
- // a clean stack (the P2SH inputs remain).
+ // a clean stack (the P2SH inputs remain). The same holds for witness evaluation.
if ((flags & SCRIPT_VERIFY_CLEANSTACK) != 0) {
// Disallow CLEANSTACK without P2SH, as otherwise a switch CLEANSTACK->P2SH+CLEANSTACK
// would be possible, which is not a softfork (and P2SH should be one).
assert((flags & SCRIPT_VERIFY_P2SH) != 0);
+ assert((flags & SCRIPT_VERIFY_WITNESS) != 0);
if (stack.size() != 1) {
return set_error(serror, SCRIPT_ERR_CLEANSTACK);
}
}
+ if (flags & SCRIPT_VERIFY_WITNESS) {
+ // We can't check for correct unexpected witness data if P2SH was off, so require
+ // that WITNESS implies P2SH. Otherwise, going from WITNESS->P2SH+WITNESS would be
+ // possible, which is not a softfork.
+ assert((flags & SCRIPT_VERIFY_P2SH) != 0);
+ if (!hadWitness && !witness->IsNull()) {
+ return set_error(serror, SCRIPT_ERR_WITNESS_UNEXPECTED);
+ }
+ }
+
return set_success(serror);
}
+
+size_t static WitnessSigOps(int witversion, const std::vector<unsigned char>& witprogram, const CScriptWitness& witness, int flags)
+{
+ if (witversion == 0) {
+ if (witprogram.size() == 20)
+ return 1;
+
+ if (witprogram.size() == 32 && witness.stack.size() > 0) {
+ CScript subscript(witness.stack.back().begin(), witness.stack.back().end());
+ return subscript.GetSigOpCount(true);
+ }
+ }
+
+ // Future flags may be implemented here.
+ return 0;
+}
+
+size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags)
+{
+ static const CScriptWitness witnessEmpty;
+
+ if ((flags & SCRIPT_VERIFY_WITNESS) == 0) {
+ return 0;
+ }
+ assert((flags & SCRIPT_VERIFY_P2SH) != 0);
+
+ int witnessversion;
+ std::vector<unsigned char> witnessprogram;
+ if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) {
+ return WitnessSigOps(witnessversion, witnessprogram, witness ? *witness : witnessEmpty, flags);
+ }
+
+ if (scriptPubKey.IsPayToScriptHash() && scriptSig.IsPushOnly()) {
+ CScript::const_iterator pc = scriptSig.begin();
+ vector<unsigned char> data;
+ while (pc < scriptSig.end()) {
+ opcodetype opcode;
+ scriptSig.GetOp(pc, opcode, data);
+ }
+ CScript subscript(data.begin(), data.end());
+ if (subscript.IsWitnessProgram(witnessversion, witnessprogram)) {
+ return WitnessSigOps(witnessversion, witnessprogram, witness ? *witness : witnessEmpty, flags);
+ }
+ }
+
+ return 0;
+}
diff --git a/src/script/interpreter.h b/src/script/interpreter.h
index 213e8c7651..79894c5300 100644
--- a/src/script/interpreter.h
+++ b/src/script/interpreter.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Copyright (c) 2009-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -74,23 +74,61 @@ enum
// "At least one stack element must remain, and when interpreted as a boolean, it must be true" to
// "Exactly one stack element must remain, and when interpreted as a boolean, it must be true".
// (softfork safe, BIP62 rule 6)
- // Note: CLEANSTACK should never be used without P2SH.
+ // Note: CLEANSTACK should never be used without P2SH or WITNESS.
SCRIPT_VERIFY_CLEANSTACK = (1U << 8),
// Verify CHECKLOCKTIMEVERIFY
//
// See BIP65 for details.
SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9),
+
+ // support CHECKSEQUENCEVERIFY opcode
+ //
+ // See BIP112 for details
+ SCRIPT_VERIFY_CHECKSEQUENCEVERIFY = (1U << 10),
+
+ // Support segregated witness
+ //
+ SCRIPT_VERIFY_WITNESS = (1U << 11),
+
+ // Making v1-v16 witness program non-standard
+ //
+ SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM = (1U << 12),
+
+ // Segwit script only: Require the argument of OP_IF/NOTIF to be exactly 0x01 or empty vector
+ //
+ SCRIPT_VERIFY_MINIMALIF = (1U << 13),
+
+ // Signature(s) must be empty vector if an CHECK(MULTI)SIG operation failed
+ //
+ SCRIPT_VERIFY_NULLFAIL = (1U << 14),
+
+ // Public keys in segregated witness scripts must be compressed
+ //
+ SCRIPT_VERIFY_WITNESS_PUBKEYTYPE = (1U << 15),
};
bool CheckSignatureEncoding(const std::vector<unsigned char> &vchSig, unsigned int flags, ScriptError* serror);
-uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType);
+struct PrecomputedTransactionData
+{
+ uint256 hashPrevouts, hashSequence, hashOutputs;
+
+ PrecomputedTransactionData(const CTransaction& tx);
+};
+
+enum SigVersion
+{
+ SIGVERSION_BASE = 0,
+ SIGVERSION_WITNESS_V0 = 1,
+};
+
+uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache = NULL);
class BaseSignatureChecker
{
public:
- virtual bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode) const
+ virtual bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const
{
return false;
}
@@ -100,6 +138,11 @@ public:
return false;
}
+ virtual bool CheckSequence(const CScriptNum& nSequence) const
+ {
+ return false;
+ }
+
virtual ~BaseSignatureChecker() {}
};
@@ -108,14 +151,18 @@ class TransactionSignatureChecker : public BaseSignatureChecker
private:
const CTransaction* txTo;
unsigned int nIn;
+ const CAmount amount;
+ const PrecomputedTransactionData* txdata;
protected:
virtual bool VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const;
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;
+ TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), txdata(NULL) {}
+ TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, const PrecomputedTransactionData& txdataIn) : txTo(txToIn), nIn(nInIn), amount(amountIn), txdata(&txdataIn) {}
+ bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const;
bool CheckLockTime(const CScriptNum& nLockTime) const;
+ bool CheckSequence(const CScriptNum& nSequence) const;
};
class MutableTransactionSignatureChecker : public TransactionSignatureChecker
@@ -124,10 +171,12 @@ private:
const CTransaction txTo;
public:
- MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn) : TransactionSignatureChecker(&txTo, nInIn), txTo(*txToIn) {}
+ MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount) : TransactionSignatureChecker(&txTo, nInIn, amount), txTo(*txToIn) {}
};
-bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL);
-bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL);
+bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* error = NULL);
+bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror = NULL);
+
+size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags);
#endif // BITCOIN_SCRIPT_INTERPRETER_H
diff --git a/src/script/ismine.cpp b/src/script/ismine.cpp
new file mode 100644
index 0000000000..7467d23b2d
--- /dev/null
+++ b/src/script/ismine.cpp
@@ -0,0 +1,156 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// 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 "ismine.h"
+
+#include "key.h"
+#include "keystore.h"
+#include "script/script.h"
+#include "script/standard.h"
+#include "script/sign.h"
+
+#include <boost/foreach.hpp>
+
+using namespace std;
+
+typedef vector<unsigned char> valtype;
+
+unsigned int HaveKeys(const vector<valtype>& pubkeys, const CKeyStore& keystore)
+{
+ unsigned int nResult = 0;
+ BOOST_FOREACH(const valtype& pubkey, pubkeys)
+ {
+ CKeyID keyID = CPubKey(pubkey).GetID();
+ if (keystore.HaveKey(keyID))
+ ++nResult;
+ }
+ return nResult;
+}
+
+isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey, SigVersion sigversion)
+{
+ bool isInvalid = false;
+ return IsMine(keystore, scriptPubKey, isInvalid, sigversion);
+}
+
+isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest, SigVersion sigversion)
+{
+ bool isInvalid = false;
+ return IsMine(keystore, dest, isInvalid, sigversion);
+}
+
+isminetype IsMine(const CKeyStore &keystore, const CTxDestination& dest, bool& isInvalid, SigVersion sigversion)
+{
+ CScript script = GetScriptForDestination(dest);
+ return IsMine(keystore, script, isInvalid, sigversion);
+}
+
+isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey, bool& isInvalid, SigVersion sigversion)
+{
+ vector<valtype> vSolutions;
+ txnouttype whichType;
+ if (!Solver(scriptPubKey, whichType, vSolutions)) {
+ if (keystore.HaveWatchOnly(scriptPubKey))
+ return ISMINE_WATCH_UNSOLVABLE;
+ return ISMINE_NO;
+ }
+
+ CKeyID keyID;
+ switch (whichType)
+ {
+ case TX_NONSTANDARD:
+ case TX_NULL_DATA:
+ break;
+ case TX_PUBKEY:
+ keyID = CPubKey(vSolutions[0]).GetID();
+ if (sigversion != SIGVERSION_BASE && vSolutions[0].size() != 33) {
+ isInvalid = true;
+ return ISMINE_NO;
+ }
+ if (keystore.HaveKey(keyID))
+ return ISMINE_SPENDABLE;
+ break;
+ case TX_WITNESS_V0_KEYHASH:
+ {
+ if (!keystore.HaveCScript(CScriptID(CScript() << OP_0 << vSolutions[0]))) {
+ // We do not support bare witness outputs unless the P2SH version of it would be
+ // acceptable as well. This protects against matching before segwit activates.
+ // This also applies to the P2WSH case.
+ break;
+ }
+ isminetype ret = ::IsMine(keystore, GetScriptForDestination(CKeyID(uint160(vSolutions[0]))), isInvalid, SIGVERSION_WITNESS_V0);
+ if (ret == ISMINE_SPENDABLE || ret == ISMINE_WATCH_SOLVABLE || (ret == ISMINE_NO && isInvalid))
+ return ret;
+ break;
+ }
+ case TX_PUBKEYHASH:
+ keyID = CKeyID(uint160(vSolutions[0]));
+ if (sigversion != SIGVERSION_BASE) {
+ CPubKey pubkey;
+ if (keystore.GetPubKey(keyID, pubkey) && !pubkey.IsCompressed()) {
+ isInvalid = true;
+ return ISMINE_NO;
+ }
+ }
+ if (keystore.HaveKey(keyID))
+ return ISMINE_SPENDABLE;
+ break;
+ case TX_SCRIPTHASH:
+ {
+ CScriptID scriptID = CScriptID(uint160(vSolutions[0]));
+ CScript subscript;
+ if (keystore.GetCScript(scriptID, subscript)) {
+ isminetype ret = IsMine(keystore, subscript, isInvalid);
+ if (ret == ISMINE_SPENDABLE || ret == ISMINE_WATCH_SOLVABLE || (ret == ISMINE_NO && isInvalid))
+ return ret;
+ }
+ break;
+ }
+ case TX_WITNESS_V0_SCRIPTHASH:
+ {
+ if (!keystore.HaveCScript(CScriptID(CScript() << OP_0 << vSolutions[0]))) {
+ break;
+ }
+ uint160 hash;
+ CRIPEMD160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(hash.begin());
+ CScriptID scriptID = CScriptID(hash);
+ CScript subscript;
+ if (keystore.GetCScript(scriptID, subscript)) {
+ isminetype ret = IsMine(keystore, subscript, isInvalid, SIGVERSION_WITNESS_V0);
+ if (ret == ISMINE_SPENDABLE || ret == ISMINE_WATCH_SOLVABLE || (ret == ISMINE_NO && isInvalid))
+ return ret;
+ }
+ break;
+ }
+
+ case TX_MULTISIG:
+ {
+ // Only consider transactions "mine" if we own ALL the
+ // keys involved. Multi-signature transactions that are
+ // partially owned (somebody else has a key that can spend
+ // them) enable spend-out-from-under-you attacks, especially
+ // in shared-wallet situations.
+ vector<valtype> keys(vSolutions.begin()+1, vSolutions.begin()+vSolutions.size()-1);
+ if (sigversion != SIGVERSION_BASE) {
+ for (size_t i = 0; i < keys.size(); i++) {
+ if (keys[i].size() != 33) {
+ isInvalid = true;
+ return ISMINE_NO;
+ }
+ }
+ }
+ if (HaveKeys(keys, keystore) == keys.size())
+ return ISMINE_SPENDABLE;
+ break;
+ }
+ }
+
+ if (keystore.HaveWatchOnly(scriptPubKey)) {
+ // TODO: This could be optimized some by doing some work after the above solver
+ SignatureData sigs;
+ return ProduceSignature(DummySignatureCreator(&keystore), scriptPubKey, sigs) ? ISMINE_WATCH_SOLVABLE : ISMINE_WATCH_UNSOLVABLE;
+ }
+ return ISMINE_NO;
+}
diff --git a/src/script/ismine.h b/src/script/ismine.h
new file mode 100644
index 0000000000..ec7a620e33
--- /dev/null
+++ b/src/script/ismine.h
@@ -0,0 +1,41 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// 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.
+
+#ifndef BITCOIN_SCRIPT_ISMINE_H
+#define BITCOIN_SCRIPT_ISMINE_H
+
+#include "script/standard.h"
+
+#include <stdint.h>
+
+class CKeyStore;
+class CScript;
+
+/** IsMine() return codes */
+enum isminetype
+{
+ ISMINE_NO = 0,
+ //! Indicates that we don't know how to create a scriptSig that would solve this if we were given the appropriate private keys
+ ISMINE_WATCH_UNSOLVABLE = 1,
+ //! Indicates that we know how to create a scriptSig that would solve this if we were given the appropriate private keys
+ ISMINE_WATCH_SOLVABLE = 2,
+ ISMINE_WATCH_ONLY = ISMINE_WATCH_SOLVABLE | ISMINE_WATCH_UNSOLVABLE,
+ ISMINE_SPENDABLE = 4,
+ ISMINE_ALL = ISMINE_WATCH_ONLY | ISMINE_SPENDABLE
+};
+/** used for bitflags of isminetype */
+typedef uint8_t isminefilter;
+
+/* isInvalid becomes true when the script is found invalid by consensus or policy. This will terminate the recursion
+ * and return a ISMINE_NO immediately, as an invalid script should never be considered as "mine". This is needed as
+ * different SIGVERSION may have different network rules. Currently the only use of isInvalid is indicate uncompressed
+ * keys in SIGVERSION_WITNESS_V0 script, but could also be used in similar cases in the future
+ */
+isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey, bool& isInvalid, SigVersion = SIGVERSION_BASE);
+isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey, SigVersion = SIGVERSION_BASE);
+isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest, bool& isInvalid, SigVersion = SIGVERSION_BASE);
+isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest, SigVersion = SIGVERSION_BASE);
+
+#endif // BITCOIN_SCRIPT_ISMINE_H
diff --git a/src/script/script.cpp b/src/script/script.cpp
index 9c77ed9fc1..ddf6775569 100644
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -131,8 +131,8 @@ const char* GetOpName(opcodetype opcode)
// expanson
case OP_NOP1 : return "OP_NOP1";
- case OP_NOP2 : return "OP_NOP2";
- case OP_NOP3 : return "OP_NOP3";
+ case OP_CHECKLOCKTIMEVERIFY : return "OP_CHECKLOCKTIMEVERIFY";
+ case OP_CHECKSEQUENCEVERIFY : return "OP_CHECKSEQUENCEVERIFY";
case OP_NOP4 : return "OP_NOP4";
case OP_NOP5 : return "OP_NOP5";
case OP_NOP6 : return "OP_NOP6";
@@ -210,6 +210,32 @@ bool CScript::IsPayToScriptHash() const
(*this)[22] == OP_EQUAL);
}
+bool CScript::IsPayToWitnessScriptHash() const
+{
+ // Extra-fast test for pay-to-witness-script-hash CScripts:
+ return (this->size() == 34 &&
+ (*this)[0] == OP_0 &&
+ (*this)[1] == 0x20);
+}
+
+// A witness program is any valid CScript that consists of a 1-byte push opcode
+// followed by a data push between 2 and 40 bytes.
+bool CScript::IsWitnessProgram(int& version, std::vector<unsigned char>& program) const
+{
+ if (this->size() < 4 || this->size() > 42) {
+ return false;
+ }
+ if ((*this)[0] != OP_0 && ((*this)[0] < OP_1 || (*this)[0] > OP_16)) {
+ return false;
+ }
+ if ((size_t)((*this)[1] + 2) == this->size()) {
+ version = DecodeOP_N((opcodetype)(*this)[0]);
+ program = std::vector<unsigned char>(this->begin() + 2, this->end());
+ return true;
+ }
+ return false;
+}
+
bool CScript::IsPushOnly(const_iterator pc) const
{
while (pc < end())
@@ -231,3 +257,15 @@ bool CScript::IsPushOnly() const
{
return this->IsPushOnly(begin());
}
+
+std::string CScriptWitness::ToString() const
+{
+ std::string ret = "CScriptWitness(";
+ for (unsigned int i = 0; i < stack.size(); i++) {
+ if (i) {
+ ret += ", ";
+ }
+ ret += HexStr(stack[i]);
+ }
+ return ret + ")";
+}
diff --git a/src/script/script.h b/src/script/script.h
index 3650957fc9..278774d32e 100644
--- a/src/script/script.h
+++ b/src/script/script.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -27,6 +27,9 @@ static const int MAX_OPS_PER_SCRIPT = 201;
// Maximum number of public keys per multisig
static const int MAX_PUBKEYS_PER_MULTISIG = 20;
+// Maximum script length in bytes
+static const int MAX_SCRIPT_SIZE = 10000;
+
// 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
@@ -162,9 +165,10 @@ enum opcodetype
// expansion
OP_NOP1 = 0xb0,
- OP_NOP2 = 0xb1,
- OP_CHECKLOCKTIMEVERIFY = OP_NOP2,
- OP_NOP3 = 0xb2,
+ OP_CHECKLOCKTIMEVERIFY = 0xb1,
+ OP_NOP2 = OP_CHECKLOCKTIMEVERIFY,
+ OP_CHECKSEQUENCEVERIFY = 0xb2,
+ OP_NOP3 = OP_CHECKSEQUENCEVERIFY,
OP_NOP4 = 0xb3,
OP_NOP5 = 0xb4,
OP_NOP6 = 0xb5,
@@ -259,6 +263,11 @@ public:
inline CScriptNum& operator+=( const CScriptNum& rhs) { return operator+=(rhs.m_value); }
inline CScriptNum& operator-=( const CScriptNum& rhs) { return operator-=(rhs.m_value); }
+ inline CScriptNum operator&( const int64_t& rhs) const { return CScriptNum(m_value & rhs);}
+ inline CScriptNum operator&( const CScriptNum& rhs) const { return operator&(rhs.m_value); }
+
+ inline CScriptNum& operator&=( const CScriptNum& rhs) { return operator&=(rhs.m_value); }
+
inline CScriptNum operator-() const
{
assert(m_value != std::numeric_limits<int64_t>::min());
@@ -287,6 +296,12 @@ public:
return *this;
}
+ inline CScriptNum& operator&=( const int64_t& rhs)
+ {
+ m_value &= rhs;
+ return *this;
+ }
+
int getint() const
{
if (m_value > std::numeric_limits<int>::max())
@@ -558,17 +573,26 @@ public:
int nFound = 0;
if (b.empty())
return nFound;
- iterator pc = begin();
+ CScript result;
+ iterator pc = begin(), pc2 = begin();
opcodetype opcode;
do
{
- while (end() - pc >= (long)b.size() && memcmp(&pc[0], &b[0], b.size()) == 0)
+ result.insert(result.end(), pc2, pc);
+ while (static_cast<size_t>(end() - pc) >= b.size() && std::equal(b.begin(), b.end(), pc))
{
- pc = erase(pc, pc + b.size());
+ pc = pc + b.size();
++nFound;
}
+ pc2 = pc;
}
while (GetOp(pc, opcode));
+
+ if (nFound > 0) {
+ result.insert(result.end(), pc2, end());
+ *this = result;
+ }
+
return nFound;
}
int Find(opcodetype op) const
@@ -597,6 +621,8 @@ public:
unsigned int GetSigOpCount(const CScript& scriptSig) const;
bool IsPayToScriptHash() const;
+ bool IsPayToWitnessScriptHash() const;
+ bool IsWitnessProgram(int& version, std::vector<unsigned char>& program) const;
/** Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical). */
bool IsPushOnly(const_iterator pc) const;
@@ -609,7 +635,7 @@ public:
*/
bool IsUnspendable() const
{
- return (size() > 0 && *begin() == OP_RETURN);
+ return (size() > 0 && *begin() == OP_RETURN) || (size() > MAX_SCRIPT_SIZE);
}
void clear()
@@ -619,6 +645,20 @@ public:
}
};
+struct CScriptWitness
+{
+ // Note that this encodes the data elements being pushed, rather than
+ // encoding them as a CScript that pushes them.
+ std::vector<std::vector<unsigned char> > stack;
+
+ // Some compilers complain without a default constructor
+ CScriptWitness() { }
+
+ bool IsNull() const { return stack.empty(); }
+
+ std::string ToString() const;
+};
+
class CReserveScript
{
public:
diff --git a/src/script/script_error.cpp b/src/script/script_error.cpp
index f1aa1fb408..2c5359fe8a 100644
--- a/src/script/script_error.cpp
+++ b/src/script/script_error.cpp
@@ -63,10 +63,30 @@ const char* ScriptErrorString(const ScriptError serror)
return "Non-canonical signature: S value is unnecessarily high";
case SCRIPT_ERR_SIG_NULLDUMMY:
return "Dummy CHECKMULTISIG argument must be zero";
+ case SCRIPT_ERR_MINIMALIF:
+ return "OP_IF/NOTIF argument must be minimal";
+ case SCRIPT_ERR_SIG_NULLFAIL:
+ return "Signature must be zero for failed CHECK(MULTI)SIG operation";
case SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS:
return "NOPx reserved for soft-fork upgrades";
+ case SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM:
+ return "Witness version reserved for soft-fork upgrades";
case SCRIPT_ERR_PUBKEYTYPE:
return "Public key is neither compressed or uncompressed";
+ case SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH:
+ return "Witness program has incorrect length";
+ case SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY:
+ return "Witness program was passed an empty witness";
+ case SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH:
+ return "Witness program hash mismatch";
+ case SCRIPT_ERR_WITNESS_MALLEATED:
+ return "Witness requires empty scriptSig";
+ case SCRIPT_ERR_WITNESS_MALLEATED_P2SH:
+ return "Witness requires only-redeemscript scriptSig";
+ case SCRIPT_ERR_WITNESS_UNEXPECTED:
+ return "Witness provided for non-witness script";
+ case SCRIPT_ERR_WITNESS_PUBKEYTYPE:
+ return "Using non-compressed keys in segwit";
case SCRIPT_ERR_UNKNOWN_ERROR:
case SCRIPT_ERR_ERROR_COUNT:
default: break;
diff --git a/src/script/script_error.h b/src/script/script_error.h
index bb10b8a293..430836991b 100644
--- a/src/script/script_error.h
+++ b/src/script/script_error.h
@@ -35,11 +35,11 @@ typedef enum ScriptError_t
SCRIPT_ERR_INVALID_ALTSTACK_OPERATION,
SCRIPT_ERR_UNBALANCED_CONDITIONAL,
- /* OP_CHECKLOCKTIMEVERIFY */
+ /* CHECKLOCKTIMEVERIFY and CHECKSEQUENCEVERIFY */
SCRIPT_ERR_NEGATIVE_LOCKTIME,
SCRIPT_ERR_UNSATISFIED_LOCKTIME,
- /* BIP62 */
+ /* Malleability */
SCRIPT_ERR_SIG_HASHTYPE,
SCRIPT_ERR_SIG_DER,
SCRIPT_ERR_MINIMALDATA,
@@ -48,9 +48,21 @@ typedef enum ScriptError_t
SCRIPT_ERR_SIG_NULLDUMMY,
SCRIPT_ERR_PUBKEYTYPE,
SCRIPT_ERR_CLEANSTACK,
+ SCRIPT_ERR_MINIMALIF,
+ SCRIPT_ERR_SIG_NULLFAIL,
/* softfork safeness */
SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS,
+ SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,
+
+ /* segregated witness */
+ SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH,
+ SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY,
+ SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH,
+ SCRIPT_ERR_WITNESS_MALLEATED,
+ SCRIPT_ERR_WITNESS_MALLEATED_P2SH,
+ SCRIPT_ERR_WITNESS_UNEXPECTED,
+ SCRIPT_ERR_WITNESS_PUBKEYTYPE,
SCRIPT_ERR_ERROR_COUNT
} ScriptError;
diff --git a/src/script/sigcache.cpp b/src/script/sigcache.cpp
index eee96e7c2d..bdc0bfdc1c 100644
--- a/src/script/sigcache.cpp
+++ b/src/script/sigcache.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
diff --git a/src/script/sigcache.h b/src/script/sigcache.h
index 2269972560..44551ec2bc 100644
--- a/src/script/sigcache.h
+++ b/src/script/sigcache.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -22,7 +22,7 @@ private:
bool store;
public:
- CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, bool storeIn=true) : TransactionSignatureChecker(txToIn, nInIn), store(storeIn) {}
+ CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amount, bool storeIn, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amount, txdataIn), store(storeIn) {}
bool VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const;
};
diff --git a/src/script/sign.cpp b/src/script/sign.cpp
index 90f557fc60..f552ad5bba 100644
--- a/src/script/sign.cpp
+++ b/src/script/sign.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Copyright (c) 2009-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -18,31 +18,35 @@ using namespace std;
typedef std::vector<unsigned char> valtype;
-TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), checker(txTo, nIn) {}
+TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {}
-bool TransactionSignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& address, const CScript& scriptCode) const
+bool TransactionSignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& address, const CScript& scriptCode, SigVersion sigversion) const
{
CKey key;
if (!keystore->GetKey(address, key))
return false;
- uint256 hash = SignatureHash(scriptCode, *txTo, nIn, nHashType);
+ // Signing with uncompressed keys is disabled in witness scripts
+ if (sigversion == SIGVERSION_WITNESS_V0 && !key.IsCompressed())
+ return false;
+
+ uint256 hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion);
if (!key.Sign(hash, vchSig))
return false;
vchSig.push_back((unsigned char)nHashType);
return true;
}
-static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, CScript& scriptSigRet)
+static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
{
vector<unsigned char> vchSig;
- if (!creator.CreateSig(vchSig, address, scriptCode))
+ if (!creator.CreateSig(vchSig, address, scriptCode, sigversion))
return false;
- scriptSigRet << vchSig;
+ ret.push_back(vchSig);
return true;
}
-static bool SignN(const vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, CScript& scriptSigRet)
+static bool SignN(const vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
{
int nSigned = 0;
int nRequired = multisigdata.front()[0];
@@ -50,7 +54,7 @@ static bool SignN(const vector<valtype>& multisigdata, const BaseSignatureCreato
{
const valtype& pubkey = multisigdata[i];
CKeyID keyID = CPubKey(pubkey).GetID();
- if (Sign1(keyID, creator, scriptCode, scriptSigRet))
+ if (Sign1(keyID, creator, scriptCode, ret, sigversion))
++nSigned;
}
return nSigned==nRequired;
@@ -63,9 +67,11 @@ static bool SignN(const vector<valtype>& multisigdata, const BaseSignatureCreato
* Returns false if scriptPubKey could not be completely satisfied.
*/
static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptPubKey,
- CScript& scriptSigRet, txnouttype& whichTypeRet)
+ std::vector<valtype>& ret, txnouttype& whichTypeRet, SigVersion sigversion)
{
- scriptSigRet.clear();
+ CScript scriptRet;
+ uint160 h160;
+ ret.clear();
vector<valtype> vSolutions;
if (!Solver(scriptPubKey, whichTypeRet, vSolutions))
@@ -79,62 +85,142 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP
return false;
case TX_PUBKEY:
keyID = CPubKey(vSolutions[0]).GetID();
- return Sign1(keyID, creator, scriptPubKey, scriptSigRet);
+ return Sign1(keyID, creator, scriptPubKey, ret, sigversion);
case TX_PUBKEYHASH:
keyID = CKeyID(uint160(vSolutions[0]));
- if (!Sign1(keyID, creator, scriptPubKey, scriptSigRet))
+ if (!Sign1(keyID, creator, scriptPubKey, ret, sigversion))
return false;
else
{
CPubKey vch;
creator.KeyStore().GetPubKey(keyID, vch);
- scriptSigRet << ToByteVector(vch);
+ ret.push_back(ToByteVector(vch));
}
return true;
case TX_SCRIPTHASH:
- return creator.KeyStore().GetCScript(uint160(vSolutions[0]), scriptSigRet);
+ if (creator.KeyStore().GetCScript(uint160(vSolutions[0]), scriptRet)) {
+ ret.push_back(std::vector<unsigned char>(scriptRet.begin(), scriptRet.end()));
+ return true;
+ }
+ return false;
case TX_MULTISIG:
- scriptSigRet << OP_0; // workaround CHECKMULTISIG bug
- return (SignN(vSolutions, creator, scriptPubKey, scriptSigRet));
+ ret.push_back(valtype()); // workaround CHECKMULTISIG bug
+ return (SignN(vSolutions, creator, scriptPubKey, ret, sigversion));
+
+ case TX_WITNESS_V0_KEYHASH:
+ ret.push_back(vSolutions[0]);
+ return true;
+
+ case TX_WITNESS_V0_SCRIPTHASH:
+ CRIPEMD160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160.begin());
+ if (creator.KeyStore().GetCScript(h160, scriptRet)) {
+ ret.push_back(std::vector<unsigned char>(scriptRet.begin(), scriptRet.end()));
+ return true;
+ }
+ return false;
+
+ default:
+ return false;
+ }
+}
+
+static CScript PushAll(const vector<valtype>& values)
+{
+ CScript result;
+ BOOST_FOREACH(const valtype& v, values) {
+ if (v.size() == 0) {
+ result << OP_0;
+ } else if (v.size() == 1 && v[0] >= 1 && v[0] <= 16) {
+ result << CScript::EncodeOP_N(v[0]);
+ } else {
+ result << v;
+ }
}
- return false;
+ return result;
}
-bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, CScript& scriptSig)
+bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata)
{
+ CScript script = fromPubKey;
+ bool solved = true;
+ std::vector<valtype> result;
txnouttype whichType;
- if (!SignStep(creator, fromPubKey, scriptSig, whichType))
- return false;
+ solved = SignStep(creator, script, result, whichType, SIGVERSION_BASE);
+ bool P2SH = false;
+ CScript subscript;
+ sigdata.scriptWitness.stack.clear();
- if (whichType == TX_SCRIPTHASH)
+ if (solved && whichType == TX_SCRIPTHASH)
{
- // Solver returns the subscript that need to be evaluated;
+ // Solver returns the subscript that needs to be evaluated;
// the final scriptSig is the signatures from that
// and then the serialized subscript:
- CScript subscript = scriptSig;
+ script = subscript = CScript(result[0].begin(), result[0].end());
+ solved = solved && SignStep(creator, script, result, whichType, SIGVERSION_BASE) && whichType != TX_SCRIPTHASH;
+ P2SH = true;
+ }
+ if (solved && whichType == TX_WITNESS_V0_KEYHASH)
+ {
+ CScript witnessscript;
+ witnessscript << OP_DUP << OP_HASH160 << ToByteVector(result[0]) << OP_EQUALVERIFY << OP_CHECKSIG;
+ txnouttype subType;
+ solved = solved && SignStep(creator, witnessscript, result, subType, SIGVERSION_WITNESS_V0);
+ sigdata.scriptWitness.stack = result;
+ result.clear();
+ }
+ else if (solved && whichType == TX_WITNESS_V0_SCRIPTHASH)
+ {
+ CScript witnessscript(result[0].begin(), result[0].end());
txnouttype subType;
- bool fSolved =
- SignStep(creator, subscript, scriptSig, subType) && subType != TX_SCRIPTHASH;
- // Append serialized subscript whether or not it is completely signed:
- scriptSig << valtype(subscript.begin(), subscript.end());
- if (!fSolved) return false;
+ solved = solved && SignStep(creator, witnessscript, result, subType, SIGVERSION_WITNESS_V0) && subType != TX_SCRIPTHASH && subType != TX_WITNESS_V0_SCRIPTHASH && subType != TX_WITNESS_V0_KEYHASH;
+ result.push_back(std::vector<unsigned char>(witnessscript.begin(), witnessscript.end()));
+ sigdata.scriptWitness.stack = result;
+ result.clear();
+ }
+
+ if (P2SH) {
+ result.push_back(std::vector<unsigned char>(subscript.begin(), subscript.end()));
}
+ sigdata.scriptSig = PushAll(result);
// Test solution
- return VerifyScript(scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker());
+ return solved && VerifyScript(sigdata.scriptSig, fromPubKey, &sigdata.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker());
+}
+
+SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn)
+{
+ SignatureData data;
+ assert(tx.vin.size() > nIn);
+ data.scriptSig = tx.vin[nIn].scriptSig;
+ if (tx.wit.vtxinwit.size() > nIn) {
+ data.scriptWitness = tx.wit.vtxinwit[nIn].scriptWitness;
+ }
+ return data;
+}
+
+void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const SignatureData& data)
+{
+ assert(tx.vin.size() > nIn);
+ tx.vin[nIn].scriptSig = data.scriptSig;
+ if (!data.scriptWitness.IsNull() || tx.wit.vtxinwit.size() > nIn) {
+ tx.wit.vtxinwit.resize(tx.vin.size());
+ tx.wit.vtxinwit[nIn].scriptWitness = data.scriptWitness;
+ }
}
-bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, int nHashType)
+bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType)
{
assert(nIn < txTo.vin.size());
- CTxIn& txin = txTo.vin[nIn];
CTransaction txToConst(txTo);
- TransactionSignatureCreator creator(&keystore, &txToConst, nIn, nHashType);
+ TransactionSignatureCreator creator(&keystore, &txToConst, nIn, amount, nHashType);
- return ProduceSignature(creator, fromPubKey, txin.scriptSig);
+ SignatureData sigdata;
+ bool ret = ProduceSignature(creator, fromPubKey, sigdata);
+ UpdateTransaction(txTo, nIn, sigdata);
+ return ret;
}
bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType)
@@ -144,20 +230,12 @@ bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutab
assert(txin.prevout.n < txFrom.vout.size());
const CTxOut& txout = txFrom.vout[txin.prevout.n];
- return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, nHashType);
-}
-
-static CScript PushAll(const vector<valtype>& values)
-{
- CScript result;
- BOOST_FOREACH(const valtype& v, values)
- result << v;
- return result;
+ return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType);
}
-static CScript CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
+static vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
const vector<valtype>& vSolutions,
- const vector<valtype>& sigs1, const vector<valtype>& sigs2)
+ const vector<valtype>& sigs1, const vector<valtype>& sigs2, SigVersion sigversion)
{
// Combine all the signatures we've got:
set<valtype> allsigs;
@@ -185,7 +263,7 @@ static CScript CombineMultisig(const CScript& scriptPubKey, const BaseSignatureC
if (sigs.count(pubkey))
continue; // Already got a sig for this pubkey
- if (checker.CheckSig(sig, pubkey, scriptPubKey))
+ if (checker.CheckSig(sig, pubkey, scriptPubKey, sigversion))
{
sigs[pubkey] = sig;
break;
@@ -194,87 +272,126 @@ static CScript CombineMultisig(const CScript& scriptPubKey, const BaseSignatureC
}
// Now build a merged CScript:
unsigned int nSigsHave = 0;
- CScript result; result << OP_0; // pop-one-too-many workaround
+ std::vector<valtype> result; result.push_back(valtype()); // pop-one-too-many workaround
for (unsigned int i = 0; i < nPubKeys && nSigsHave < nSigsRequired; i++)
{
if (sigs.count(vSolutions[i+1]))
{
- result << sigs[vSolutions[i+1]];
+ result.push_back(sigs[vSolutions[i+1]]);
++nSigsHave;
}
}
// Fill any missing with OP_0:
for (unsigned int i = nSigsHave; i < nSigsRequired; i++)
- result << OP_0;
+ result.push_back(valtype());
return result;
}
-static CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
+namespace
+{
+struct Stacks
+{
+ std::vector<valtype> script;
+ std::vector<valtype> witness;
+
+ Stacks() {}
+ explicit Stacks(const std::vector<valtype>& scriptSigStack_) : script(scriptSigStack_), witness() {}
+ explicit Stacks(const SignatureData& data) : witness(data.scriptWitness.stack) {
+ EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE);
+ }
+
+ SignatureData Output() const {
+ SignatureData result;
+ result.scriptSig = PushAll(script);
+ result.scriptWitness.stack = witness;
+ return result;
+ }
+};
+}
+
+static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
const txnouttype txType, const vector<valtype>& vSolutions,
- vector<valtype>& sigs1, vector<valtype>& sigs2)
+ Stacks sigs1, Stacks sigs2, SigVersion sigversion)
{
switch (txType)
{
case TX_NONSTANDARD:
case TX_NULL_DATA:
// Don't know anything about this, assume bigger one is correct:
- if (sigs1.size() >= sigs2.size())
- return PushAll(sigs1);
- return PushAll(sigs2);
+ if (sigs1.script.size() >= sigs2.script.size())
+ return sigs1;
+ return sigs2;
case TX_PUBKEY:
case TX_PUBKEYHASH:
// Signatures are bigger than placeholders or empty scripts:
- if (sigs1.empty() || sigs1[0].empty())
- return PushAll(sigs2);
- return PushAll(sigs1);
+ if (sigs1.script.empty() || sigs1.script[0].empty())
+ return sigs2;
+ return sigs1;
+ case TX_WITNESS_V0_KEYHASH:
+ // Signatures are bigger than placeholders or empty scripts:
+ if (sigs1.witness.empty() || sigs1.witness[0].empty())
+ return sigs2;
+ return sigs1;
case TX_SCRIPTHASH:
- if (sigs1.empty() || sigs1.back().empty())
- return PushAll(sigs2);
- else if (sigs2.empty() || sigs2.back().empty())
- return PushAll(sigs1);
+ if (sigs1.script.empty() || sigs1.script.back().empty())
+ return sigs2;
+ else if (sigs2.script.empty() || sigs2.script.back().empty())
+ return sigs1;
else
{
// Recur to combine:
- valtype spk = sigs1.back();
+ valtype spk = sigs1.script.back();
CScript pubKey2(spk.begin(), spk.end());
txnouttype txType2;
vector<vector<unsigned char> > vSolutions2;
Solver(pubKey2, txType2, vSolutions2);
- sigs1.pop_back();
- sigs2.pop_back();
- CScript result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2);
- result << spk;
+ sigs1.script.pop_back();
+ sigs2.script.pop_back();
+ Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, sigversion);
+ result.script.push_back(spk);
return result;
}
case TX_MULTISIG:
- return CombineMultisig(scriptPubKey, checker, vSolutions, sigs1, sigs2);
+ return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, sigversion));
+ case TX_WITNESS_V0_SCRIPTHASH:
+ if (sigs1.witness.empty() || sigs1.witness.back().empty())
+ return sigs2;
+ else if (sigs2.witness.empty() || sigs2.witness.back().empty())
+ return sigs1;
+ else
+ {
+ // Recur to combine:
+ CScript pubKey2(sigs1.witness.back().begin(), sigs1.witness.back().end());
+ txnouttype txType2;
+ vector<valtype> vSolutions2;
+ Solver(pubKey2, txType2, vSolutions2);
+ sigs1.witness.pop_back();
+ sigs1.script = sigs1.witness;
+ sigs1.witness.clear();
+ sigs2.witness.pop_back();
+ sigs2.script = sigs2.witness;
+ sigs2.witness.clear();
+ Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, SIGVERSION_WITNESS_V0);
+ result.witness = result.script;
+ result.script.clear();
+ result.witness.push_back(valtype(pubKey2.begin(), pubKey2.end()));
+ return result;
+ }
+ default:
+ return Stacks();
}
-
- return CScript();
}
-CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn,
- const CScript& scriptSig1, const CScript& scriptSig2)
-{
- TransactionSignatureChecker checker(&txTo, nIn);
- return CombineSignatures(scriptPubKey, checker, scriptSig1, scriptSig2);
-}
-
-CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
- const CScript& scriptSig1, const CScript& scriptSig2)
+SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
+ const SignatureData& scriptSig1, const SignatureData& scriptSig2)
{
txnouttype txType;
vector<vector<unsigned char> > vSolutions;
Solver(scriptPubKey, txType, vSolutions);
- vector<valtype> stack1;
- EvalScript(stack1, scriptSig1, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker());
- vector<valtype> stack2;
- EvalScript(stack2, scriptSig2, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker());
-
- return CombineSignatures(scriptPubKey, checker, txType, vSolutions, stack1, stack2);
+ return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SIGVERSION_BASE).Output();
}
namespace {
@@ -284,7 +401,7 @@ class DummySignatureChecker : public BaseSignatureChecker
public:
DummySignatureChecker() {}
- bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode) const
+ bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const
{
return true;
}
@@ -297,7 +414,7 @@ const BaseSignatureChecker& DummySignatureCreator::Checker() const
return dummyChecker;
}
-bool DummySignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const
+bool DummySignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const
{
// Create a dummy signature that is a valid DER-encoding
vchSig.assign(72, '\000');
diff --git a/src/script/sign.h b/src/script/sign.h
index 13f45007dd..f9aa6fca27 100644
--- a/src/script/sign.h
+++ b/src/script/sign.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -27,7 +27,7 @@ public:
virtual const BaseSignatureChecker& Checker() const =0;
/** Create a singular (non-script) signature. */
- virtual bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const =0;
+ virtual bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0;
};
/** A signature creator for transactions. */
@@ -35,33 +35,50 @@ class TransactionSignatureCreator : public BaseSignatureCreator {
const CTransaction* txTo;
unsigned int nIn;
int nHashType;
+ CAmount amount;
const TransactionSignatureChecker checker;
public:
- TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, int nHashTypeIn=SIGHASH_ALL);
+ TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn=SIGHASH_ALL);
const BaseSignatureChecker& Checker() const { return checker; }
- bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const;
+ bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const;
};
-/** A signature creator that just produces 72-byte empty signatyres. */
+class MutableTransactionSignatureCreator : public TransactionSignatureCreator {
+ CTransaction tx;
+
+public:
+ MutableTransactionSignatureCreator(const CKeyStore* keystoreIn, const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount, int nHashTypeIn) : TransactionSignatureCreator(keystoreIn, &tx, nInIn, amount, nHashTypeIn), tx(*txToIn) {}
+};
+
+/** A signature creator that just produces 72-byte empty signatures. */
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;
+ bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const;
+};
+
+struct SignatureData {
+ CScript scriptSig;
+ CScriptWitness scriptWitness;
+
+ SignatureData() {}
+ explicit SignatureData(const CScript& script) : scriptSig(script) {}
};
/** Produce a script signature using a generic signature creator. */
-bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, CScript& scriptSig);
+bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata);
/** Produce a script signature for a transaction. */
-bool SignSignature(const CKeyStore& keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL);
-bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL);
+bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType);
+bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType);
/** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */
-CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const CScript& scriptSig1, const CScript& scriptSig2);
+SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const SignatureData& scriptSig1, const SignatureData& scriptSig2);
-/** Combine two script signatures on transactions. */
-CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2);
+/** Extract signature data from a transaction, and insert it. */
+SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn);
+void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const SignatureData& data);
#endif // BITCOIN_SCRIPT_SIGN_H
diff --git a/src/script/standard.cpp b/src/script/standard.cpp
index 4863b96391..bb178f49fe 100644
--- a/src/script/standard.cpp
+++ b/src/script/standard.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -31,6 +31,8 @@ const char* GetTxnOutputType(txnouttype t)
case TX_SCRIPTHASH: return "scripthash";
case TX_MULTISIG: return "multisig";
case TX_NULL_DATA: return "nulldata";
+ case TX_WITNESS_V0_KEYHASH: return "witness_v0_keyhash";
+ case TX_WITNESS_V0_SCRIPTHASH: return "witness_v0_scripthash";
}
return NULL;
}
@@ -66,6 +68,22 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector<vector<unsi
return true;
}
+ int witnessversion;
+ std::vector<unsigned char> witnessprogram;
+ if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) {
+ if (witnessversion == 0 && witnessprogram.size() == 20) {
+ typeRet = TX_WITNESS_V0_KEYHASH;
+ vSolutionsRet.push_back(witnessprogram);
+ return true;
+ }
+ if (witnessversion == 0 && witnessprogram.size() == 32) {
+ typeRet = TX_WITNESS_V0_SCRIPTHASH;
+ vSolutionsRet.push_back(witnessprogram);
+ return true;
+ }
+ return false;
+ }
+
// Provably prunable, data-carrying output
//
// So long as script passes the IsUnspendable() test and all but the first
@@ -161,27 +179,6 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector<vector<unsi
return false;
}
-int ScriptSigArgsExpected(txnouttype t, const std::vector<std::vector<unsigned char> >& vSolutions)
-{
- switch (t)
- {
- case TX_NONSTANDARD:
- case TX_NULL_DATA:
- return -1;
- case TX_PUBKEY:
- return 1;
- case TX_PUBKEYHASH:
- return 2;
- case TX_MULTISIG:
- if (vSolutions.size() < 1 || vSolutions[0].size() < 1)
- return -1;
- return vSolutions[0][0] + 1;
- case TX_SCRIPTHASH:
- return 1; // doesn't include args needed by the script
- }
- return -1;
-}
-
bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
{
vector<valtype> vSolutions;
@@ -303,3 +300,26 @@ CScript GetScriptForMultisig(int nRequired, const std::vector<CPubKey>& keys)
script << CScript::EncodeOP_N(keys.size()) << OP_CHECKMULTISIG;
return script;
}
+
+CScript GetScriptForWitness(const CScript& redeemscript)
+{
+ CScript ret;
+
+ txnouttype typ;
+ std::vector<std::vector<unsigned char> > vSolutions;
+ if (Solver(redeemscript, typ, vSolutions)) {
+ if (typ == TX_PUBKEY) {
+ unsigned char h160[20];
+ CHash160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160);
+ ret << OP_0 << std::vector<unsigned char>(&h160[0], &h160[20]);
+ return ret;
+ } else if (typ == TX_PUBKEYHASH) {
+ ret << OP_0 << vSolutions[0];
+ return ret;
+ }
+ }
+ uint256 hash;
+ CSHA256().Write(&redeemscript[0], redeemscript.size()).Finalize(hash.begin());
+ ret << OP_0 << ToByteVector(hash);
+ return ret;
+}
diff --git a/src/script/standard.h b/src/script/standard.h
index 2b9fbe78dd..72aaea0b7b 100644
--- a/src/script/standard.h
+++ b/src/script/standard.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -27,7 +27,7 @@ public:
CScriptID(const uint160& in) : uint160(in) {}
};
-static const unsigned int MAX_OP_RETURN_RELAY = 83; //! bytes (+1 for OP_RETURN, +2 for the pushdata opcodes)
+static const unsigned int MAX_OP_RETURN_RELAY = 83; //!< bytes (+1 for OP_RETURN, +2 for the pushdata opcodes)
extern bool fAcceptDatacarrier;
extern unsigned nMaxDatacarrierBytes;
@@ -51,6 +51,8 @@ enum txnouttype
TX_SCRIPTHASH,
TX_MULTISIG,
TX_NULL_DATA,
+ TX_WITNESS_V0_SCRIPTHASH,
+ TX_WITNESS_V0_KEYHASH,
};
class CNoDestination {
@@ -71,12 +73,12 @@ typedef boost::variant<CNoDestination, CKeyID, CScriptID> CTxDestination;
const char* GetTxnOutputType(txnouttype t);
bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<std::vector<unsigned char> >& vSolutionsRet);
-int ScriptSigArgsExpected(txnouttype t, const std::vector<std::vector<unsigned char> >& vSolutions);
bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet);
bool ExtractDestinations(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet);
CScript GetScriptForDestination(const CTxDestination& dest);
CScript GetScriptForRawPubKey(const CPubKey& pubkey);
CScript GetScriptForMultisig(int nRequired, const std::vector<CPubKey>& keys);
+CScript GetScriptForWitness(const CScript& redeemscript);
#endif // BITCOIN_SCRIPT_STANDARD_H
diff --git a/src/secp256k1/.gitignore b/src/secp256k1/.gitignore
index e0b7b7a48a..efb277d347 100644
--- a/src/secp256k1/.gitignore
+++ b/src/secp256k1/.gitignore
@@ -25,17 +25,24 @@ config.status
libtool
.deps/
.dirstamp
-build-aux/
*.lo
*.o
*~
src/libsecp256k1-config.h
src/libsecp256k1-config.h.in
src/ecmult_static_context.h
-m4/libtool.m4
-m4/ltoptions.m4
-m4/ltsugar.m4
-m4/ltversion.m4
-m4/lt~obsolete.m4
+build-aux/config.guess
+build-aux/config.sub
+build-aux/depcomp
+build-aux/install-sh
+build-aux/ltmain.sh
+build-aux/m4/libtool.m4
+build-aux/m4/lt~obsolete.m4
+build-aux/m4/ltoptions.m4
+build-aux/m4/ltsugar.m4
+build-aux/m4/ltversion.m4
+build-aux/missing
+build-aux/compile
+build-aux/test-driver
src/stamp-h1
libsecp256k1.pc
diff --git a/src/secp256k1/.travis.yml b/src/secp256k1/.travis.yml
index 4e1e73c39f..2c5c63adad 100644
--- a/src/secp256k1/.travis.yml
+++ b/src/secp256k1/.travis.yml
@@ -6,26 +6,31 @@ addons:
compiler:
- clang
- gcc
+cache:
+ directories:
+ - src/java/guava/
env:
global:
- - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no schnorr=no RECOVERY=no
+ - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no schnorr=no RECOVERY=no EXPERIMENTAL=no
+ - GUAVA_URL=https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar GUAVA_JAR=src/java/guava/guava-18.0.jar
matrix:
- SCALAR=32bit RECOVERY=yes
- - SCALAR=32bit FIELD=32bit ECDH=yes
+ - SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes
- SCALAR=64bit
- FIELD=64bit RECOVERY=yes
- FIELD=64bit ENDOMORPHISM=yes
- - FIELD=64bit ENDOMORPHISM=yes ECDH=yes
+ - FIELD=64bit ENDOMORPHISM=yes ECDH=yes EXPERIMENTAL=yes
- FIELD=64bit ASM=x86_64
- FIELD=64bit ENDOMORPHISM=yes ASM=x86_64
- - FIELD=32bit SCHNORR=yes
+ - FIELD=32bit SCHNORR=yes EXPERIMENTAL=yes
- FIELD=32bit ENDOMORPHISM=yes
- BIGNUM=no
- - BIGNUM=no ENDOMORPHISM=yes SCHNORR=yes RECOVERY=yes
+ - BIGNUM=no ENDOMORPHISM=yes SCHNORR=yes RECOVERY=yes EXPERIMENTAL=yes
- BIGNUM=no STATICPRECOMPUTATION=no
- BUILD=distcheck
- EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC
- EXTRAFLAGS=CFLAGS=-O0
+ - BUILD=check-java ECDH=yes SCHNORR=yes EXPERIMENTAL=yes
matrix:
fast_finish: true
include:
@@ -55,9 +60,11 @@ matrix:
packages:
- gcc-multilib
- libgmp-dev:i386
+before_install: mkdir -p `dirname $GUAVA_JAR`
+install: if [ ! -f $GUAVA_JAR ]; then wget $GUAVA_URL -O $GUAVA_JAR; fi
before_script: ./autogen.sh
script:
- if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi
- if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi
- - ./configure --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --enable-module-ecdh=$ECDH --enable-module-schnorr=$SCHNORR --enable-module-recovery=$RECOVERY $EXTRAFLAGS $USE_HOST && make -j2 $BUILD
+ - ./configure --enable-experimental=$EXPERIMENTAL --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --enable-module-ecdh=$ECDH --enable-module-schnorr=$SCHNORR --enable-module-recovery=$RECOVERY $EXTRAFLAGS $USE_HOST && make -j2 $BUILD
os: linux
diff --git a/src/secp256k1/Makefile.am b/src/secp256k1/Makefile.am
index 7772a4e9d2..3d130bdcbd 100644
--- a/src/secp256k1/Makefile.am
+++ b/src/secp256k1/Makefile.am
@@ -1,6 +1,12 @@
ACLOCAL_AMFLAGS = -I build-aux/m4
lib_LTLIBRARIES = libsecp256k1.la
+if USE_JNI
+JNI_LIB = libsecp256k1_jni.la
+noinst_LTLIBRARIES = $(JNI_LIB)
+else
+JNI_LIB =
+endif
include_HEADERS = include/secp256k1.h
noinst_HEADERS =
noinst_HEADERS += src/scalar.h
@@ -32,6 +38,7 @@ noinst_HEADERS += src/field_5x52_impl.h
noinst_HEADERS += src/field_5x52_int128_impl.h
noinst_HEADERS += src/field_5x52_asm_impl.h
noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h
+noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h
noinst_HEADERS += src/util.h
noinst_HEADERS += src/testrand.h
noinst_HEADERS += src/testrand_impl.h
@@ -45,35 +52,80 @@ noinst_HEADERS += contrib/lax_der_parsing.c
noinst_HEADERS += contrib/lax_der_privatekey_parsing.h
noinst_HEADERS += contrib/lax_der_privatekey_parsing.c
+if USE_EXTERNAL_ASM
+COMMON_LIB = libsecp256k1_common.la
+noinst_LTLIBRARIES = $(COMMON_LIB)
+else
+COMMON_LIB =
+endif
+
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libsecp256k1.pc
+if USE_EXTERNAL_ASM
+if USE_ASM_ARM
+libsecp256k1_common_la_SOURCES = src/asm/field_10x26_arm.s
+endif
+endif
+
libsecp256k1_la_SOURCES = src/secp256k1.c
-libsecp256k1_la_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES)
-libsecp256k1_la_LIBADD = $(SECP_LIBS)
+libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES)
+libsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS) $(COMMON_LIB)
+libsecp256k1_jni_la_SOURCES = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c
+libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES)
noinst_PROGRAMS =
if USE_BENCHMARK
noinst_PROGRAMS += bench_verify bench_sign bench_internal
bench_verify_SOURCES = src/bench_verify.c
-bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS)
+bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB)
bench_sign_SOURCES = src/bench_sign.c
-bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS)
+bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB)
bench_internal_SOURCES = src/bench_internal.c
-bench_internal_LDADD = $(SECP_LIBS)
-bench_internal_CPPFLAGS = $(SECP_INCLUDES)
+bench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB)
+bench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES)
endif
if USE_TESTS
noinst_PROGRAMS += tests
tests_SOURCES = src/tests.c
-tests_CPPFLAGS = -DVERIFY -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES)
-tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS)
+tests_CPPFLAGS = -DSECP256K1_BUILD -DVERIFY -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES)
+tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB)
tests_LDFLAGS = -static
TESTS = tests
endif
+JAVAROOT=src/java
+JAVAORG=org/bitcoin
+JAVA_GUAVA=$(srcdir)/$(JAVAROOT)/guava/guava-18.0.jar
+CLASSPATH_ENV=CLASSPATH=$(JAVA_GUAVA)
+JAVA_FILES= \
+ $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \
+ $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \
+ $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \
+ $(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java
+
+if USE_JNI
+
+$(JAVA_GUAVA):
+ @echo Guava is missing. Fetch it via: \
+ wget https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar -O $(@)
+ @false
+
+.stamp-java: $(JAVA_FILES)
+ @echo Compiling $^
+ $(AM_V_at)$(CLASSPATH_ENV) javac $^
+ @touch $@
+
+if USE_TESTS
+
+check-java: libsecp256k1.la $(JAVA_GUAVA) .stamp-java
+ $(AM_V_at)java -Djava.library.path="./:./src:./src/.libs:.libs/" -cp "$(JAVA_GUAVA):$(JAVAROOT)" $(JAVAORG)/NativeSecp256k1Test
+
+endif
+endif
+
if USE_ECMULT_STATIC_PRECOMPUTATION
CPPFLAGS_FOR_BUILD +=-I$(top_srcdir)
CFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function
@@ -93,10 +145,10 @@ $(bench_internal_OBJECTS): src/ecmult_static_context.h
src/ecmult_static_context.h: $(gen_context_BIN)
./$(gen_context_BIN)
-CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h
+CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java
endif
-EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h
+EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES)
if ENABLE_MODULE_ECDH
include src/modules/ecdh/Makefile.am.include
diff --git a/src/secp256k1/README.md b/src/secp256k1/README.md
index 6095db4220..8cd344ea81 100644
--- a/src/secp256k1/README.md
+++ b/src/secp256k1/README.md
@@ -1,7 +1,7 @@
libsecp256k1
============
-[![Build Status](https://travis-ci.org/bitcoin/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin/secp256k1)
+[![Build Status](https://travis-ci.org/bitcoin-core/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin-core/secp256k1)
Optimized C library for EC operations on curve secp256k1.
diff --git a/src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 b/src/secp256k1/build-aux/m4/ax_jni_include_dir.m4
new file mode 100644
index 0000000000..1fc3627614
--- /dev/null
+++ b/src/secp256k1/build-aux/m4/ax_jni_include_dir.m4
@@ -0,0 +1,140 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_JNI_INCLUDE_DIR
+#
+# DESCRIPTION
+#
+# AX_JNI_INCLUDE_DIR finds include directories needed for compiling
+# programs using the JNI interface.
+#
+# JNI include directories are usually in the Java distribution. This is
+# deduced from the value of $JAVA_HOME, $JAVAC, or the path to "javac", in
+# that order. When this macro completes, a list of directories is left in
+# the variable JNI_INCLUDE_DIRS.
+#
+# Example usage follows:
+#
+# AX_JNI_INCLUDE_DIR
+#
+# for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS
+# do
+# CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR"
+# done
+#
+# If you want to force a specific compiler:
+#
+# - at the configure.in level, set JAVAC=yourcompiler before calling
+# AX_JNI_INCLUDE_DIR
+#
+# - at the configure level, setenv JAVAC
+#
+# Note: This macro can work with the autoconf M4 macros for Java programs.
+# This particular macro is not part of the original set of macros.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Don Anderson <dda@sleepycat.com>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 10
+
+AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR])
+AC_DEFUN([AX_JNI_INCLUDE_DIR],[
+
+JNI_INCLUDE_DIRS=""
+
+if test "x$JAVA_HOME" != x; then
+ _JTOPDIR="$JAVA_HOME"
+else
+ if test "x$JAVAC" = x; then
+ JAVAC=javac
+ fi
+ AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no])
+ if test "x$_ACJNI_JAVAC" = xno; then
+ AC_MSG_WARN([cannot find JDK; try setting \$JAVAC or \$JAVA_HOME])
+ fi
+ _ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC")
+ _JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'`
+fi
+
+case "$host_os" in
+ darwin*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
+ _JINC="$_JTOPDIR/Headers";;
+ *) _JINC="$_JTOPDIR/include";;
+esac
+_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR])
+_AS_ECHO_LOG([_JINC=$_JINC])
+
+# On Mac OS X 10.6.4, jni.h is a symlink:
+# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h
+# -> ../../CurrentJDK/Headers/jni.h.
+
+AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path,
+[
+if test -f "$_JINC/jni.h"; then
+ ac_cv_jni_header_path="$_JINC"
+ JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
+else
+ _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
+ if test -f "$_JTOPDIR/include/jni.h"; then
+ ac_cv_jni_header_path="$_JTOPDIR/include"
+ JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
+ else
+ ac_cv_jni_header_path=none
+ fi
+fi
+])
+
+
+
+# get the likely subdirectories for system specific java includes
+case "$host_os" in
+bsdi*) _JNI_INC_SUBDIRS="bsdos";;
+darwin*) _JNI_INC_SUBDIRS="darwin";;
+freebsd*) _JNI_INC_SUBDIRS="freebsd";;
+linux*) _JNI_INC_SUBDIRS="linux genunix";;
+osf*) _JNI_INC_SUBDIRS="alpha";;
+solaris*) _JNI_INC_SUBDIRS="solaris";;
+mingw*) _JNI_INC_SUBDIRS="win32";;
+cygwin*) _JNI_INC_SUBDIRS="win32";;
+*) _JNI_INC_SUBDIRS="genunix";;
+esac
+
+if test "x$ac_cv_jni_header_path" != "xnone"; then
+ # add any subdirectories that are present
+ for JINCSUBDIR in $_JNI_INC_SUBDIRS
+ do
+ if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then
+ JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR"
+ fi
+ done
+fi
+])
+
+# _ACJNI_FOLLOW_SYMLINKS <path>
+# Follows symbolic links on <path>,
+# finally setting variable _ACJNI_FOLLOWED
+# ----------------------------------------
+AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[
+# find the include directory relative to the javac executable
+_cur="$1"
+while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do
+ AC_MSG_CHECKING([symlink for $_cur])
+ _slink=`ls -ld "$_cur" | sed 's/.* -> //'`
+ case "$_slink" in
+ /*) _cur="$_slink";;
+ # 'X' avoids triggering unwanted echo options.
+ *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";;
+ esac
+ AC_MSG_RESULT([$_cur])
+done
+_ACJNI_FOLLOWED="$_cur"
+])# _ACJNI
diff --git a/src/secp256k1/build-aux/m4/bitcoin_secp.m4 b/src/secp256k1/build-aux/m4/bitcoin_secp.m4
index d41bbb6487..b25d8adb92 100644
--- a/src/secp256k1/build-aux/m4/bitcoin_secp.m4
+++ b/src/secp256k1/build-aux/m4/bitcoin_secp.m4
@@ -3,13 +3,13 @@ AC_DEFUN([SECP_INT128_CHECK],[
has_int128=$ac_cv_type___int128
])
-dnl
+dnl escape "$0x" below using the m4 quadrigaph @S|@, and escape it again with a \ for the shell.
AC_DEFUN([SECP_64BIT_ASM_CHECK],[
AC_MSG_CHECKING(for x86_64 assembly availability)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <stdint.h>]],[[
uint64_t a = 11, tmp;
- __asm__ __volatile__("movq $0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx");
+ __asm__ __volatile__("movq \@S|@0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx");
]])],[has_64bit_asm=yes],[has_64bit_asm=no])
AC_MSG_RESULT([$has_64bit_asm])
])
diff --git a/src/secp256k1/configure.ac b/src/secp256k1/configure.ac
index 786d8dcfb9..0743c36690 100644
--- a/src/secp256k1/configure.ac
+++ b/src/secp256k1/configure.ac
@@ -29,6 +29,7 @@ AC_PROG_CC_C89
if test x"$ac_cv_prog_cc_c89" = x"no"; then
AC_MSG_ERROR([c89 compiler support required])
fi
+AM_PROG_AS
case $host_os in
*darwin*)
@@ -93,23 +94,33 @@ AC_ARG_ENABLE(tests,
[use_tests=$enableval],
[use_tests=yes])
+AC_ARG_ENABLE(openssl_tests,
+ AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]),
+ [enable_openssl_tests=$enableval],
+ [enable_openssl_tests=auto])
+
+AC_ARG_ENABLE(experimental,
+ AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]),
+ [use_experimental=$enableval],
+ [use_experimental=no])
+
AC_ARG_ENABLE(endomorphism,
AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
[use_endomorphism=$enableval],
[use_endomorphism=no])
-
+
AC_ARG_ENABLE(ecmult_static_precomputation,
AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]),
[use_ecmult_static_precomputation=$enableval],
- [use_ecmult_static_precomputation=yes])
+ [use_ecmult_static_precomputation=auto])
AC_ARG_ENABLE(module_ecdh,
- AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (default is no)]),
+ AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),
[enable_module_ecdh=$enableval],
[enable_module_ecdh=no])
AC_ARG_ENABLE(module_schnorr,
- AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (default is no)]),
+ AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (experimental)]),
[enable_module_schnorr=$enableval],
[enable_module_schnorr=no])
@@ -118,6 +129,11 @@ AC_ARG_ENABLE(module_recovery,
[enable_module_recovery=$enableval],
[enable_module_recovery=no])
+AC_ARG_ENABLE(jni,
+ AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]),
+ [use_jni=$enableval],
+ [use_jni=auto])
+
AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
@@ -127,8 +143,8 @@ AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
-AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto]
-[Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto])
+AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto]
+[Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto])
AC_CHECK_TYPES([__int128])
@@ -138,6 +154,34 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
[ AC_MSG_RESULT([no])
])
+if test x"$use_ecmult_static_precomputation" != x"no"; then
+ save_cross_compiling=$cross_compiling
+ cross_compiling=no
+ TEMP_CC="$CC"
+ CC="$CC_FOR_BUILD"
+ AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}])
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([], [return 0])],
+ [working_native_cc=yes],
+ [working_native_cc=no],[dnl])
+ CC="$TEMP_CC"
+ cross_compiling=$save_cross_compiling
+
+ if test x"$working_native_cc" = x"no"; then
+ set_precomp=no
+ if test x"$use_ecmult_static_precomputation" = x"yes"; then
+ AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
+ else
+ AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
+ fi
+ else
+ AC_MSG_RESULT([ok])
+ set_precomp=yes
+ fi
+else
+ set_precomp=no
+fi
+
if test x"$req_asm" = x"auto"; then
SECP_64BIT_ASM_CHECK
if test x"$has_64bit_asm" = x"yes"; then
@@ -155,6 +199,8 @@ else
AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
fi
;;
+ arm)
+ ;;
no)
;;
*)
@@ -247,10 +293,15 @@ else
fi
# select assembly optimization
+use_external_asm=no
+
case $set_asm in
x86_64)
AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
;;
+arm)
+ use_external_asm=yes
+ ;;
no)
;;
*)
@@ -305,16 +356,51 @@ esac
if test x"$use_tests" = x"yes"; then
SECP_OPENSSL_CHECK
if test x"$has_openssl_ec" = x"yes"; then
- AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
- SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
- SECP_TEST_LIBS="$CRYPTO_LIBS"
-
- case $host in
- *mingw*)
- SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
- ;;
- esac
+ if test x"$enable_openssl_tests" != x"no"; then
+ AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
+ SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
+ SECP_TEST_LIBS="$CRYPTO_LIBS"
+
+ case $host in
+ *mingw*)
+ SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
+ ;;
+ esac
+ fi
+ else
+ if test x"$enable_openssl_tests" = x"yes"; then
+ AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
+ fi
+ fi
+else
+ if test x"$enable_openssl_tests" = x"yes"; then
+ AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
+ fi
+fi
+if test x"$use_jni" != x"no"; then
+ AX_JNI_INCLUDE_DIR
+ have_jni_dependencies=yes
+ if test x"$enable_module_schnorr" = x"no"; then
+ have_jni_dependencies=no
+ fi
+ if test x"$enable_module_ecdh" = x"no"; then
+ have_jni_dependencies=no
+ fi
+ if test "x$JNI_INCLUDE_DIRS" = "x"; then
+ have_jni_dependencies=no
+ fi
+ if test "x$have_jni_dependencies" = "xno"; then
+ if test x"$use_jni" = x"yes"; then
+ AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and Schnorr and try again.])
+ fi
+ AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
+ use_jni=no
+ else
+ use_jni=yes
+ for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
+ JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
+ done
fi
fi
@@ -345,18 +431,43 @@ fi
AC_C_BIGENDIAN()
+if test x"$use_external_asm" = x"yes"; then
+ AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
+fi
+
+AC_MSG_NOTICE([Using static precomputation: $set_precomp])
AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
AC_MSG_NOTICE([Using field implementation: $set_field])
AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
-
AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
+AC_MSG_NOTICE([Using jni: $use_jni])
+
+if test x"$enable_experimental" = x"yes"; then
+ AC_MSG_NOTICE([******])
+ AC_MSG_NOTICE([WARNING: experimental build])
+ AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
+ AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
+ AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
+ AC_MSG_NOTICE([******])
+else
+ if test x"$enable_module_schnorr" = x"yes"; then
+ AC_MSG_ERROR([Schnorr signature module is experimental. Use --enable-experimental to allow.])
+ fi
+ if test x"$enable_module_ecdh" = x"yes"; then
+ AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
+ fi
+ if test x"$set_asm" = x"arm"; then
+ AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
+ fi
+fi
AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
AC_CONFIG_FILES([Makefile libsecp256k1.pc])
+AC_SUBST(JNI_INCLUDES)
AC_SUBST(SECP_INCLUDES)
AC_SUBST(SECP_LIBS)
AC_SUBST(SECP_TEST_LIBS)
@@ -367,6 +478,9 @@ AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$use_ecmult_static_pr
AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
+AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
+AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
+AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
dnl make sure nothing new is exported so that we don't break the cache
PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
diff --git a/src/secp256k1/libsecp256k1.pc.in b/src/secp256k1/libsecp256k1.pc.in
index 1c72dd0003..a0d006f113 100644
--- a/src/secp256k1/libsecp256k1.pc.in
+++ b/src/secp256k1/libsecp256k1.pc.in
@@ -5,7 +5,7 @@ includedir=@includedir@
Name: libsecp256k1
Description: Optimized C library for EC operations on curve secp256k1
-URL: https://github.com/bitcoin/secp256k1
+URL: https://github.com/bitcoin-core/secp256k1
Version: @PACKAGE_VERSION@
Cflags: -I${includedir}
Libs.private: @SECP_LIBS@
diff --git a/src/secp256k1/sage/group_prover.sage b/src/secp256k1/sage/group_prover.sage
new file mode 100644
index 0000000000..ab580c5b23
--- /dev/null
+++ b/src/secp256k1/sage/group_prover.sage
@@ -0,0 +1,322 @@
+# This code supports verifying group implementations which have branches
+# or conditional statements (like cmovs), by allowing each execution path
+# to independently set assumptions on input or intermediary variables.
+#
+# The general approach is:
+# * A constraint is a tuple of two sets of of symbolic expressions:
+# the first of which are required to evaluate to zero, the second of which
+# are required to evaluate to nonzero.
+# - A constraint is said to be conflicting if any of its nonzero expressions
+# is in the ideal with basis the zero expressions (in other words: when the
+# zero expressions imply that one of the nonzero expressions are zero).
+# * There is a list of laws that describe the intended behaviour, including
+# laws for addition and doubling. Each law is called with the symbolic point
+# coordinates as arguments, and returns:
+# - A constraint describing the assumptions under which it is applicable,
+# called "assumeLaw"
+# - A constraint describing the requirements of the law, called "require"
+# * Implementations are transliterated into functions that operate as well on
+# algebraic input points, and are called once per combination of branches
+# exectured. Each execution returns:
+# - A constraint describing the assumptions this implementation requires
+# (such as Z1=1), called "assumeFormula"
+# - A constraint describing the assumptions this specific branch requires,
+# but which is by construction guaranteed to cover the entire space by
+# merging the results from all branches, called "assumeBranch"
+# - The result of the computation
+# * All combinations of laws with implementation branches are tried, and:
+# - If the combination of assumeLaw, assumeFormula, and assumeBranch results
+# in a conflict, it means this law does not apply to this branch, and it is
+# skipped.
+# - For others, we try to prove the require constraints hold, assuming the
+# information in assumeLaw + assumeFormula + assumeBranch, and if this does
+# not succeed, we fail.
+# + To prove an expression is zero, we check whether it belongs to the
+# ideal with the assumed zero expressions as basis. This test is exact.
+# + To prove an expression is nonzero, we check whether each of its
+# factors is contained in the set of nonzero assumptions' factors.
+# This test is not exact, so various combinations of original and
+# reduced expressions' factors are tried.
+# - If we succeed, we print out the assumptions from assumeFormula that
+# weren't implied by assumeLaw already. Those from assumeBranch are skipped,
+# as we assume that all constraints in it are complementary with each other.
+#
+# Based on the sage verification scripts used in the Explicit-Formulas Database
+# by Tanja Lange and others, see http://hyperelliptic.org/EFD
+
+class fastfrac:
+ """Fractions over rings."""
+
+ def __init__(self,R,top,bot=1):
+ """Construct a fractional, given a ring, a numerator, and denominator."""
+ self.R = R
+ if parent(top) == ZZ or parent(top) == R:
+ self.top = R(top)
+ self.bot = R(bot)
+ elif top.__class__ == fastfrac:
+ self.top = top.top
+ self.bot = top.bot * bot
+ else:
+ self.top = R(numerator(top))
+ self.bot = R(denominator(top)) * bot
+
+ def iszero(self,I):
+ """Return whether this fraction is zero given an ideal."""
+ return self.top in I and self.bot not in I
+
+ def reduce(self,assumeZero):
+ zero = self.R.ideal(map(numerator, assumeZero))
+ return fastfrac(self.R, zero.reduce(self.top)) / fastfrac(self.R, zero.reduce(self.bot))
+
+ def __add__(self,other):
+ """Add two fractions."""
+ if parent(other) == ZZ:
+ return fastfrac(self.R,self.top + self.bot * other,self.bot)
+ if other.__class__ == fastfrac:
+ return fastfrac(self.R,self.top * other.bot + self.bot * other.top,self.bot * other.bot)
+ return NotImplemented
+
+ def __sub__(self,other):
+ """Subtract two fractions."""
+ if parent(other) == ZZ:
+ return fastfrac(self.R,self.top - self.bot * other,self.bot)
+ if other.__class__ == fastfrac:
+ return fastfrac(self.R,self.top * other.bot - self.bot * other.top,self.bot * other.bot)
+ return NotImplemented
+
+ def __neg__(self):
+ """Return the negation of a fraction."""
+ return fastfrac(self.R,-self.top,self.bot)
+
+ def __mul__(self,other):
+ """Multiply two fractions."""
+ if parent(other) == ZZ:
+ return fastfrac(self.R,self.top * other,self.bot)
+ if other.__class__ == fastfrac:
+ return fastfrac(self.R,self.top * other.top,self.bot * other.bot)
+ return NotImplemented
+
+ def __rmul__(self,other):
+ """Multiply something else with a fraction."""
+ return self.__mul__(other)
+
+ def __div__(self,other):
+ """Divide two fractions."""
+ if parent(other) == ZZ:
+ return fastfrac(self.R,self.top,self.bot * other)
+ if other.__class__ == fastfrac:
+ return fastfrac(self.R,self.top * other.bot,self.bot * other.top)
+ return NotImplemented
+
+ def __pow__(self,other):
+ """Compute a power of a fraction."""
+ if parent(other) == ZZ:
+ if other < 0:
+ # Negative powers require flipping top and bottom
+ return fastfrac(self.R,self.bot ^ (-other),self.top ^ (-other))
+ else:
+ return fastfrac(self.R,self.top ^ other,self.bot ^ other)
+ return NotImplemented
+
+ def __str__(self):
+ return "fastfrac((" + str(self.top) + ") / (" + str(self.bot) + "))"
+ def __repr__(self):
+ return "%s" % self
+
+ def numerator(self):
+ return self.top
+
+class constraints:
+ """A set of constraints, consisting of zero and nonzero expressions.
+
+ Constraints can either be used to express knowledge or a requirement.
+
+ Both the fields zero and nonzero are maps from expressions to description
+ strings. The expressions that are the keys in zero are required to be zero,
+ and the expressions that are the keys in nonzero are required to be nonzero.
+
+ Note that (a != 0) and (b != 0) is the same as (a*b != 0), so all keys in
+ nonzero could be multiplied into a single key. This is often much less
+ efficient to work with though, so we keep them separate inside the
+ constraints. This allows higher-level code to do fast checks on the individual
+ nonzero elements, or combine them if needed for stronger checks.
+
+ We can't multiply the different zero elements, as it would suffice for one of
+ the factors to be zero, instead of all of them. Instead, the zero elements are
+ typically combined into an ideal first.
+ """
+
+ def __init__(self, **kwargs):
+ if 'zero' in kwargs:
+ self.zero = dict(kwargs['zero'])
+ else:
+ self.zero = dict()
+ if 'nonzero' in kwargs:
+ self.nonzero = dict(kwargs['nonzero'])
+ else:
+ self.nonzero = dict()
+
+ def negate(self):
+ return constraints(zero=self.nonzero, nonzero=self.zero)
+
+ def __add__(self, other):
+ zero = self.zero.copy()
+ zero.update(other.zero)
+ nonzero = self.nonzero.copy()
+ nonzero.update(other.nonzero)
+ return constraints(zero=zero, nonzero=nonzero)
+
+ def __str__(self):
+ return "constraints(zero=%s,nonzero=%s)" % (self.zero, self.nonzero)
+
+ def __repr__(self):
+ return "%s" % self
+
+
+def conflicts(R, con):
+ """Check whether any of the passed non-zero assumptions is implied by the zero assumptions"""
+ zero = R.ideal(map(numerator, con.zero))
+ if 1 in zero:
+ return True
+ # First a cheap check whether any of the individual nonzero terms conflict on
+ # their own.
+ for nonzero in con.nonzero:
+ if nonzero.iszero(zero):
+ return True
+ # It can be the case that entries in the nonzero set do not individually
+ # conflict with the zero set, but their combination does. For example, knowing
+ # that either x or y is zero is equivalent to having x*y in the zero set.
+ # Having x or y individually in the nonzero set is not a conflict, but both
+ # simultaneously is, so that is the right thing to check for.
+ if reduce(lambda a,b: a * b, con.nonzero, fastfrac(R, 1)).iszero(zero):
+ return True
+ return False
+
+
+def get_nonzero_set(R, assume):
+ """Calculate a simple set of nonzero expressions"""
+ zero = R.ideal(map(numerator, assume.zero))
+ nonzero = set()
+ for nz in map(numerator, assume.nonzero):
+ for (f,n) in nz.factor():
+ nonzero.add(f)
+ rnz = zero.reduce(nz)
+ for (f,n) in rnz.factor():
+ nonzero.add(f)
+ return nonzero
+
+
+def prove_nonzero(R, exprs, assume):
+ """Check whether an expression is provably nonzero, given assumptions"""
+ zero = R.ideal(map(numerator, assume.zero))
+ nonzero = get_nonzero_set(R, assume)
+ expl = set()
+ ok = True
+ for expr in exprs:
+ if numerator(expr) in zero:
+ return (False, [exprs[expr]])
+ allexprs = reduce(lambda a,b: numerator(a)*numerator(b), exprs, 1)
+ for (f, n) in allexprs.factor():
+ if f not in nonzero:
+ ok = False
+ if ok:
+ return (True, None)
+ ok = True
+ for (f, n) in zero.reduce(numerator(allexprs)).factor():
+ if f not in nonzero:
+ ok = False
+ if ok:
+ return (True, None)
+ ok = True
+ for expr in exprs:
+ for (f,n) in numerator(expr).factor():
+ if f not in nonzero:
+ ok = False
+ if ok:
+ return (True, None)
+ ok = True
+ for expr in exprs:
+ for (f,n) in zero.reduce(numerator(expr)).factor():
+ if f not in nonzero:
+ expl.add(exprs[expr])
+ if expl:
+ return (False, list(expl))
+ else:
+ return (True, None)
+
+
+def prove_zero(R, exprs, assume):
+ """Check whether all of the passed expressions are provably zero, given assumptions"""
+ r, e = prove_nonzero(R, dict(map(lambda x: (fastfrac(R, x.bot, 1), exprs[x]), exprs)), assume)
+ if not r:
+ return (False, map(lambda x: "Possibly zero denominator: %s" % x, e))
+ zero = R.ideal(map(numerator, assume.zero))
+ nonzero = prod(x for x in assume.nonzero)
+ expl = []
+ for expr in exprs:
+ if not expr.iszero(zero):
+ expl.append(exprs[expr])
+ if not expl:
+ return (True, None)
+ return (False, expl)
+
+
+def describe_extra(R, assume, assumeExtra):
+ """Describe what assumptions are added, given existing assumptions"""
+ zerox = assume.zero.copy()
+ zerox.update(assumeExtra.zero)
+ zero = R.ideal(map(numerator, assume.zero))
+ zeroextra = R.ideal(map(numerator, zerox))
+ nonzero = get_nonzero_set(R, assume)
+ ret = set()
+ # Iterate over the extra zero expressions
+ for base in assumeExtra.zero:
+ if base not in zero:
+ add = []
+ for (f, n) in numerator(base).factor():
+ if f not in nonzero:
+ add += ["%s" % f]
+ if add:
+ ret.add((" * ".join(add)) + " = 0 [%s]" % assumeExtra.zero[base])
+ # Iterate over the extra nonzero expressions
+ for nz in assumeExtra.nonzero:
+ nzr = zeroextra.reduce(numerator(nz))
+ if nzr not in zeroextra:
+ for (f,n) in nzr.factor():
+ if zeroextra.reduce(f) not in nonzero:
+ ret.add("%s != 0" % zeroextra.reduce(f))
+ return ", ".join(x for x in ret)
+
+
+def check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require):
+ """Check a set of zero and nonzero requirements, given a set of zero and nonzero assumptions"""
+ assume = assumeLaw + assumeAssert + assumeBranch
+
+ if conflicts(R, assume):
+ # This formula does not apply
+ return None
+
+ describe = describe_extra(R, assumeLaw + assumeBranch, assumeAssert)
+
+ ok, msg = prove_zero(R, require.zero, assume)
+ if not ok:
+ return "FAIL, %s fails (assuming %s)" % (str(msg), describe)
+
+ res, expl = prove_nonzero(R, require.nonzero, assume)
+ if not res:
+ return "FAIL, %s fails (assuming %s)" % (str(expl), describe)
+
+ if describe != "":
+ return "OK (assuming %s)" % describe
+ else:
+ return "OK"
+
+
+def concrete_verify(c):
+ for k in c.zero:
+ if k != 0:
+ return (False, c.zero[k])
+ for k in c.nonzero:
+ if k == 0:
+ return (False, c.nonzero[k])
+ return (True, None)
diff --git a/src/secp256k1/sage/secp256k1.sage b/src/secp256k1/sage/secp256k1.sage
new file mode 100644
index 0000000000..a97e732f7f
--- /dev/null
+++ b/src/secp256k1/sage/secp256k1.sage
@@ -0,0 +1,306 @@
+# Test libsecp256k1' group operation implementations using prover.sage
+
+import sys
+
+load("group_prover.sage")
+load("weierstrass_prover.sage")
+
+def formula_secp256k1_gej_double_var(a):
+ """libsecp256k1's secp256k1_gej_double_var, used by various addition functions"""
+ rz = a.Z * a.Y
+ rz = rz * 2
+ t1 = a.X^2
+ t1 = t1 * 3
+ t2 = t1^2
+ t3 = a.Y^2
+ t3 = t3 * 2
+ t4 = t3^2
+ t4 = t4 * 2
+ t3 = t3 * a.X
+ rx = t3
+ rx = rx * 4
+ rx = -rx
+ rx = rx + t2
+ t2 = -t2
+ t3 = t3 * 6
+ t3 = t3 + t2
+ ry = t1 * t3
+ t2 = -t4
+ ry = ry + t2
+ return jacobianpoint(rx, ry, rz)
+
+def formula_secp256k1_gej_add_var(branch, a, b):
+ """libsecp256k1's secp256k1_gej_add_var"""
+ if branch == 0:
+ return (constraints(), constraints(nonzero={a.Infinity : 'a_infinite'}), b)
+ if branch == 1:
+ return (constraints(), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a)
+ z22 = b.Z^2
+ z12 = a.Z^2
+ u1 = a.X * z22
+ u2 = b.X * z12
+ s1 = a.Y * z22
+ s1 = s1 * b.Z
+ s2 = b.Y * z12
+ s2 = s2 * a.Z
+ h = -u1
+ h = h + u2
+ i = -s1
+ i = i + s2
+ if branch == 2:
+ r = formula_secp256k1_gej_double_var(a)
+ return (constraints(), constraints(zero={h : 'h=0', i : 'i=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}), r)
+ if branch == 3:
+ return (constraints(), constraints(zero={h : 'h=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={i : 'i!=0'}), point_at_infinity())
+ i2 = i^2
+ h2 = h^2
+ h3 = h2 * h
+ h = h * b.Z
+ rz = a.Z * h
+ t = u1 * h2
+ rx = t
+ rx = rx * 2
+ rx = rx + h3
+ rx = -rx
+ rx = rx + i2
+ ry = -rx
+ ry = ry + t
+ ry = ry * i
+ h3 = h3 * s1
+ h3 = -h3
+ ry = ry + h3
+ return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz))
+
+def formula_secp256k1_gej_add_ge_var(branch, a, b):
+ """libsecp256k1's secp256k1_gej_add_ge_var, which assume bz==1"""
+ if branch == 0:
+ return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(nonzero={a.Infinity : 'a_infinite'}), b)
+ if branch == 1:
+ return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a)
+ z12 = a.Z^2
+ u1 = a.X
+ u2 = b.X * z12
+ s1 = a.Y
+ s2 = b.Y * z12
+ s2 = s2 * a.Z
+ h = -u1
+ h = h + u2
+ i = -s1
+ i = i + s2
+ if (branch == 2):
+ r = formula_secp256k1_gej_double_var(a)
+ return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r)
+ if (branch == 3):
+ return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity())
+ i2 = i^2
+ h2 = h^2
+ h3 = h * h2
+ rz = a.Z * h
+ t = u1 * h2
+ rx = t
+ rx = rx * 2
+ rx = rx + h3
+ rx = -rx
+ rx = rx + i2
+ ry = -rx
+ ry = ry + t
+ ry = ry * i
+ h3 = h3 * s1
+ h3 = -h3
+ ry = ry + h3
+ return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz))
+
+def formula_secp256k1_gej_add_zinv_var(branch, a, b):
+ """libsecp256k1's secp256k1_gej_add_zinv_var"""
+ bzinv = b.Z^(-1)
+ if branch == 0:
+ return (constraints(), constraints(nonzero={b.Infinity : 'b_infinite'}), a)
+ if branch == 1:
+ bzinv2 = bzinv^2
+ bzinv3 = bzinv2 * bzinv
+ rx = b.X * bzinv2
+ ry = b.Y * bzinv3
+ rz = 1
+ return (constraints(), constraints(zero={b.Infinity : 'b_finite'}, nonzero={a.Infinity : 'a_infinite'}), jacobianpoint(rx, ry, rz))
+ azz = a.Z * bzinv
+ z12 = azz^2
+ u1 = a.X
+ u2 = b.X * z12
+ s1 = a.Y
+ s2 = b.Y * z12
+ s2 = s2 * azz
+ h = -u1
+ h = h + u2
+ i = -s1
+ i = i + s2
+ if branch == 2:
+ r = formula_secp256k1_gej_double_var(a)
+ return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r)
+ if branch == 3:
+ return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity())
+ i2 = i^2
+ h2 = h^2
+ h3 = h * h2
+ rz = a.Z
+ rz = rz * h
+ t = u1 * h2
+ rx = t
+ rx = rx * 2
+ rx = rx + h3
+ rx = -rx
+ rx = rx + i2
+ ry = -rx
+ ry = ry + t
+ ry = ry * i
+ h3 = h3 * s1
+ h3 = -h3
+ ry = ry + h3
+ return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz))
+
+def formula_secp256k1_gej_add_ge(branch, a, b):
+ """libsecp256k1's secp256k1_gej_add_ge"""
+ zeroes = {}
+ nonzeroes = {}
+ a_infinity = False
+ if (branch & 4) != 0:
+ nonzeroes.update({a.Infinity : 'a_infinite'})
+ a_infinity = True
+ else:
+ zeroes.update({a.Infinity : 'a_finite'})
+ zz = a.Z^2
+ u1 = a.X
+ u2 = b.X * zz
+ s1 = a.Y
+ s2 = b.Y * zz
+ s2 = s2 * a.Z
+ t = u1
+ t = t + u2
+ m = s1
+ m = m + s2
+ rr = t^2
+ m_alt = -u2
+ tt = u1 * m_alt
+ rr = rr + tt
+ degenerate = (branch & 3) == 3
+ if (branch & 1) != 0:
+ zeroes.update({m : 'm_zero'})
+ else:
+ nonzeroes.update({m : 'm_nonzero'})
+ if (branch & 2) != 0:
+ zeroes.update({rr : 'rr_zero'})
+ else:
+ nonzeroes.update({rr : 'rr_nonzero'})
+ rr_alt = s1
+ rr_alt = rr_alt * 2
+ m_alt = m_alt + u1
+ if not degenerate:
+ rr_alt = rr
+ m_alt = m
+ n = m_alt^2
+ q = n * t
+ n = n^2
+ if degenerate:
+ n = m
+ t = rr_alt^2
+ rz = a.Z * m_alt
+ infinity = False
+ if (branch & 8) != 0:
+ if not a_infinity:
+ infinity = True
+ zeroes.update({rz : 'r.z=0'})
+ else:
+ nonzeroes.update({rz : 'r.z!=0'})
+ rz = rz * 2
+ q = -q
+ t = t + q
+ rx = t
+ t = t * 2
+ t = t + q
+ t = t * rr_alt
+ t = t + n
+ ry = -t
+ rx = rx * 4
+ ry = ry * 4
+ if a_infinity:
+ rx = b.X
+ ry = b.Y
+ rz = 1
+ if infinity:
+ return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), point_at_infinity())
+ return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), jacobianpoint(rx, ry, rz))
+
+def formula_secp256k1_gej_add_ge_old(branch, a, b):
+ """libsecp256k1's old secp256k1_gej_add_ge, which fails when ay+by=0 but ax!=bx"""
+ a_infinity = (branch & 1) != 0
+ zero = {}
+ nonzero = {}
+ if a_infinity:
+ nonzero.update({a.Infinity : 'a_infinite'})
+ else:
+ zero.update({a.Infinity : 'a_finite'})
+ zz = a.Z^2
+ u1 = a.X
+ u2 = b.X * zz
+ s1 = a.Y
+ s2 = b.Y * zz
+ s2 = s2 * a.Z
+ z = a.Z
+ t = u1
+ t = t + u2
+ m = s1
+ m = m + s2
+ n = m^2
+ q = n * t
+ n = n^2
+ rr = t^2
+ t = u1 * u2
+ t = -t
+ rr = rr + t
+ t = rr^2
+ rz = m * z
+ infinity = False
+ if (branch & 2) != 0:
+ if not a_infinity:
+ infinity = True
+ else:
+ return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(nonzero={z : 'conflict_a'}, zero={z : 'conflict_b'}), point_at_infinity())
+ zero.update({rz : 'r.z=0'})
+ else:
+ nonzero.update({rz : 'r.z!=0'})
+ rz = rz * (0 if a_infinity else 2)
+ rx = t
+ q = -q
+ rx = rx + q
+ q = q * 3
+ t = t * 2
+ t = t + q
+ t = t * rr
+ t = t + n
+ ry = -t
+ rx = rx * (0 if a_infinity else 4)
+ ry = ry * (0 if a_infinity else 4)
+ t = b.X
+ t = t * (1 if a_infinity else 0)
+ rx = rx + t
+ t = b.Y
+ t = t * (1 if a_infinity else 0)
+ ry = ry + t
+ t = (1 if a_infinity else 0)
+ rz = rz + t
+ if infinity:
+ return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), point_at_infinity())
+ return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), jacobianpoint(rx, ry, rz))
+
+if __name__ == "__main__":
+ check_symbolic_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var)
+ check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var)
+ check_symbolic_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var)
+ check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge)
+ check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old)
+
+ if len(sys.argv) >= 2 and sys.argv[1] == "--exhaustive":
+ check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var, 43)
+ check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var, 43)
+ check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var, 43)
+ check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge, 43)
+ check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old, 43)
diff --git a/src/secp256k1/sage/weierstrass_prover.sage b/src/secp256k1/sage/weierstrass_prover.sage
new file mode 100644
index 0000000000..03ef2ec901
--- /dev/null
+++ b/src/secp256k1/sage/weierstrass_prover.sage
@@ -0,0 +1,264 @@
+# Prover implementation for Weierstrass curves of the form
+# y^2 = x^3 + A * x + B, specifically with a = 0 and b = 7, with group laws
+# operating on affine and Jacobian coordinates, including the point at infinity
+# represented by a 4th variable in coordinates.
+
+load("group_prover.sage")
+
+
+class affinepoint:
+ def __init__(self, x, y, infinity=0):
+ self.x = x
+ self.y = y
+ self.infinity = infinity
+ def __str__(self):
+ return "affinepoint(x=%s,y=%s,inf=%s)" % (self.x, self.y, self.infinity)
+
+
+class jacobianpoint:
+ def __init__(self, x, y, z, infinity=0):
+ self.X = x
+ self.Y = y
+ self.Z = z
+ self.Infinity = infinity
+ def __str__(self):
+ return "jacobianpoint(X=%s,Y=%s,Z=%s,inf=%s)" % (self.X, self.Y, self.Z, self.Infinity)
+
+
+def point_at_infinity():
+ return jacobianpoint(1, 1, 1, 1)
+
+
+def negate(p):
+ if p.__class__ == affinepoint:
+ return affinepoint(p.x, -p.y)
+ if p.__class__ == jacobianpoint:
+ return jacobianpoint(p.X, -p.Y, p.Z)
+ assert(False)
+
+
+def on_weierstrass_curve(A, B, p):
+ """Return a set of zero-expressions for an affine point to be on the curve"""
+ return constraints(zero={p.x^3 + A*p.x + B - p.y^2: 'on_curve'})
+
+
+def tangential_to_weierstrass_curve(A, B, p12, p3):
+ """Return a set of zero-expressions for ((x12,y12),(x3,y3)) to be a line that is tangential to the curve at (x12,y12)"""
+ return constraints(zero={
+ (p12.y - p3.y) * (p12.y * 2) - (p12.x^2 * 3 + A) * (p12.x - p3.x): 'tangential_to_curve'
+ })
+
+
+def colinear(p1, p2, p3):
+ """Return a set of zero-expressions for ((x1,y1),(x2,y2),(x3,y3)) to be collinear"""
+ return constraints(zero={
+ (p1.y - p2.y) * (p1.x - p3.x) - (p1.y - p3.y) * (p1.x - p2.x): 'colinear_1',
+ (p2.y - p3.y) * (p2.x - p1.x) - (p2.y - p1.y) * (p2.x - p3.x): 'colinear_2',
+ (p3.y - p1.y) * (p3.x - p2.x) - (p3.y - p2.y) * (p3.x - p1.x): 'colinear_3'
+ })
+
+
+def good_affine_point(p):
+ return constraints(nonzero={p.x : 'nonzero_x', p.y : 'nonzero_y'})
+
+
+def good_jacobian_point(p):
+ return constraints(nonzero={p.X : 'nonzero_X', p.Y : 'nonzero_Y', p.Z^6 : 'nonzero_Z'})
+
+
+def good_point(p):
+ return constraints(nonzero={p.Z^6 : 'nonzero_X'})
+
+
+def finite(p, *affine_fns):
+ con = good_point(p) + constraints(zero={p.Infinity : 'finite_point'})
+ if p.Z != 0:
+ return con + reduce(lambda a, b: a + b, (f(affinepoint(p.X / p.Z^2, p.Y / p.Z^3)) for f in affine_fns), con)
+ else:
+ return con
+
+def infinite(p):
+ return constraints(nonzero={p.Infinity : 'infinite_point'})
+
+
+def law_jacobian_weierstrass_add(A, B, pa, pb, pA, pB, pC):
+ """Check whether the passed set of coordinates is a valid Jacobian add, given assumptions"""
+ assumeLaw = (good_affine_point(pa) +
+ good_affine_point(pb) +
+ good_jacobian_point(pA) +
+ good_jacobian_point(pB) +
+ on_weierstrass_curve(A, B, pa) +
+ on_weierstrass_curve(A, B, pb) +
+ finite(pA) +
+ finite(pB) +
+ constraints(nonzero={pa.x - pb.x : 'different_x'}))
+ require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) +
+ colinear(pa, pb, negate(pc))))
+ return (assumeLaw, require)
+
+
+def law_jacobian_weierstrass_double(A, B, pa, pb, pA, pB, pC):
+ """Check whether the passed set of coordinates is a valid Jacobian doubling, given assumptions"""
+ assumeLaw = (good_affine_point(pa) +
+ good_affine_point(pb) +
+ good_jacobian_point(pA) +
+ good_jacobian_point(pB) +
+ on_weierstrass_curve(A, B, pa) +
+ on_weierstrass_curve(A, B, pb) +
+ finite(pA) +
+ finite(pB) +
+ constraints(zero={pa.x - pb.x : 'equal_x', pa.y - pb.y : 'equal_y'}))
+ require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) +
+ tangential_to_weierstrass_curve(A, B, pa, negate(pc))))
+ return (assumeLaw, require)
+
+
+def law_jacobian_weierstrass_add_opposites(A, B, pa, pb, pA, pB, pC):
+ assumeLaw = (good_affine_point(pa) +
+ good_affine_point(pb) +
+ good_jacobian_point(pA) +
+ good_jacobian_point(pB) +
+ on_weierstrass_curve(A, B, pa) +
+ on_weierstrass_curve(A, B, pb) +
+ finite(pA) +
+ finite(pB) +
+ constraints(zero={pa.x - pb.x : 'equal_x', pa.y + pb.y : 'opposite_y'}))
+ require = infinite(pC)
+ return (assumeLaw, require)
+
+
+def law_jacobian_weierstrass_add_infinite_a(A, B, pa, pb, pA, pB, pC):
+ assumeLaw = (good_affine_point(pa) +
+ good_affine_point(pb) +
+ good_jacobian_point(pA) +
+ good_jacobian_point(pB) +
+ on_weierstrass_curve(A, B, pb) +
+ infinite(pA) +
+ finite(pB))
+ require = finite(pC, lambda pc: constraints(zero={pc.x - pb.x : 'c.x=b.x', pc.y - pb.y : 'c.y=b.y'}))
+ return (assumeLaw, require)
+
+
+def law_jacobian_weierstrass_add_infinite_b(A, B, pa, pb, pA, pB, pC):
+ assumeLaw = (good_affine_point(pa) +
+ good_affine_point(pb) +
+ good_jacobian_point(pA) +
+ good_jacobian_point(pB) +
+ on_weierstrass_curve(A, B, pa) +
+ infinite(pB) +
+ finite(pA))
+ require = finite(pC, lambda pc: constraints(zero={pc.x - pa.x : 'c.x=a.x', pc.y - pa.y : 'c.y=a.y'}))
+ return (assumeLaw, require)
+
+
+def law_jacobian_weierstrass_add_infinite_ab(A, B, pa, pb, pA, pB, pC):
+ assumeLaw = (good_affine_point(pa) +
+ good_affine_point(pb) +
+ good_jacobian_point(pA) +
+ good_jacobian_point(pB) +
+ infinite(pA) +
+ infinite(pB))
+ require = infinite(pC)
+ return (assumeLaw, require)
+
+
+laws_jacobian_weierstrass = {
+ 'add': law_jacobian_weierstrass_add,
+ 'double': law_jacobian_weierstrass_double,
+ 'add_opposite': law_jacobian_weierstrass_add_opposites,
+ 'add_infinite_a': law_jacobian_weierstrass_add_infinite_a,
+ 'add_infinite_b': law_jacobian_weierstrass_add_infinite_b,
+ 'add_infinite_ab': law_jacobian_weierstrass_add_infinite_ab
+}
+
+
+def check_exhaustive_jacobian_weierstrass(name, A, B, branches, formula, p):
+ """Verify an implementation of addition of Jacobian points on a Weierstrass curve, by executing and validating the result for every possible addition in a prime field"""
+ F = Integers(p)
+ print "Formula %s on Z%i:" % (name, p)
+ points = []
+ for x in xrange(0, p):
+ for y in xrange(0, p):
+ point = affinepoint(F(x), F(y))
+ r, e = concrete_verify(on_weierstrass_curve(A, B, point))
+ if r:
+ points.append(point)
+
+ for za in xrange(1, p):
+ for zb in xrange(1, p):
+ for pa in points:
+ for pb in points:
+ for ia in xrange(2):
+ for ib in xrange(2):
+ pA = jacobianpoint(pa.x * F(za)^2, pa.y * F(za)^3, F(za), ia)
+ pB = jacobianpoint(pb.x * F(zb)^2, pb.y * F(zb)^3, F(zb), ib)
+ for branch in xrange(0, branches):
+ assumeAssert, assumeBranch, pC = formula(branch, pA, pB)
+ pC.X = F(pC.X)
+ pC.Y = F(pC.Y)
+ pC.Z = F(pC.Z)
+ pC.Infinity = F(pC.Infinity)
+ r, e = concrete_verify(assumeAssert + assumeBranch)
+ if r:
+ match = False
+ for key in laws_jacobian_weierstrass:
+ assumeLaw, require = laws_jacobian_weierstrass[key](A, B, pa, pb, pA, pB, pC)
+ r, e = concrete_verify(assumeLaw)
+ if r:
+ if match:
+ print " multiple branches for (%s,%s,%s,%s) + (%s,%s,%s,%s)" % (pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity)
+ else:
+ match = True
+ r, e = concrete_verify(require)
+ if not r:
+ print " failure in branch %i for (%s,%s,%s,%s) + (%s,%s,%s,%s) = (%s,%s,%s,%s): %s" % (branch, pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity, pC.X, pC.Y, pC.Z, pC.Infinity, e)
+ print
+
+
+def check_symbolic_function(R, assumeAssert, assumeBranch, f, A, B, pa, pb, pA, pB, pC):
+ assumeLaw, require = f(A, B, pa, pb, pA, pB, pC)
+ return check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require)
+
+def check_symbolic_jacobian_weierstrass(name, A, B, branches, formula):
+ """Verify an implementation of addition of Jacobian points on a Weierstrass curve symbolically"""
+ R.<ax,bx,ay,by,Az,Bz,Ai,Bi> = PolynomialRing(QQ,8,order='invlex')
+ lift = lambda x: fastfrac(R,x)
+ ax = lift(ax)
+ ay = lift(ay)
+ Az = lift(Az)
+ bx = lift(bx)
+ by = lift(by)
+ Bz = lift(Bz)
+ Ai = lift(Ai)
+ Bi = lift(Bi)
+
+ pa = affinepoint(ax, ay, Ai)
+ pb = affinepoint(bx, by, Bi)
+ pA = jacobianpoint(ax * Az^2, ay * Az^3, Az, Ai)
+ pB = jacobianpoint(bx * Bz^2, by * Bz^3, Bz, Bi)
+
+ res = {}
+
+ for key in laws_jacobian_weierstrass:
+ res[key] = []
+
+ print ("Formula " + name + ":")
+ count = 0
+ for branch in xrange(branches):
+ assumeFormula, assumeBranch, pC = formula(branch, pA, pB)
+ pC.X = lift(pC.X)
+ pC.Y = lift(pC.Y)
+ pC.Z = lift(pC.Z)
+ pC.Infinity = lift(pC.Infinity)
+
+ for key in laws_jacobian_weierstrass:
+ res[key].append((check_symbolic_function(R, assumeFormula, assumeBranch, laws_jacobian_weierstrass[key], A, B, pa, pb, pA, pB, pC), branch))
+
+ for key in res:
+ print " %s:" % key
+ val = res[key]
+ for x in val:
+ if x[0] is not None:
+ print " branch %i: %s" % (x[1], x[0])
+
+ print
diff --git a/src/secp256k1/src/asm/field_10x26_arm.s b/src/secp256k1/src/asm/field_10x26_arm.s
new file mode 100644
index 0000000000..5df561f2fc
--- /dev/null
+++ b/src/secp256k1/src/asm/field_10x26_arm.s
@@ -0,0 +1,919 @@
+@ vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab syntax=armasm:
+/**********************************************************************
+ * Copyright (c) 2014 Wladimir J. van der Laan *
+ * Distributed under the MIT software license, see the accompanying *
+ * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
+ **********************************************************************/
+/*
+ARM implementation of field_10x26 inner loops.
+
+Note:
+
+- To avoid unnecessary loads and make use of available registers, two
+ 'passes' have every time been interleaved, with the odd passes accumulating c' and d'
+ which will be added to c and d respectively in the the even passes
+
+*/
+
+ .syntax unified
+ .arch armv7-a
+ @ eabi attributes - see readelf -A
+ .eabi_attribute 8, 1 @ Tag_ARM_ISA_use = yes
+ .eabi_attribute 9, 0 @ Tag_Thumb_ISA_use = no
+ .eabi_attribute 10, 0 @ Tag_FP_arch = none
+ .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte
+ .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP
+ .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Agressive Speed
+ .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6
+ .text
+
+ @ Field constants
+ .set field_R0, 0x3d10
+ .set field_R1, 0x400
+ .set field_not_M, 0xfc000000 @ ~M = ~0x3ffffff
+
+ .align 2
+ .global secp256k1_fe_mul_inner
+ .type secp256k1_fe_mul_inner, %function
+ @ Arguments:
+ @ r0 r Restrict: can overlap with a, not with b
+ @ r1 a
+ @ r2 b
+ @ Stack (total 4+10*4 = 44)
+ @ sp + #0 saved 'r' pointer
+ @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9
+secp256k1_fe_mul_inner:
+ stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14}
+ sub sp, sp, #48 @ frame=44 + alignment
+ str r0, [sp, #0] @ save result address, we need it only at the end
+
+ /******************************************
+ * Main computation code.
+ ******************************************
+
+ Allocation:
+ r0,r14,r7,r8 scratch
+ r1 a (pointer)
+ r2 b (pointer)
+ r3:r4 c
+ r5:r6 d
+ r11:r12 c'
+ r9:r10 d'
+
+ Note: do not write to r[] here, it may overlap with a[]
+ */
+
+ /* A - interleaved with B */
+ ldr r7, [r1, #0*4] @ a[0]
+ ldr r8, [r2, #9*4] @ b[9]
+ ldr r0, [r1, #1*4] @ a[1]
+ umull r5, r6, r7, r8 @ d = a[0] * b[9]
+ ldr r14, [r2, #8*4] @ b[8]
+ umull r9, r10, r0, r8 @ d' = a[1] * b[9]
+ ldr r7, [r1, #2*4] @ a[2]
+ umlal r5, r6, r0, r14 @ d += a[1] * b[8]
+ ldr r8, [r2, #7*4] @ b[7]
+ umlal r9, r10, r7, r14 @ d' += a[2] * b[8]
+ ldr r0, [r1, #3*4] @ a[3]
+ umlal r5, r6, r7, r8 @ d += a[2] * b[7]
+ ldr r14, [r2, #6*4] @ b[6]
+ umlal r9, r10, r0, r8 @ d' += a[3] * b[7]
+ ldr r7, [r1, #4*4] @ a[4]
+ umlal r5, r6, r0, r14 @ d += a[3] * b[6]
+ ldr r8, [r2, #5*4] @ b[5]
+ umlal r9, r10, r7, r14 @ d' += a[4] * b[6]
+ ldr r0, [r1, #5*4] @ a[5]
+ umlal r5, r6, r7, r8 @ d += a[4] * b[5]
+ ldr r14, [r2, #4*4] @ b[4]
+ umlal r9, r10, r0, r8 @ d' += a[5] * b[5]
+ ldr r7, [r1, #6*4] @ a[6]
+ umlal r5, r6, r0, r14 @ d += a[5] * b[4]
+ ldr r8, [r2, #3*4] @ b[3]
+ umlal r9, r10, r7, r14 @ d' += a[6] * b[4]
+ ldr r0, [r1, #7*4] @ a[7]
+ umlal r5, r6, r7, r8 @ d += a[6] * b[3]
+ ldr r14, [r2, #2*4] @ b[2]
+ umlal r9, r10, r0, r8 @ d' += a[7] * b[3]
+ ldr r7, [r1, #8*4] @ a[8]
+ umlal r5, r6, r0, r14 @ d += a[7] * b[2]
+ ldr r8, [r2, #1*4] @ b[1]
+ umlal r9, r10, r7, r14 @ d' += a[8] * b[2]
+ ldr r0, [r1, #9*4] @ a[9]
+ umlal r5, r6, r7, r8 @ d += a[8] * b[1]
+ ldr r14, [r2, #0*4] @ b[0]
+ umlal r9, r10, r0, r8 @ d' += a[9] * b[1]
+ ldr r7, [r1, #0*4] @ a[0]
+ umlal r5, r6, r0, r14 @ d += a[9] * b[0]
+ @ r7,r14 used in B
+
+ bic r0, r5, field_not_M @ t9 = d & M
+ str r0, [sp, #4 + 4*9]
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+
+ /* B */
+ umull r3, r4, r7, r14 @ c = a[0] * b[0]
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u0 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u0 * R0
+ umlal r3, r4, r0, r14
+
+ bic r14, r3, field_not_M @ t0 = c & M
+ str r14, [sp, #4 + 0*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u0 * R1
+ umlal r3, r4, r0, r14
+
+ /* C - interleaved with D */
+ ldr r7, [r1, #0*4] @ a[0]
+ ldr r8, [r2, #2*4] @ b[2]
+ ldr r14, [r2, #1*4] @ b[1]
+ umull r11, r12, r7, r8 @ c' = a[0] * b[2]
+ ldr r0, [r1, #1*4] @ a[1]
+ umlal r3, r4, r7, r14 @ c += a[0] * b[1]
+ ldr r8, [r2, #0*4] @ b[0]
+ umlal r11, r12, r0, r14 @ c' += a[1] * b[1]
+ ldr r7, [r1, #2*4] @ a[2]
+ umlal r3, r4, r0, r8 @ c += a[1] * b[0]
+ ldr r14, [r2, #9*4] @ b[9]
+ umlal r11, r12, r7, r8 @ c' += a[2] * b[0]
+ ldr r0, [r1, #3*4] @ a[3]
+ umlal r5, r6, r7, r14 @ d += a[2] * b[9]
+ ldr r8, [r2, #8*4] @ b[8]
+ umull r9, r10, r0, r14 @ d' = a[3] * b[9]
+ ldr r7, [r1, #4*4] @ a[4]
+ umlal r5, r6, r0, r8 @ d += a[3] * b[8]
+ ldr r14, [r2, #7*4] @ b[7]
+ umlal r9, r10, r7, r8 @ d' += a[4] * b[8]
+ ldr r0, [r1, #5*4] @ a[5]
+ umlal r5, r6, r7, r14 @ d += a[4] * b[7]
+ ldr r8, [r2, #6*4] @ b[6]
+ umlal r9, r10, r0, r14 @ d' += a[5] * b[7]
+ ldr r7, [r1, #6*4] @ a[6]
+ umlal r5, r6, r0, r8 @ d += a[5] * b[6]
+ ldr r14, [r2, #5*4] @ b[5]
+ umlal r9, r10, r7, r8 @ d' += a[6] * b[6]
+ ldr r0, [r1, #7*4] @ a[7]
+ umlal r5, r6, r7, r14 @ d += a[6] * b[5]
+ ldr r8, [r2, #4*4] @ b[4]
+ umlal r9, r10, r0, r14 @ d' += a[7] * b[5]
+ ldr r7, [r1, #8*4] @ a[8]
+ umlal r5, r6, r0, r8 @ d += a[7] * b[4]
+ ldr r14, [r2, #3*4] @ b[3]
+ umlal r9, r10, r7, r8 @ d' += a[8] * b[4]
+ ldr r0, [r1, #9*4] @ a[9]
+ umlal r5, r6, r7, r14 @ d += a[8] * b[3]
+ ldr r8, [r2, #2*4] @ b[2]
+ umlal r9, r10, r0, r14 @ d' += a[9] * b[3]
+ umlal r5, r6, r0, r8 @ d += a[9] * b[2]
+
+ bic r0, r5, field_not_M @ u1 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u1 * R0
+ umlal r3, r4, r0, r14
+
+ bic r14, r3, field_not_M @ t1 = c & M
+ str r14, [sp, #4 + 1*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u1 * R1
+ umlal r3, r4, r0, r14
+
+ /* D */
+ adds r3, r3, r11 @ c += c'
+ adc r4, r4, r12
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u2 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u2 * R0
+ umlal r3, r4, r0, r14
+
+ bic r14, r3, field_not_M @ t2 = c & M
+ str r14, [sp, #4 + 2*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u2 * R1
+ umlal r3, r4, r0, r14
+
+ /* E - interleaved with F */
+ ldr r7, [r1, #0*4] @ a[0]
+ ldr r8, [r2, #4*4] @ b[4]
+ umull r11, r12, r7, r8 @ c' = a[0] * b[4]
+ ldr r8, [r2, #3*4] @ b[3]
+ umlal r3, r4, r7, r8 @ c += a[0] * b[3]
+ ldr r7, [r1, #1*4] @ a[1]
+ umlal r11, r12, r7, r8 @ c' += a[1] * b[3]
+ ldr r8, [r2, #2*4] @ b[2]
+ umlal r3, r4, r7, r8 @ c += a[1] * b[2]
+ ldr r7, [r1, #2*4] @ a[2]
+ umlal r11, r12, r7, r8 @ c' += a[2] * b[2]
+ ldr r8, [r2, #1*4] @ b[1]
+ umlal r3, r4, r7, r8 @ c += a[2] * b[1]
+ ldr r7, [r1, #3*4] @ a[3]
+ umlal r11, r12, r7, r8 @ c' += a[3] * b[1]
+ ldr r8, [r2, #0*4] @ b[0]
+ umlal r3, r4, r7, r8 @ c += a[3] * b[0]
+ ldr r7, [r1, #4*4] @ a[4]
+ umlal r11, r12, r7, r8 @ c' += a[4] * b[0]
+ ldr r8, [r2, #9*4] @ b[9]
+ umlal r5, r6, r7, r8 @ d += a[4] * b[9]
+ ldr r7, [r1, #5*4] @ a[5]
+ umull r9, r10, r7, r8 @ d' = a[5] * b[9]
+ ldr r8, [r2, #8*4] @ b[8]
+ umlal r5, r6, r7, r8 @ d += a[5] * b[8]
+ ldr r7, [r1, #6*4] @ a[6]
+ umlal r9, r10, r7, r8 @ d' += a[6] * b[8]
+ ldr r8, [r2, #7*4] @ b[7]
+ umlal r5, r6, r7, r8 @ d += a[6] * b[7]
+ ldr r7, [r1, #7*4] @ a[7]
+ umlal r9, r10, r7, r8 @ d' += a[7] * b[7]
+ ldr r8, [r2, #6*4] @ b[6]
+ umlal r5, r6, r7, r8 @ d += a[7] * b[6]
+ ldr r7, [r1, #8*4] @ a[8]
+ umlal r9, r10, r7, r8 @ d' += a[8] * b[6]
+ ldr r8, [r2, #5*4] @ b[5]
+ umlal r5, r6, r7, r8 @ d += a[8] * b[5]
+ ldr r7, [r1, #9*4] @ a[9]
+ umlal r9, r10, r7, r8 @ d' += a[9] * b[5]
+ ldr r8, [r2, #4*4] @ b[4]
+ umlal r5, r6, r7, r8 @ d += a[9] * b[4]
+
+ bic r0, r5, field_not_M @ u3 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u3 * R0
+ umlal r3, r4, r0, r14
+
+ bic r14, r3, field_not_M @ t3 = c & M
+ str r14, [sp, #4 + 3*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u3 * R1
+ umlal r3, r4, r0, r14
+
+ /* F */
+ adds r3, r3, r11 @ c += c'
+ adc r4, r4, r12
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u4 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u4 * R0
+ umlal r3, r4, r0, r14
+
+ bic r14, r3, field_not_M @ t4 = c & M
+ str r14, [sp, #4 + 4*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u4 * R1
+ umlal r3, r4, r0, r14
+
+ /* G - interleaved with H */
+ ldr r7, [r1, #0*4] @ a[0]
+ ldr r8, [r2, #6*4] @ b[6]
+ ldr r14, [r2, #5*4] @ b[5]
+ umull r11, r12, r7, r8 @ c' = a[0] * b[6]
+ ldr r0, [r1, #1*4] @ a[1]
+ umlal r3, r4, r7, r14 @ c += a[0] * b[5]
+ ldr r8, [r2, #4*4] @ b[4]
+ umlal r11, r12, r0, r14 @ c' += a[1] * b[5]
+ ldr r7, [r1, #2*4] @ a[2]
+ umlal r3, r4, r0, r8 @ c += a[1] * b[4]
+ ldr r14, [r2, #3*4] @ b[3]
+ umlal r11, r12, r7, r8 @ c' += a[2] * b[4]
+ ldr r0, [r1, #3*4] @ a[3]
+ umlal r3, r4, r7, r14 @ c += a[2] * b[3]
+ ldr r8, [r2, #2*4] @ b[2]
+ umlal r11, r12, r0, r14 @ c' += a[3] * b[3]
+ ldr r7, [r1, #4*4] @ a[4]
+ umlal r3, r4, r0, r8 @ c += a[3] * b[2]
+ ldr r14, [r2, #1*4] @ b[1]
+ umlal r11, r12, r7, r8 @ c' += a[4] * b[2]
+ ldr r0, [r1, #5*4] @ a[5]
+ umlal r3, r4, r7, r14 @ c += a[4] * b[1]
+ ldr r8, [r2, #0*4] @ b[0]
+ umlal r11, r12, r0, r14 @ c' += a[5] * b[1]
+ ldr r7, [r1, #6*4] @ a[6]
+ umlal r3, r4, r0, r8 @ c += a[5] * b[0]
+ ldr r14, [r2, #9*4] @ b[9]
+ umlal r11, r12, r7, r8 @ c' += a[6] * b[0]
+ ldr r0, [r1, #7*4] @ a[7]
+ umlal r5, r6, r7, r14 @ d += a[6] * b[9]
+ ldr r8, [r2, #8*4] @ b[8]
+ umull r9, r10, r0, r14 @ d' = a[7] * b[9]
+ ldr r7, [r1, #8*4] @ a[8]
+ umlal r5, r6, r0, r8 @ d += a[7] * b[8]
+ ldr r14, [r2, #7*4] @ b[7]
+ umlal r9, r10, r7, r8 @ d' += a[8] * b[8]
+ ldr r0, [r1, #9*4] @ a[9]
+ umlal r5, r6, r7, r14 @ d += a[8] * b[7]
+ ldr r8, [r2, #6*4] @ b[6]
+ umlal r9, r10, r0, r14 @ d' += a[9] * b[7]
+ umlal r5, r6, r0, r8 @ d += a[9] * b[6]
+
+ bic r0, r5, field_not_M @ u5 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u5 * R0
+ umlal r3, r4, r0, r14
+
+ bic r14, r3, field_not_M @ t5 = c & M
+ str r14, [sp, #4 + 5*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u5 * R1
+ umlal r3, r4, r0, r14
+
+ /* H */
+ adds r3, r3, r11 @ c += c'
+ adc r4, r4, r12
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u6 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u6 * R0
+ umlal r3, r4, r0, r14
+
+ bic r14, r3, field_not_M @ t6 = c & M
+ str r14, [sp, #4 + 6*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u6 * R1
+ umlal r3, r4, r0, r14
+
+ /* I - interleaved with J */
+ ldr r8, [r2, #8*4] @ b[8]
+ ldr r7, [r1, #0*4] @ a[0]
+ ldr r14, [r2, #7*4] @ b[7]
+ umull r11, r12, r7, r8 @ c' = a[0] * b[8]
+ ldr r0, [r1, #1*4] @ a[1]
+ umlal r3, r4, r7, r14 @ c += a[0] * b[7]
+ ldr r8, [r2, #6*4] @ b[6]
+ umlal r11, r12, r0, r14 @ c' += a[1] * b[7]
+ ldr r7, [r1, #2*4] @ a[2]
+ umlal r3, r4, r0, r8 @ c += a[1] * b[6]
+ ldr r14, [r2, #5*4] @ b[5]
+ umlal r11, r12, r7, r8 @ c' += a[2] * b[6]
+ ldr r0, [r1, #3*4] @ a[3]
+ umlal r3, r4, r7, r14 @ c += a[2] * b[5]
+ ldr r8, [r2, #4*4] @ b[4]
+ umlal r11, r12, r0, r14 @ c' += a[3] * b[5]
+ ldr r7, [r1, #4*4] @ a[4]
+ umlal r3, r4, r0, r8 @ c += a[3] * b[4]
+ ldr r14, [r2, #3*4] @ b[3]
+ umlal r11, r12, r7, r8 @ c' += a[4] * b[4]
+ ldr r0, [r1, #5*4] @ a[5]
+ umlal r3, r4, r7, r14 @ c += a[4] * b[3]
+ ldr r8, [r2, #2*4] @ b[2]
+ umlal r11, r12, r0, r14 @ c' += a[5] * b[3]
+ ldr r7, [r1, #6*4] @ a[6]
+ umlal r3, r4, r0, r8 @ c += a[5] * b[2]
+ ldr r14, [r2, #1*4] @ b[1]
+ umlal r11, r12, r7, r8 @ c' += a[6] * b[2]
+ ldr r0, [r1, #7*4] @ a[7]
+ umlal r3, r4, r7, r14 @ c += a[6] * b[1]
+ ldr r8, [r2, #0*4] @ b[0]
+ umlal r11, r12, r0, r14 @ c' += a[7] * b[1]
+ ldr r7, [r1, #8*4] @ a[8]
+ umlal r3, r4, r0, r8 @ c += a[7] * b[0]
+ ldr r14, [r2, #9*4] @ b[9]
+ umlal r11, r12, r7, r8 @ c' += a[8] * b[0]
+ ldr r0, [r1, #9*4] @ a[9]
+ umlal r5, r6, r7, r14 @ d += a[8] * b[9]
+ ldr r8, [r2, #8*4] @ b[8]
+ umull r9, r10, r0, r14 @ d' = a[9] * b[9]
+ umlal r5, r6, r0, r8 @ d += a[9] * b[8]
+
+ bic r0, r5, field_not_M @ u7 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u7 * R0
+ umlal r3, r4, r0, r14
+
+ bic r14, r3, field_not_M @ t7 = c & M
+ str r14, [sp, #4 + 7*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u7 * R1
+ umlal r3, r4, r0, r14
+
+ /* J */
+ adds r3, r3, r11 @ c += c'
+ adc r4, r4, r12
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u8 = d & M
+ str r0, [sp, #4 + 8*4]
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u8 * R0
+ umlal r3, r4, r0, r14
+
+ /******************************************
+ * compute and write back result
+ ******************************************
+ Allocation:
+ r0 r
+ r3:r4 c
+ r5:r6 d
+ r7 t0
+ r8 t1
+ r9 t2
+ r11 u8
+ r12 t9
+ r1,r2,r10,r14 scratch
+
+ Note: do not read from a[] after here, it may overlap with r[]
+ */
+ ldr r0, [sp, #0]
+ add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9
+ ldmia r1, {r2,r7,r8,r9,r10,r11,r12}
+ add r1, r0, #3*4
+ stmia r1, {r2,r7,r8,r9,r10}
+
+ bic r2, r3, field_not_M @ r[8] = c & M
+ str r2, [r0, #8*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u8 * R1
+ umlal r3, r4, r11, r14
+ movw r14, field_R0 @ c += d * R0
+ umlal r3, r4, r5, r14
+ adds r3, r3, r12 @ c += t9
+ adc r4, r4, #0
+
+ add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2
+ ldmia r1, {r7,r8,r9}
+
+ ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4)
+ str r2, [r0, #9*4]
+ mov r3, r3, lsr #22 @ c >>= 22
+ orr r3, r3, r4, asl #10
+ mov r4, r4, lsr #22
+ movw r14, field_R1 << 4 @ c += d * (R1 << 4)
+ umlal r3, r4, r5, r14
+
+ movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add)
+ umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4)
+ adds r5, r5, r7 @ d.lo += t0
+ mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4)
+ adc r6, r6, 0 @ d.hi += carry
+
+ bic r2, r5, field_not_M @ r[0] = d & M
+ str r2, [r0, #0*4]
+
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+
+ movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add)
+ umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4)
+ adds r5, r5, r8 @ d.lo += t1
+ adc r6, r6, #0 @ d.hi += carry
+ adds r5, r5, r1 @ d.lo += tmp.lo
+ mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4)
+ adc r6, r6, r2 @ d.hi += carry + tmp.hi
+
+ bic r2, r5, field_not_M @ r[1] = d & M
+ str r2, [r0, #1*4]
+ mov r5, r5, lsr #26 @ d >>= 26 (ignore hi)
+ orr r5, r5, r6, asl #6
+
+ add r5, r5, r9 @ d += t2
+ str r5, [r0, #2*4] @ r[2] = d
+
+ add sp, sp, #48
+ ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+ .size secp256k1_fe_mul_inner, .-secp256k1_fe_mul_inner
+
+ .align 2
+ .global secp256k1_fe_sqr_inner
+ .type secp256k1_fe_sqr_inner, %function
+ @ Arguments:
+ @ r0 r Can overlap with a
+ @ r1 a
+ @ Stack (total 4+10*4 = 44)
+ @ sp + #0 saved 'r' pointer
+ @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9
+secp256k1_fe_sqr_inner:
+ stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14}
+ sub sp, sp, #48 @ frame=44 + alignment
+ str r0, [sp, #0] @ save result address, we need it only at the end
+ /******************************************
+ * Main computation code.
+ ******************************************
+
+ Allocation:
+ r0,r14,r2,r7,r8 scratch
+ r1 a (pointer)
+ r3:r4 c
+ r5:r6 d
+ r11:r12 c'
+ r9:r10 d'
+
+ Note: do not write to r[] here, it may overlap with a[]
+ */
+ /* A interleaved with B */
+ ldr r0, [r1, #1*4] @ a[1]*2
+ ldr r7, [r1, #0*4] @ a[0]
+ mov r0, r0, asl #1
+ ldr r14, [r1, #9*4] @ a[9]
+ umull r3, r4, r7, r7 @ c = a[0] * a[0]
+ ldr r8, [r1, #8*4] @ a[8]
+ mov r7, r7, asl #1
+ umull r5, r6, r7, r14 @ d = a[0]*2 * a[9]
+ ldr r7, [r1, #2*4] @ a[2]*2
+ umull r9, r10, r0, r14 @ d' = a[1]*2 * a[9]
+ ldr r14, [r1, #7*4] @ a[7]
+ umlal r5, r6, r0, r8 @ d += a[1]*2 * a[8]
+ mov r7, r7, asl #1
+ ldr r0, [r1, #3*4] @ a[3]*2
+ umlal r9, r10, r7, r8 @ d' += a[2]*2 * a[8]
+ ldr r8, [r1, #6*4] @ a[6]
+ umlal r5, r6, r7, r14 @ d += a[2]*2 * a[7]
+ mov r0, r0, asl #1
+ ldr r7, [r1, #4*4] @ a[4]*2
+ umlal r9, r10, r0, r14 @ d' += a[3]*2 * a[7]
+ ldr r14, [r1, #5*4] @ a[5]
+ mov r7, r7, asl #1
+ umlal r5, r6, r0, r8 @ d += a[3]*2 * a[6]
+ umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[6]
+ umlal r5, r6, r7, r14 @ d += a[4]*2 * a[5]
+ umlal r9, r10, r14, r14 @ d' += a[5] * a[5]
+
+ bic r0, r5, field_not_M @ t9 = d & M
+ str r0, [sp, #4 + 9*4]
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+
+ /* B */
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u0 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u0 * R0
+ umlal r3, r4, r0, r14
+ bic r14, r3, field_not_M @ t0 = c & M
+ str r14, [sp, #4 + 0*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u0 * R1
+ umlal r3, r4, r0, r14
+
+ /* C interleaved with D */
+ ldr r0, [r1, #0*4] @ a[0]*2
+ ldr r14, [r1, #1*4] @ a[1]
+ mov r0, r0, asl #1
+ ldr r8, [r1, #2*4] @ a[2]
+ umlal r3, r4, r0, r14 @ c += a[0]*2 * a[1]
+ mov r7, r8, asl #1 @ a[2]*2
+ umull r11, r12, r14, r14 @ c' = a[1] * a[1]
+ ldr r14, [r1, #9*4] @ a[9]
+ umlal r11, r12, r0, r8 @ c' += a[0]*2 * a[2]
+ ldr r0, [r1, #3*4] @ a[3]*2
+ ldr r8, [r1, #8*4] @ a[8]
+ umlal r5, r6, r7, r14 @ d += a[2]*2 * a[9]
+ mov r0, r0, asl #1
+ ldr r7, [r1, #4*4] @ a[4]*2
+ umull r9, r10, r0, r14 @ d' = a[3]*2 * a[9]
+ ldr r14, [r1, #7*4] @ a[7]
+ umlal r5, r6, r0, r8 @ d += a[3]*2 * a[8]
+ mov r7, r7, asl #1
+ ldr r0, [r1, #5*4] @ a[5]*2
+ umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[8]
+ ldr r8, [r1, #6*4] @ a[6]
+ mov r0, r0, asl #1
+ umlal r5, r6, r7, r14 @ d += a[4]*2 * a[7]
+ umlal r9, r10, r0, r14 @ d' += a[5]*2 * a[7]
+ umlal r5, r6, r0, r8 @ d += a[5]*2 * a[6]
+ umlal r9, r10, r8, r8 @ d' += a[6] * a[6]
+
+ bic r0, r5, field_not_M @ u1 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u1 * R0
+ umlal r3, r4, r0, r14
+ bic r14, r3, field_not_M @ t1 = c & M
+ str r14, [sp, #4 + 1*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u1 * R1
+ umlal r3, r4, r0, r14
+
+ /* D */
+ adds r3, r3, r11 @ c += c'
+ adc r4, r4, r12
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u2 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u2 * R0
+ umlal r3, r4, r0, r14
+ bic r14, r3, field_not_M @ t2 = c & M
+ str r14, [sp, #4 + 2*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u2 * R1
+ umlal r3, r4, r0, r14
+
+ /* E interleaved with F */
+ ldr r7, [r1, #0*4] @ a[0]*2
+ ldr r0, [r1, #1*4] @ a[1]*2
+ ldr r14, [r1, #2*4] @ a[2]
+ mov r7, r7, asl #1
+ ldr r8, [r1, #3*4] @ a[3]
+ ldr r2, [r1, #4*4]
+ umlal r3, r4, r7, r8 @ c += a[0]*2 * a[3]
+ mov r0, r0, asl #1
+ umull r11, r12, r7, r2 @ c' = a[0]*2 * a[4]
+ mov r2, r2, asl #1 @ a[4]*2
+ umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[3]
+ ldr r8, [r1, #9*4] @ a[9]
+ umlal r3, r4, r0, r14 @ c += a[1]*2 * a[2]
+ ldr r0, [r1, #5*4] @ a[5]*2
+ umlal r11, r12, r14, r14 @ c' += a[2] * a[2]
+ ldr r14, [r1, #8*4] @ a[8]
+ mov r0, r0, asl #1
+ umlal r5, r6, r2, r8 @ d += a[4]*2 * a[9]
+ ldr r7, [r1, #6*4] @ a[6]*2
+ umull r9, r10, r0, r8 @ d' = a[5]*2 * a[9]
+ mov r7, r7, asl #1
+ ldr r8, [r1, #7*4] @ a[7]
+ umlal r5, r6, r0, r14 @ d += a[5]*2 * a[8]
+ umlal r9, r10, r7, r14 @ d' += a[6]*2 * a[8]
+ umlal r5, r6, r7, r8 @ d += a[6]*2 * a[7]
+ umlal r9, r10, r8, r8 @ d' += a[7] * a[7]
+
+ bic r0, r5, field_not_M @ u3 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u3 * R0
+ umlal r3, r4, r0, r14
+ bic r14, r3, field_not_M @ t3 = c & M
+ str r14, [sp, #4 + 3*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u3 * R1
+ umlal r3, r4, r0, r14
+
+ /* F */
+ adds r3, r3, r11 @ c += c'
+ adc r4, r4, r12
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u4 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u4 * R0
+ umlal r3, r4, r0, r14
+ bic r14, r3, field_not_M @ t4 = c & M
+ str r14, [sp, #4 + 4*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u4 * R1
+ umlal r3, r4, r0, r14
+
+ /* G interleaved with H */
+ ldr r7, [r1, #0*4] @ a[0]*2
+ ldr r0, [r1, #1*4] @ a[1]*2
+ mov r7, r7, asl #1
+ ldr r8, [r1, #5*4] @ a[5]
+ ldr r2, [r1, #6*4] @ a[6]
+ umlal r3, r4, r7, r8 @ c += a[0]*2 * a[5]
+ ldr r14, [r1, #4*4] @ a[4]
+ mov r0, r0, asl #1
+ umull r11, r12, r7, r2 @ c' = a[0]*2 * a[6]
+ ldr r7, [r1, #2*4] @ a[2]*2
+ umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[5]
+ mov r7, r7, asl #1
+ ldr r8, [r1, #3*4] @ a[3]
+ umlal r3, r4, r0, r14 @ c += a[1]*2 * a[4]
+ mov r0, r2, asl #1 @ a[6]*2
+ umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[4]
+ ldr r14, [r1, #9*4] @ a[9]
+ umlal r3, r4, r7, r8 @ c += a[2]*2 * a[3]
+ ldr r7, [r1, #7*4] @ a[7]*2
+ umlal r11, r12, r8, r8 @ c' += a[3] * a[3]
+ mov r7, r7, asl #1
+ ldr r8, [r1, #8*4] @ a[8]
+ umlal r5, r6, r0, r14 @ d += a[6]*2 * a[9]
+ umull r9, r10, r7, r14 @ d' = a[7]*2 * a[9]
+ umlal r5, r6, r7, r8 @ d += a[7]*2 * a[8]
+ umlal r9, r10, r8, r8 @ d' += a[8] * a[8]
+
+ bic r0, r5, field_not_M @ u5 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u5 * R0
+ umlal r3, r4, r0, r14
+ bic r14, r3, field_not_M @ t5 = c & M
+ str r14, [sp, #4 + 5*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u5 * R1
+ umlal r3, r4, r0, r14
+
+ /* H */
+ adds r3, r3, r11 @ c += c'
+ adc r4, r4, r12
+ adds r5, r5, r9 @ d += d'
+ adc r6, r6, r10
+
+ bic r0, r5, field_not_M @ u6 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u6 * R0
+ umlal r3, r4, r0, r14
+ bic r14, r3, field_not_M @ t6 = c & M
+ str r14, [sp, #4 + 6*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u6 * R1
+ umlal r3, r4, r0, r14
+
+ /* I interleaved with J */
+ ldr r7, [r1, #0*4] @ a[0]*2
+ ldr r0, [r1, #1*4] @ a[1]*2
+ mov r7, r7, asl #1
+ ldr r8, [r1, #7*4] @ a[7]
+ ldr r2, [r1, #8*4] @ a[8]
+ umlal r3, r4, r7, r8 @ c += a[0]*2 * a[7]
+ ldr r14, [r1, #6*4] @ a[6]
+ mov r0, r0, asl #1
+ umull r11, r12, r7, r2 @ c' = a[0]*2 * a[8]
+ ldr r7, [r1, #2*4] @ a[2]*2
+ umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[7]
+ ldr r8, [r1, #5*4] @ a[5]
+ umlal r3, r4, r0, r14 @ c += a[1]*2 * a[6]
+ ldr r0, [r1, #3*4] @ a[3]*2
+ mov r7, r7, asl #1
+ umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[6]
+ ldr r14, [r1, #4*4] @ a[4]
+ mov r0, r0, asl #1
+ umlal r3, r4, r7, r8 @ c += a[2]*2 * a[5]
+ mov r2, r2, asl #1 @ a[8]*2
+ umlal r11, r12, r0, r8 @ c' += a[3]*2 * a[5]
+ umlal r3, r4, r0, r14 @ c += a[3]*2 * a[4]
+ umlal r11, r12, r14, r14 @ c' += a[4] * a[4]
+ ldr r8, [r1, #9*4] @ a[9]
+ umlal r5, r6, r2, r8 @ d += a[8]*2 * a[9]
+ @ r8 will be used in J
+
+ bic r0, r5, field_not_M @ u7 = d & M
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u7 * R0
+ umlal r3, r4, r0, r14
+ bic r14, r3, field_not_M @ t7 = c & M
+ str r14, [sp, #4 + 7*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u7 * R1
+ umlal r3, r4, r0, r14
+
+ /* J */
+ adds r3, r3, r11 @ c += c'
+ adc r4, r4, r12
+ umlal r5, r6, r8, r8 @ d += a[9] * a[9]
+
+ bic r0, r5, field_not_M @ u8 = d & M
+ str r0, [sp, #4 + 8*4]
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+ movw r14, field_R0 @ c += u8 * R0
+ umlal r3, r4, r0, r14
+
+ /******************************************
+ * compute and write back result
+ ******************************************
+ Allocation:
+ r0 r
+ r3:r4 c
+ r5:r6 d
+ r7 t0
+ r8 t1
+ r9 t2
+ r11 u8
+ r12 t9
+ r1,r2,r10,r14 scratch
+
+ Note: do not read from a[] after here, it may overlap with r[]
+ */
+ ldr r0, [sp, #0]
+ add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9
+ ldmia r1, {r2,r7,r8,r9,r10,r11,r12}
+ add r1, r0, #3*4
+ stmia r1, {r2,r7,r8,r9,r10}
+
+ bic r2, r3, field_not_M @ r[8] = c & M
+ str r2, [r0, #8*4]
+ mov r3, r3, lsr #26 @ c >>= 26
+ orr r3, r3, r4, asl #6
+ mov r4, r4, lsr #26
+ mov r14, field_R1 @ c += u8 * R1
+ umlal r3, r4, r11, r14
+ movw r14, field_R0 @ c += d * R0
+ umlal r3, r4, r5, r14
+ adds r3, r3, r12 @ c += t9
+ adc r4, r4, #0
+
+ add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2
+ ldmia r1, {r7,r8,r9}
+
+ ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4)
+ str r2, [r0, #9*4]
+ mov r3, r3, lsr #22 @ c >>= 22
+ orr r3, r3, r4, asl #10
+ mov r4, r4, lsr #22
+ movw r14, field_R1 << 4 @ c += d * (R1 << 4)
+ umlal r3, r4, r5, r14
+
+ movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add)
+ umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4)
+ adds r5, r5, r7 @ d.lo += t0
+ mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4)
+ adc r6, r6, 0 @ d.hi += carry
+
+ bic r2, r5, field_not_M @ r[0] = d & M
+ str r2, [r0, #0*4]
+
+ mov r5, r5, lsr #26 @ d >>= 26
+ orr r5, r5, r6, asl #6
+ mov r6, r6, lsr #26
+
+ movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add)
+ umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4)
+ adds r5, r5, r8 @ d.lo += t1
+ adc r6, r6, #0 @ d.hi += carry
+ adds r5, r5, r1 @ d.lo += tmp.lo
+ mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4)
+ adc r6, r6, r2 @ d.hi += carry + tmp.hi
+
+ bic r2, r5, field_not_M @ r[1] = d & M
+ str r2, [r0, #1*4]
+ mov r5, r5, lsr #26 @ d >>= 26 (ignore hi)
+ orr r5, r5, r6, asl #6
+
+ add r5, r5, r9 @ d += t2
+ str r5, [r0, #2*4] @ r[2] = d
+
+ add sp, sp, #48
+ ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+ .size secp256k1_fe_sqr_inner, .-secp256k1_fe_sqr_inner
+
diff --git a/src/secp256k1/src/bench_ecdh.c b/src/secp256k1/src/bench_ecdh.c
index 5a7c6376e0..cde5e2dbb4 100644
--- a/src/secp256k1/src/bench_ecdh.c
+++ b/src/secp256k1/src/bench_ecdh.c
@@ -28,7 +28,8 @@ static void bench_ecdh_setup(void* arg) {
0xa2, 0xba, 0xd1, 0x84, 0xf8, 0x83, 0xc6, 0x9f
};
- data->ctx = secp256k1_context_create(0);
+ /* create a context with no capabilities */
+ data->ctx = secp256k1_context_create(SECP256K1_FLAGS_TYPE_CONTEXT);
for (i = 0; i < 32; i++) {
data->scalar[i] = i + 1;
}
diff --git a/src/secp256k1/src/bench_internal.c b/src/secp256k1/src/bench_internal.c
index 7809f5f8cf..0809f77bda 100644
--- a/src/secp256k1/src/bench_internal.c
+++ b/src/secp256k1/src/bench_internal.c
@@ -181,12 +181,12 @@ void bench_field_inverse_var(void* arg) {
}
}
-void bench_field_sqrt_var(void* arg) {
+void bench_field_sqrt(void* arg) {
int i;
bench_inv_t *data = (bench_inv_t*)arg;
for (i = 0; i < 20000; i++) {
- secp256k1_fe_sqrt_var(&data->fe_x, &data->fe_x);
+ secp256k1_fe_sqrt(&data->fe_x, &data->fe_x);
secp256k1_fe_add(&data->fe_x, &data->fe_y);
}
}
@@ -227,6 +227,15 @@ void bench_group_add_affine_var(void* arg) {
}
}
+void bench_group_jacobi_var(void* arg) {
+ int i;
+ bench_inv_t *data = (bench_inv_t*)arg;
+
+ for (i = 0; i < 20000; i++) {
+ secp256k1_gej_has_quad_y_var(&data->gej_x);
+ }
+}
+
void bench_ecmult_wnaf(void* arg) {
int i;
bench_inv_t *data = (bench_inv_t*)arg;
@@ -299,6 +308,21 @@ void bench_context_sign(void* arg) {
}
}
+#ifndef USE_NUM_NONE
+void bench_num_jacobi(void* arg) {
+ int i;
+ bench_inv_t *data = (bench_inv_t*)arg;
+ secp256k1_num nx, norder;
+
+ secp256k1_scalar_get_num(&nx, &data->scalar_x);
+ secp256k1_scalar_order_get_num(&norder);
+ secp256k1_scalar_get_num(&norder, &data->scalar_y);
+
+ for (i = 0; i < 200000; i++) {
+ secp256k1_num_jacobi(&nx, &norder);
+ }
+}
+#endif
int have_flag(int argc, char** argv, char *flag) {
char** argm = argv + argc;
@@ -333,12 +357,13 @@ int main(int argc, char **argv) {
if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000);
if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000);
if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000);
- if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt_var", bench_field_sqrt_var, bench_setup, NULL, &data, 10, 20000);
+ if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt", bench_field_sqrt, bench_setup, NULL, &data, 10, 20000);
if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000);
if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000);
if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000);
if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000);
+ if (have_flag(argc, argv, "group") || have_flag(argc, argv, "jacobi")) run_benchmark("group_jacobi_var", bench_group_jacobi_var, bench_setup, NULL, &data, 10, 20000);
if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("wnaf_const", bench_wnaf_const, bench_setup, NULL, &data, 10, 20000);
if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000);
@@ -350,5 +375,8 @@ int main(int argc, char **argv) {
if (have_flag(argc, argv, "context") || have_flag(argc, argv, "verify")) run_benchmark("context_verify", bench_context_verify, bench_setup, NULL, &data, 10, 20);
if (have_flag(argc, argv, "context") || have_flag(argc, argv, "sign")) run_benchmark("context_sign", bench_context_sign, bench_setup, NULL, &data, 10, 200);
+#ifndef USE_NUM_NONE
+ if (have_flag(argc, argv, "num") || have_flag(argc, argv, "jacobi")) run_benchmark("num_jacobi", bench_num_jacobi, bench_setup, NULL, &data, 10, 200000);
+#endif
return 0;
}
diff --git a/src/secp256k1/src/bench_verify.c b/src/secp256k1/src/bench_verify.c
index 5718320cda..418defa0aa 100644
--- a/src/secp256k1/src/bench_verify.c
+++ b/src/secp256k1/src/bench_verify.c
@@ -11,6 +11,12 @@
#include "util.h"
#include "bench.h"
+#ifdef ENABLE_OPENSSL_TESTS
+#include <openssl/bn.h>
+#include <openssl/ecdsa.h>
+#include <openssl/obj_mac.h>
+#endif
+
typedef struct {
secp256k1_context *ctx;
unsigned char msg[32];
@@ -19,6 +25,9 @@ typedef struct {
size_t siglen;
unsigned char pubkey[33];
size_t pubkeylen;
+#ifdef ENABLE_OPENSSL_TESTS
+ EC_GROUP* ec_group;
+#endif
} benchmark_verify_t;
static void benchmark_verify(void* arg) {
@@ -40,6 +49,36 @@ static void benchmark_verify(void* arg) {
}
}
+#ifdef ENABLE_OPENSSL_TESTS
+static void benchmark_verify_openssl(void* arg) {
+ int i;
+ benchmark_verify_t* data = (benchmark_verify_t*)arg;
+
+ for (i = 0; i < 20000; i++) {
+ data->sig[data->siglen - 1] ^= (i & 0xFF);
+ data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF);
+ data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF);
+ {
+ EC_KEY *pkey = EC_KEY_new();
+ const unsigned char *pubkey = &data->pubkey[0];
+ int result;
+
+ CHECK(pkey != NULL);
+ result = EC_KEY_set_group(pkey, data->ec_group);
+ CHECK(result);
+ result = (o2i_ECPublicKey(&pkey, &pubkey, data->pubkeylen)) != NULL;
+ CHECK(result);
+ result = ECDSA_verify(0, &data->msg[0], sizeof(data->msg), &data->sig[0], data->siglen, pkey) == (i == 0);
+ CHECK(result);
+ EC_KEY_free(pkey);
+ }
+ data->sig[data->siglen - 1] ^= (i & 0xFF);
+ data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF);
+ data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF);
+ }
+}
+#endif
+
int main(void) {
int i;
secp256k1_pubkey pubkey;
@@ -62,6 +101,11 @@ int main(void) {
CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1);
run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000);
+#ifdef ENABLE_OPENSSL_TESTS
+ data.ec_group = EC_GROUP_new_by_curve_name(NID_secp256k1);
+ run_benchmark("ecdsa_verify_openssl", benchmark_verify_openssl, NULL, NULL, &data, 10, 20000);
+ EC_GROUP_free(data.ec_group);
+#endif
secp256k1_context_destroy(data.ctx);
return 0;
diff --git a/src/secp256k1/src/ecmult_const_impl.h b/src/secp256k1/src/ecmult_const_impl.h
index 90ac94770e..7a6a25318c 100644
--- a/src/secp256k1/src/ecmult_const_impl.h
+++ b/src/secp256k1/src/ecmult_const_impl.h
@@ -58,22 +58,24 @@ static int secp256k1_wnaf_const(int *wnaf, secp256k1_scalar s, int w) {
int global_sign;
int skew = 0;
int word = 0;
+
/* 1 2 3 */
int u_last;
int u;
-#ifdef USE_ENDOMORPHISM
int flip;
int bit;
secp256k1_scalar neg_s;
int not_neg_one;
- /* If we are using the endomorphism, we cannot handle even numbers by negating
- * them, since we are working with 128-bit numbers whose negations would be 256
- * bits, eliminating the performance advantage. Instead we use a technique from
+ /* Note that we cannot handle even numbers by negating them to be odd, as is
+ * done in other implementations, since if our scalars were specified to have
+ * width < 256 for performance reasons, their negations would have width 256
+ * and we'd lose any performance benefit. Instead, we use a technique from
* Section 4.2 of the Okeya/Tagaki paper, which is to add either 1 (for even)
- * or 2 (for odd) to the number we are encoding, then compensating after the
- * multiplication. */
- /* Negative 128-bit numbers will be negated, since otherwise they are 256-bit */
+ * or 2 (for odd) to the number we are encoding, returning a skew value indicating
+ * this, and having the caller compensate after doing the multiplication. */
+
+ /* Negative numbers will be negated to keep their bit representation below the maximum width */
flip = secp256k1_scalar_is_high(&s);
/* We add 1 to even numbers, 2 to odd ones, noting that negation flips parity */
bit = flip ^ (s.d[0] & 1);
@@ -89,11 +91,6 @@ static int secp256k1_wnaf_const(int *wnaf, secp256k1_scalar s, int w) {
global_sign = secp256k1_scalar_cond_negate(&s, flip);
global_sign *= not_neg_one * 2 - 1;
skew = 1 << bit;
-#else
- /* Otherwise, we just negate to force oddness */
- int is_even = secp256k1_scalar_is_even(&s);
- global_sign = secp256k1_scalar_cond_negate(&s, is_even);
-#endif
/* 4 */
u_last = secp256k1_scalar_shr_int(&s, w);
@@ -127,15 +124,13 @@ static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, cons
secp256k1_ge tmpa;
secp256k1_fe Z;
+ int skew_1;
+ int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)];
#ifdef USE_ENDOMORPHISM
secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)];
- int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)];
int wnaf_lam[1 + WNAF_SIZE(WINDOW_A - 1)];
- int skew_1;
int skew_lam;
secp256k1_scalar q_1, q_lam;
-#else
- int wnaf[1 + WNAF_SIZE(WINDOW_A - 1)];
#endif
int i;
@@ -145,18 +140,10 @@ static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, cons
#ifdef USE_ENDOMORPHISM
/* split q into q_1 and q_lam (where q = q_1 + q_lam*lambda, and q_1 and q_lam are ~128 bit) */
secp256k1_scalar_split_lambda(&q_1, &q_lam, &sc);
- /* no need for zero correction when using endomorphism since even
- * numbers have one added to them anyway */
skew_1 = secp256k1_wnaf_const(wnaf_1, q_1, WINDOW_A - 1);
skew_lam = secp256k1_wnaf_const(wnaf_lam, q_lam, WINDOW_A - 1);
#else
- int is_zero = secp256k1_scalar_is_zero(scalar);
- /* the wNAF ladder cannot handle zero, so bump this to one .. we will
- * correct the result after the fact */
- sc.d[0] += is_zero;
- VERIFY_CHECK(!secp256k1_scalar_is_zero(&sc));
-
- secp256k1_wnaf_const(wnaf, sc, WINDOW_A - 1);
+ skew_1 = secp256k1_wnaf_const(wnaf_1, sc, WINDOW_A - 1);
#endif
/* Calculate odd multiples of a.
@@ -179,21 +166,15 @@ static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, cons
/* first loop iteration (separated out so we can directly set r, rather
* than having it start at infinity, get doubled several times, then have
* its new value added to it) */
-#ifdef USE_ENDOMORPHISM
i = wnaf_1[WNAF_SIZE(WINDOW_A - 1)];
VERIFY_CHECK(i != 0);
ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A);
secp256k1_gej_set_ge(r, &tmpa);
-
+#ifdef USE_ENDOMORPHISM
i = wnaf_lam[WNAF_SIZE(WINDOW_A - 1)];
VERIFY_CHECK(i != 0);
ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, i, WINDOW_A);
secp256k1_gej_add_ge(r, r, &tmpa);
-#else
- i = wnaf[WNAF_SIZE(WINDOW_A - 1)];
- VERIFY_CHECK(i != 0);
- ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A);
- secp256k1_gej_set_ge(r, &tmpa);
#endif
/* remaining loop iterations */
for (i = WNAF_SIZE(WINDOW_A - 1) - 1; i >= 0; i--) {
@@ -202,59 +183,57 @@ static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, cons
for (j = 0; j < WINDOW_A - 1; ++j) {
secp256k1_gej_double_nonzero(r, r, NULL);
}
-#ifdef USE_ENDOMORPHISM
+
n = wnaf_1[i];
ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A);
VERIFY_CHECK(n != 0);
secp256k1_gej_add_ge(r, r, &tmpa);
-
+#ifdef USE_ENDOMORPHISM
n = wnaf_lam[i];
ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A);
VERIFY_CHECK(n != 0);
secp256k1_gej_add_ge(r, r, &tmpa);
-#else
- n = wnaf[i];
- VERIFY_CHECK(n != 0);
- ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A);
- secp256k1_gej_add_ge(r, r, &tmpa);
#endif
}
secp256k1_fe_mul(&r->z, &r->z, &Z);
-#ifdef USE_ENDOMORPHISM
{
/* Correct for wNAF skew */
secp256k1_ge correction = *a;
secp256k1_ge_storage correction_1_stor;
+#ifdef USE_ENDOMORPHISM
secp256k1_ge_storage correction_lam_stor;
+#endif
secp256k1_ge_storage a2_stor;
secp256k1_gej tmpj;
secp256k1_gej_set_ge(&tmpj, &correction);
secp256k1_gej_double_var(&tmpj, &tmpj, NULL);
secp256k1_ge_set_gej(&correction, &tmpj);
secp256k1_ge_to_storage(&correction_1_stor, a);
+#ifdef USE_ENDOMORPHISM
secp256k1_ge_to_storage(&correction_lam_stor, a);
+#endif
secp256k1_ge_to_storage(&a2_stor, &correction);
/* For odd numbers this is 2a (so replace it), for even ones a (so no-op) */
secp256k1_ge_storage_cmov(&correction_1_stor, &a2_stor, skew_1 == 2);
+#ifdef USE_ENDOMORPHISM
secp256k1_ge_storage_cmov(&correction_lam_stor, &a2_stor, skew_lam == 2);
+#endif
/* Apply the correction */
secp256k1_ge_from_storage(&correction, &correction_1_stor);
secp256k1_ge_neg(&correction, &correction);
secp256k1_gej_add_ge(r, r, &correction);
+#ifdef USE_ENDOMORPHISM
secp256k1_ge_from_storage(&correction, &correction_lam_stor);
secp256k1_ge_neg(&correction, &correction);
secp256k1_ge_mul_lambda(&correction, &correction);
secp256k1_gej_add_ge(r, r, &correction);
- }
-#else
- /* correct for zero */
- r->infinity |= is_zero;
#endif
+ }
}
#endif
diff --git a/src/secp256k1/src/ecmult_impl.h b/src/secp256k1/src/ecmult_impl.h
index e6e5f47188..81ae08e100 100644
--- a/src/secp256k1/src/ecmult_impl.h
+++ b/src/secp256k1/src/ecmult_impl.h
@@ -11,6 +11,8 @@
#include "scalar.h"
#include "ecmult.h"
+#include <string.h>
+
/* optimal for 128-bit and 256-bit exponents. */
#define WINDOW_A 5
diff --git a/src/secp256k1/src/field.h b/src/secp256k1/src/field.h
index 2d52af5e36..c5ba074244 100644
--- a/src/secp256k1/src/field.h
+++ b/src/secp256k1/src/field.h
@@ -57,6 +57,9 @@ static int secp256k1_fe_is_zero(const secp256k1_fe *a);
static int secp256k1_fe_is_odd(const secp256k1_fe *a);
/** Compare two field elements. Requires magnitude-1 inputs. */
+static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b);
+
+/** Same as secp256k1_fe_equal, but may be variable time. */
static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b);
/** Compare two field elements. Requires both inputs to be normalized */
@@ -92,7 +95,10 @@ static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a);
* The input's magnitude can be at most 8. The output magnitude is 1 (but not
* guaranteed to be normalized). The result in r will always be a square
* itself. */
-static int secp256k1_fe_sqrt_var(secp256k1_fe *r, const secp256k1_fe *a);
+static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a);
+
+/** Checks whether a field element is a quadratic residue. */
+static int secp256k1_fe_is_quad_var(const secp256k1_fe *a);
/** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be
* at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */
diff --git a/src/secp256k1/src/field_10x26_impl.h b/src/secp256k1/src/field_10x26_impl.h
index 212cc5396a..7b8c079608 100644
--- a/src/secp256k1/src/field_10x26_impl.h
+++ b/src/secp256k1/src/field_10x26_impl.h
@@ -7,8 +7,6 @@
#ifndef _SECP256K1_FIELD_REPR_IMPL_H_
#define _SECP256K1_FIELD_REPR_IMPL_H_
-#include <stdio.h>
-#include <string.h>
#include "util.h"
#include "num.h"
#include "field.h"
@@ -429,6 +427,14 @@ SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_f
#endif
}
+#if defined(USE_EXTERNAL_ASM)
+
+/* External assembler implementation */
+void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b);
+void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a);
+
+#else
+
#ifdef VERIFY
#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0)
#else
@@ -1037,7 +1043,7 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t
VERIFY_BITS(r[2], 27);
/* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */
}
-
+#endif
static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) {
#ifdef VERIFY
diff --git a/src/secp256k1/src/field_5x52_impl.h b/src/secp256k1/src/field_5x52_impl.h
index b31e24ab81..7a99eb21ec 100644
--- a/src/secp256k1/src/field_5x52_impl.h
+++ b/src/secp256k1/src/field_5x52_impl.h
@@ -11,7 +11,6 @@
#include "libsecp256k1-config.h"
#endif
-#include <string.h>
#include "util.h"
#include "num.h"
#include "field.h"
diff --git a/src/secp256k1/src/field_5x52_int128_impl.h b/src/secp256k1/src/field_5x52_int128_impl.h
index 9280bb5ea2..0bf22bdd3e 100644
--- a/src/secp256k1/src/field_5x52_int128_impl.h
+++ b/src/secp256k1/src/field_5x52_int128_impl.h
@@ -137,7 +137,7 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t
VERIFY_BITS(r[2], 52);
VERIFY_BITS(c, 63);
/* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
- c += d * R + t3;;
+ c += d * R + t3;
VERIFY_BITS(c, 100);
/* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
r[3] = c & M; c >>= 52;
@@ -259,7 +259,7 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t
VERIFY_BITS(c, 63);
/* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
- c += d * R + t3;;
+ c += d * R + t3;
VERIFY_BITS(c, 100);
/* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
r[3] = c & M; c >>= 52;
diff --git a/src/secp256k1/src/field_impl.h b/src/secp256k1/src/field_impl.h
index 77f4aae2f9..52cd902eb3 100644
--- a/src/secp256k1/src/field_impl.h
+++ b/src/secp256k1/src/field_impl.h
@@ -21,6 +21,13 @@
#error "Please select field implementation"
#endif
+SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) {
+ secp256k1_fe na;
+ secp256k1_fe_negate(&na, a, 1);
+ secp256k1_fe_add(&na, b);
+ return secp256k1_fe_normalizes_to_zero(&na);
+}
+
SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b) {
secp256k1_fe na;
secp256k1_fe_negate(&na, a, 1);
@@ -28,7 +35,7 @@ SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const
return secp256k1_fe_normalizes_to_zero_var(&na);
}
-static int secp256k1_fe_sqrt_var(secp256k1_fe *r, const secp256k1_fe *a) {
+static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) {
/** Given that p is congruent to 3 mod 4, we can compute the square root of
* a mod p as the (p+1)/4'th power of a.
*
@@ -123,7 +130,7 @@ static int secp256k1_fe_sqrt_var(secp256k1_fe *r, const secp256k1_fe *a) {
/* Check that a square root was actually calculated */
secp256k1_fe_sqr(&t1, r);
- return secp256k1_fe_equal_var(&t1, a);
+ return secp256k1_fe_equal(&t1, a);
}
static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a) {
@@ -280,4 +287,29 @@ static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe *r, const secp256k
r[0] = u;
}
+static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) {
+#ifndef USE_NUM_NONE
+ unsigned char b[32];
+ secp256k1_num n;
+ secp256k1_num m;
+ /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */
+ static const unsigned char prime[32] = {
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F
+ };
+
+ secp256k1_fe c = *a;
+ secp256k1_fe_normalize_var(&c);
+ secp256k1_fe_get_b32(b, &c);
+ secp256k1_num_set_bin(&n, b, 32);
+ secp256k1_num_set_bin(&m, prime, 32);
+ return secp256k1_num_jacobi(&n, &m) >= 0;
+#else
+ secp256k1_fe r;
+ return secp256k1_fe_sqrt(&r, a);
+#endif
+}
+
#endif
diff --git a/src/secp256k1/src/group.h b/src/secp256k1/src/group.h
index ebfe1ca70c..d515716744 100644
--- a/src/secp256k1/src/group.h
+++ b/src/secp256k1/src/group.h
@@ -47,7 +47,7 @@ static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const se
* and a Y coordinate that is a quadratic residue modulo p. The return value
* is true iff a coordinate with the given X coordinate exists.
*/
-static int secp256k1_ge_set_xquad_var(secp256k1_ge *r, const secp256k1_fe *x);
+static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x);
/** Set a group element (affine) equal to the point with the given X coordinate, and given oddness
* for Y. Return value indicates whether the result is valid. */
@@ -94,6 +94,9 @@ static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a);
/** Check whether a group element is the point at infinity. */
static int secp256k1_gej_is_infinity(const secp256k1_gej *a);
+/** Check whether a group element's y coordinate is a quadratic residue. */
+static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a);
+
/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0).
* a may not be zero. Constant time. */
static void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr);
diff --git a/src/secp256k1/src/group_impl.h b/src/secp256k1/src/group_impl.h
index 42e2f6e6eb..3e9c4c410d 100644
--- a/src/secp256k1/src/group_impl.h
+++ b/src/secp256k1/src/group_impl.h
@@ -7,8 +7,6 @@
#ifndef _SECP256K1_GROUP_IMPL_H_
#define _SECP256K1_GROUP_IMPL_H_
-#include <string.h>
-
#include "num.h"
#include "field.h"
#include "group.h"
@@ -165,7 +163,7 @@ static void secp256k1_ge_clear(secp256k1_ge *r) {
secp256k1_fe_clear(&r->y);
}
-static int secp256k1_ge_set_xquad_var(secp256k1_ge *r, const secp256k1_fe *x) {
+static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) {
secp256k1_fe x2, x3, c;
r->x = *x;
secp256k1_fe_sqr(&x2, x);
@@ -173,11 +171,11 @@ static int secp256k1_ge_set_xquad_var(secp256k1_ge *r, const secp256k1_fe *x) {
r->infinity = 0;
secp256k1_fe_set_int(&c, 7);
secp256k1_fe_add(&c, &x3);
- return secp256k1_fe_sqrt_var(&r->y, &c);
+ return secp256k1_fe_sqrt(&r->y, &c);
}
static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) {
- if (!secp256k1_ge_set_xquad_var(r, x)) {
+ if (!secp256k1_ge_set_xquad(r, x)) {
return 0;
}
secp256k1_fe_normalize_var(&r->y);
@@ -251,11 +249,23 @@ static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) {
}
static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) {
- /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate */
+ /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate.
+ *
+ * Note that there is an implementation described at
+ * https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
+ * which trades a multiply for a square, but in practice this is actually slower,
+ * mainly because it requires more normalizations.
+ */
secp256k1_fe t1,t2,t3,t4;
/** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity,
* Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have
* y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p.
+ *
+ * Having said this, if this function receives a point on a sextic twist, e.g. by
+ * a fault attack, it is possible for y to be 0. This happens for y^2 = x^3 + 6,
+ * since -6 does have a cube root mod p. For this point, this function will not set
+ * the infinity flag even though the point doubles to infinity, and the result
+ * point will be gibberish (z = 0 but infinity = 0).
*/
r->infinity = a->infinity;
if (r->infinity) {
@@ -623,4 +633,18 @@ static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a) {
}
#endif
+static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a) {
+ secp256k1_fe yz;
+
+ if (a->infinity) {
+ return 0;
+ }
+
+ /* We rely on the fact that the Jacobi symbol of 1 / a->z^3 is the same as
+ * that of a->z. Thus a->y / a->z^3 is a quadratic residue iff a->y * a->z
+ is */
+ secp256k1_fe_mul(&yz, &a->y, &a->z);
+ return secp256k1_fe_is_quad_var(&yz);
+}
+
#endif
diff --git a/src/secp256k1/src/hash.h b/src/secp256k1/src/hash.h
index 0ff01e63fa..fca98cab9f 100644
--- a/src/secp256k1/src/hash.h
+++ b/src/secp256k1/src/hash.h
@@ -11,7 +11,7 @@
#include <stdint.h>
typedef struct {
- uint32_t s[32];
+ uint32_t s[8];
uint32_t buf[16]; /* In big endian */
size_t bytes;
} secp256k1_sha256_t;
diff --git a/src/secp256k1/src/hash_impl.h b/src/secp256k1/src/hash_impl.h
index ae55df6d8a..b47e65f830 100644
--- a/src/secp256k1/src/hash_impl.h
+++ b/src/secp256k1/src/hash_impl.h
@@ -269,15 +269,13 @@ static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256
rng->retry = 0;
}
-
+#undef BE32
#undef Round
-#undef sigma0
#undef sigma1
-#undef Sigma0
+#undef sigma0
#undef Sigma1
-#undef Ch
+#undef Sigma0
#undef Maj
-#undef ReadBE32
-#undef WriteBE32
+#undef Ch
#endif
diff --git a/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java b/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java
index 90a498eaa2..be67048fbe 100644
--- a/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java
+++ b/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java
@@ -1,60 +1,478 @@
+/*
+ * Copyright 2013 Google Inc.
+ * Copyright 2014-2016 the libsecp256k1 contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.bitcoin;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.math.BigInteger;
import com.google.common.base.Preconditions;
-
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import static org.bitcoin.NativeSecp256k1Util.*;
/**
- * This class holds native methods to handle ECDSA verification.
- * You can find an example library that can be used for this at
- * https://github.com/sipa/secp256k1
+ * <p>This class holds native methods to handle ECDSA verification.</p>
+ *
+ * <p>You can find an example library that can be used for this at https://github.com/bitcoin/secp256k1</p>
+ *
+ * <p>To build secp256k1 for use with bitcoinj, run
+ * `./configure --enable-jni --enable-experimental --enable-module-schnorr --enable-module-ecdh`
+ * and `make` then copy `.libs/libsecp256k1.so` to your system library path
+ * or point the JVM to the folder containing it with -Djava.library.path
+ * </p>
*/
public class NativeSecp256k1 {
- public static final boolean enabled;
- static {
- boolean isEnabled = true;
- try {
- System.loadLibrary("javasecp256k1");
- } catch (UnsatisfiedLinkError e) {
- isEnabled = false;
- }
- enabled = isEnabled;
- }
-
+
+ private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
+ private static final Lock r = rwl.readLock();
+ private static final Lock w = rwl.writeLock();
private static ThreadLocal<ByteBuffer> nativeECDSABuffer = new ThreadLocal<ByteBuffer>();
/**
* Verifies the given secp256k1 signature in native code.
* Calling when enabled == false is undefined (probably library not loaded)
- *
+ *
* @param data The data which was signed, must be exactly 32 bytes
* @param signature The signature
* @param pub The public key which did the signing
*/
- public static boolean verify(byte[] data, byte[] signature, byte[] pub) {
+ public static boolean verify(byte[] data, byte[] signature, byte[] pub) throws AssertFailException{
Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520);
ByteBuffer byteBuff = nativeECDSABuffer.get();
- if (byteBuff == null) {
- byteBuff = ByteBuffer.allocateDirect(32 + 8 + 520 + 520);
+ if (byteBuff == null || byteBuff.capacity() < 520) {
+ byteBuff = ByteBuffer.allocateDirect(520);
byteBuff.order(ByteOrder.nativeOrder());
nativeECDSABuffer.set(byteBuff);
}
byteBuff.rewind();
byteBuff.put(data);
- byteBuff.putInt(signature.length);
- byteBuff.putInt(pub.length);
byteBuff.put(signature);
byteBuff.put(pub);
- return secp256k1_ecdsa_verify(byteBuff) == 1;
+
+ byte[][] retByteArray;
+
+ r.lock();
+ try {
+ return secp256k1_ecdsa_verify(byteBuff, Secp256k1Context.getContext(), signature.length, pub.length) == 1;
+ } finally {
+ r.unlock();
+ }
+ }
+
+ /**
+ * libsecp256k1 Create an ECDSA signature.
+ *
+ * @param data Message hash, 32 bytes
+ * @param key Secret key, 32 bytes
+ *
+ * Return values
+ * @param sig byte array of signature
+ */
+ public static byte[] sign(byte[] data, byte[] sec) throws AssertFailException{
+ Preconditions.checkArgument(data.length == 32 && sec.length <= 32);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < 32 + 32) {
+ byteBuff = ByteBuffer.allocateDirect(32 + 32);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(data);
+ byteBuff.put(sec);
+
+ byte[][] retByteArray;
+
+ r.lock();
+ try {
+ retByteArray = secp256k1_ecdsa_sign(byteBuff, Secp256k1Context.getContext());
+ } finally {
+ r.unlock();
+ }
+
+ byte[] sigArr = retByteArray[0];
+ int sigLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();
+ int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();
+
+ assertEquals(sigArr.length, sigLen, "Got bad signature length.");
+
+ return retVal == 0 ? new byte[0] : sigArr;
+ }
+
+ /**
+ * libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid
+ *
+ * @param seckey ECDSA Secret key, 32 bytes
+ */
+ public static boolean secKeyVerify(byte[] seckey) {
+ Preconditions.checkArgument(seckey.length == 32);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < seckey.length) {
+ byteBuff = ByteBuffer.allocateDirect(seckey.length);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(seckey);
+
+ r.lock();
+ try {
+ return secp256k1_ec_seckey_verify(byteBuff,Secp256k1Context.getContext()) == 1;
+ } finally {
+ r.unlock();
+ }
+ }
+
+
+ /**
+ * libsecp256k1 Compute Pubkey - computes public key from secret key
+ *
+ * @param seckey ECDSA Secret key, 32 bytes
+ *
+ * Return values
+ * @param pubkey ECDSA Public key, 33 or 65 bytes
+ */
+ //TODO add a 'compressed' arg
+ public static byte[] computePubkey(byte[] seckey) throws AssertFailException{
+ Preconditions.checkArgument(seckey.length == 32);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < seckey.length) {
+ byteBuff = ByteBuffer.allocateDirect(seckey.length);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(seckey);
+
+ byte[][] retByteArray;
+
+ r.lock();
+ try {
+ retByteArray = secp256k1_ec_pubkey_create(byteBuff, Secp256k1Context.getContext());
+ } finally {
+ r.unlock();
+ }
+
+ byte[] pubArr = retByteArray[0];
+ int pubLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();
+ int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();
+
+ assertEquals(pubArr.length, pubLen, "Got bad pubkey length.");
+
+ return retVal == 0 ? new byte[0]: pubArr;
+ }
+
+ /**
+ * libsecp256k1 Cleanup - This destroys the secp256k1 context object
+ * This should be called at the end of the program for proper cleanup of the context.
+ */
+ public static synchronized void cleanup() {
+ w.lock();
+ try {
+ secp256k1_destroy_context(Secp256k1Context.getContext());
+ } finally {
+ w.unlock();
+ }
+ }
+
+ public static long cloneContext() {
+ r.lock();
+ try {
+ return secp256k1_ctx_clone(Secp256k1Context.getContext());
+ } finally { r.unlock(); }
+ }
+
+ /**
+ * libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it
+ *
+ * @param tweak some bytes to tweak with
+ * @param seckey 32-byte seckey
+ */
+ public static byte[] privKeyTweakMul(byte[] privkey, byte[] tweak) throws AssertFailException{
+ Preconditions.checkArgument(privkey.length == 32);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) {
+ byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(privkey);
+ byteBuff.put(tweak);
+
+ byte[][] retByteArray;
+ r.lock();
+ try {
+ retByteArray = secp256k1_privkey_tweak_mul(byteBuff,Secp256k1Context.getContext());
+ } finally {
+ r.unlock();
+ }
+
+ byte[] privArr = retByteArray[0];
+
+ int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;
+ int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();
+
+ assertEquals(privArr.length, privLen, "Got bad pubkey length.");
+
+ assertEquals(retVal, 1, "Failed return value check.");
+
+ return privArr;
}
/**
- * @param byteBuff signature format is byte[32] data,
- * native-endian int signatureLength, native-endian int pubkeyLength,
- * byte[signatureLength] signature, byte[pubkeyLength] pub
- * @returns 1 for valid signature, anything else for invalid
+ * libsecp256k1 PrivKey Tweak-Add - Tweak privkey by adding to it
+ *
+ * @param tweak some bytes to tweak with
+ * @param seckey 32-byte seckey
*/
- private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff);
+ public static byte[] privKeyTweakAdd(byte[] privkey, byte[] tweak) throws AssertFailException{
+ Preconditions.checkArgument(privkey.length == 32);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) {
+ byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(privkey);
+ byteBuff.put(tweak);
+
+ byte[][] retByteArray;
+ r.lock();
+ try {
+ retByteArray = secp256k1_privkey_tweak_add(byteBuff,Secp256k1Context.getContext());
+ } finally {
+ r.unlock();
+ }
+
+ byte[] privArr = retByteArray[0];
+
+ int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;
+ int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();
+
+ assertEquals(privArr.length, privLen, "Got bad pubkey length.");
+
+ assertEquals(retVal, 1, "Failed return value check.");
+
+ return privArr;
+ }
+
+ /**
+ * libsecp256k1 PubKey Tweak-Add - Tweak pubkey by adding to it
+ *
+ * @param tweak some bytes to tweak with
+ * @param pubkey 32-byte seckey
+ */
+ public static byte[] pubKeyTweakAdd(byte[] pubkey, byte[] tweak) throws AssertFailException{
+ Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) {
+ byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(pubkey);
+ byteBuff.put(tweak);
+
+ byte[][] retByteArray;
+ r.lock();
+ try {
+ retByteArray = secp256k1_pubkey_tweak_add(byteBuff,Secp256k1Context.getContext(), pubkey.length);
+ } finally {
+ r.unlock();
+ }
+
+ byte[] pubArr = retByteArray[0];
+
+ int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;
+ int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();
+
+ assertEquals(pubArr.length, pubLen, "Got bad pubkey length.");
+
+ assertEquals(retVal, 1, "Failed return value check.");
+
+ return pubArr;
+ }
+
+ /**
+ * libsecp256k1 PubKey Tweak-Mul - Tweak pubkey by multiplying to it
+ *
+ * @param tweak some bytes to tweak with
+ * @param pubkey 32-byte seckey
+ */
+ public static byte[] pubKeyTweakMul(byte[] pubkey, byte[] tweak) throws AssertFailException{
+ Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) {
+ byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(pubkey);
+ byteBuff.put(tweak);
+
+ byte[][] retByteArray;
+ r.lock();
+ try {
+ retByteArray = secp256k1_pubkey_tweak_mul(byteBuff,Secp256k1Context.getContext(), pubkey.length);
+ } finally {
+ r.unlock();
+ }
+
+ byte[] pubArr = retByteArray[0];
+
+ int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;
+ int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();
+
+ assertEquals(pubArr.length, pubLen, "Got bad pubkey length.");
+
+ assertEquals(retVal, 1, "Failed return value check.");
+
+ return pubArr;
+ }
+
+ /**
+ * libsecp256k1 create ECDH secret - constant time ECDH calculation
+ *
+ * @param seckey byte array of secret key used in exponentiaion
+ * @param pubkey byte array of public key used in exponentiaion
+ */
+ public static byte[] createECDHSecret(byte[] seckey, byte[] pubkey) throws AssertFailException{
+ Preconditions.checkArgument(seckey.length <= 32 && pubkey.length <= 65);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < 32 + pubkey.length) {
+ byteBuff = ByteBuffer.allocateDirect(32 + pubkey.length);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(seckey);
+ byteBuff.put(pubkey);
+
+ byte[][] retByteArray;
+ r.lock();
+ try {
+ retByteArray = secp256k1_ecdh(byteBuff, Secp256k1Context.getContext(), pubkey.length);
+ } finally {
+ r.unlock();
+ }
+
+ byte[] resArr = retByteArray[0];
+ int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();
+
+ assertEquals(resArr.length, 32, "Got bad result length.");
+ assertEquals(retVal, 1, "Failed return value check.");
+
+ return resArr;
+ }
+
+ /**
+ * libsecp256k1 randomize - updates the context randomization
+ *
+ * @param seed 32-byte random seed
+ */
+ public static synchronized boolean randomize(byte[] seed) throws AssertFailException{
+ Preconditions.checkArgument(seed.length == 32 || seed == null);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null || byteBuff.capacity() < seed.length) {
+ byteBuff = ByteBuffer.allocateDirect(seed.length);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(seed);
+
+ w.lock();
+ try {
+ return secp256k1_context_randomize(byteBuff, Secp256k1Context.getContext()) == 1;
+ } finally {
+ w.unlock();
+ }
+ }
+
+ public static byte[] schnorrSign(byte[] data, byte[] sec) throws AssertFailException {
+ Preconditions.checkArgument(data.length == 32 && sec.length <= 32);
+
+ ByteBuffer byteBuff = nativeECDSABuffer.get();
+ if (byteBuff == null) {
+ byteBuff = ByteBuffer.allocateDirect(32 + 32);
+ byteBuff.order(ByteOrder.nativeOrder());
+ nativeECDSABuffer.set(byteBuff);
+ }
+ byteBuff.rewind();
+ byteBuff.put(data);
+ byteBuff.put(sec);
+
+ byte[][] retByteArray;
+
+ r.lock();
+ try {
+ retByteArray = secp256k1_schnorr_sign(byteBuff, Secp256k1Context.getContext());
+ } finally {
+ r.unlock();
+ }
+
+ byte[] sigArr = retByteArray[0];
+ int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();
+
+ assertEquals(sigArr.length, 64, "Got bad signature length.");
+
+ return retVal == 0 ? new byte[0] : sigArr;
+ }
+
+ private static native long secp256k1_ctx_clone(long context);
+
+ private static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context);
+
+ private static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context);
+
+ private static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context);
+
+ private static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen);
+
+ private static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen);
+
+ private static native void secp256k1_destroy_context(long context);
+
+ private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen);
+
+ private static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, long context);
+
+ private static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context);
+
+ private static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, long context);
+
+ private static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen);
+
+ private static native byte[][] secp256k1_schnorr_sign(ByteBuffer byteBuff, long context);
+
+ private static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen);
+
}
diff --git a/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java b/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java
new file mode 100644
index 0000000000..f18ce95810
--- /dev/null
+++ b/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java
@@ -0,0 +1,247 @@
+package org.bitcoin;
+
+import com.google.common.io.BaseEncoding;
+import java.util.Arrays;
+import java.math.BigInteger;
+import javax.xml.bind.DatatypeConverter;
+import static org.bitcoin.NativeSecp256k1Util.*;
+
+/**
+ * This class holds test cases defined for testing this library.
+ */
+public class NativeSecp256k1Test {
+
+ //TODO improve comments/add more tests
+ /**
+ * This tests verify() for a valid signature
+ */
+ public static void testVerifyPos() throws AssertFailException{
+ boolean result = false;
+ byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
+ byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase());
+ byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
+
+ result = NativeSecp256k1.verify( data, sig, pub);
+ assertEquals( result, true , "testVerifyPos");
+ }
+
+ /**
+ * This tests verify() for a non-valid signature
+ */
+ public static void testVerifyNeg() throws AssertFailException{
+ boolean result = false;
+ byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91".toLowerCase()); //sha256hash of "testing"
+ byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase());
+ byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
+
+ result = NativeSecp256k1.verify( data, sig, pub);
+ //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
+ assertEquals( result, false , "testVerifyNeg");
+ }
+
+ /**
+ * This tests secret key verify() for a valid secretkey
+ */
+ public static void testSecKeyVerifyPos() throws AssertFailException{
+ boolean result = false;
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
+
+ result = NativeSecp256k1.secKeyVerify( sec );
+ //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
+ assertEquals( result, true , "testSecKeyVerifyPos");
+ }
+
+ /**
+ * This tests secret key verify() for a invalid secretkey
+ */
+ public static void testSecKeyVerifyNeg() throws AssertFailException{
+ boolean result = false;
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
+
+ result = NativeSecp256k1.secKeyVerify( sec );
+ //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
+ assertEquals( result, false , "testSecKeyVerifyNeg");
+ }
+
+ /**
+ * This tests public key create() for a valid secretkey
+ */
+ public static void testPubKeyCreatePos() throws AssertFailException{
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
+
+ byte[] resultArr = NativeSecp256k1.computePubkey( sec);
+ String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( pubkeyString , "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6" , "testPubKeyCreatePos");
+ }
+
+ /**
+ * This tests public key create() for a invalid secretkey
+ */
+ public static void testPubKeyCreateNeg() throws AssertFailException{
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
+
+ byte[] resultArr = NativeSecp256k1.computePubkey( sec);
+ String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( pubkeyString, "" , "testPubKeyCreateNeg");
+ }
+
+ /**
+ * This tests sign() for a valid secretkey
+ */
+ public static void testSignPos() throws AssertFailException{
+
+ byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
+
+ byte[] resultArr = NativeSecp256k1.sign(data, sec);
+ String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( sigString, "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9" , "testSignPos");
+ }
+
+ /**
+ * This tests sign() for a invalid secretkey
+ */
+ public static void testSignNeg() throws AssertFailException{
+ byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
+
+ byte[] resultArr = NativeSecp256k1.sign(data, sec);
+ String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( sigString, "" , "testSignNeg");
+ }
+
+ /**
+ * This tests private key tweak-add
+ */
+ public static void testPrivKeyTweakAdd_1() throws AssertFailException {
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
+ byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
+
+ byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data );
+ String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( sigString , "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3" , "testPrivKeyAdd_1");
+ }
+
+ /**
+ * This tests private key tweak-mul
+ */
+ public static void testPrivKeyTweakMul_1() throws AssertFailException {
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
+ byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
+
+ byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data );
+ String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( sigString , "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC" , "testPrivKeyMul_1");
+ }
+
+ /**
+ * This tests private key tweak-add uncompressed
+ */
+ public static void testPrivKeyTweakAdd_2() throws AssertFailException {
+ byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
+ byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
+
+ byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data );
+ String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( sigString , "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF" , "testPrivKeyAdd_2");
+ }
+
+ /**
+ * This tests private key tweak-mul uncompressed
+ */
+ public static void testPrivKeyTweakMul_2() throws AssertFailException {
+ byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
+ byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
+
+ byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data );
+ String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( sigString , "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589" , "testPrivKeyMul_2");
+ }
+
+ /**
+ * This tests seed randomization
+ */
+ public static void testRandomize() throws AssertFailException {
+ byte[] seed = BaseEncoding.base16().lowerCase().decode("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11".toLowerCase()); //sha256hash of "random"
+ boolean result = NativeSecp256k1.randomize(seed);
+ assertEquals( result, true, "testRandomize");
+ }
+
+ /**
+ * This tests signSchnorr() for a valid secretkey
+ */
+ public static void testSchnorrSign() throws AssertFailException{
+
+ byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
+
+ byte[] resultArr = NativeSecp256k1.schnorrSign(data, sec);
+ String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( sigString, "C5E929AA058B982048760422D3B563749B7D0E50C5EBD8CD2FFC23214BD6A2F1B072C13880997EBA847CF20F2F90FCE07C1CA33A890A4127095A351127F8D95F" , "testSchnorrSign");
+ }
+
+ /**
+ * This tests signSchnorr() for a valid secretkey
+ */
+ public static void testCreateECDHSecret() throws AssertFailException{
+
+ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
+ byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
+
+ byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub);
+ String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
+ assertEquals( ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043" , "testCreateECDHSecret");
+ }
+
+ public static void main(String[] args) throws AssertFailException{
+
+
+ System.out.println("\n libsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n");
+
+ assertEquals( Secp256k1Context.isEnabled(), true, "isEnabled" );
+
+ //Test verify() success/fail
+ testVerifyPos();
+ testVerifyNeg();
+
+ //Test secKeyVerify() success/fail
+ testSecKeyVerifyPos();
+ testSecKeyVerifyNeg();
+
+ //Test computePubkey() success/fail
+ testPubKeyCreatePos();
+ testPubKeyCreateNeg();
+
+ //Test sign() success/fail
+ testSignPos();
+ testSignNeg();
+
+ //Test Schnorr (partial support) //TODO
+ testSchnorrSign();
+ //testSchnorrVerify
+ //testSchnorrRecovery
+
+ //Test privKeyTweakAdd() 1
+ testPrivKeyTweakAdd_1();
+
+ //Test privKeyTweakMul() 2
+ testPrivKeyTweakMul_1();
+
+ //Test privKeyTweakAdd() 3
+ testPrivKeyTweakAdd_2();
+
+ //Test privKeyTweakMul() 4
+ testPrivKeyTweakMul_2();
+
+ //Test randomize()
+ testRandomize();
+
+ //Test ECDH
+ testCreateECDHSecret();
+
+ NativeSecp256k1.cleanup();
+
+ System.out.println(" All tests passed." );
+
+ }
+}
diff --git a/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java b/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java
new file mode 100644
index 0000000000..04732ba044
--- /dev/null
+++ b/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2014-2016 the libsecp256k1 contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.bitcoin;
+
+public class NativeSecp256k1Util{
+
+ public static void assertEquals( int val, int val2, String message ) throws AssertFailException{
+ if( val != val2 )
+ throw new AssertFailException("FAIL: " + message);
+ }
+
+ public static void assertEquals( boolean val, boolean val2, String message ) throws AssertFailException{
+ if( val != val2 )
+ throw new AssertFailException("FAIL: " + message);
+ else
+ System.out.println("PASS: " + message);
+ }
+
+ public static void assertEquals( String val, String val2, String message ) throws AssertFailException{
+ if( !val.equals(val2) )
+ throw new AssertFailException("FAIL: " + message);
+ else
+ System.out.println("PASS: " + message);
+ }
+
+ public static class AssertFailException extends Exception {
+ public AssertFailException(String message) {
+ super( message );
+ }
+ }
+}
diff --git a/src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java b/src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java
new file mode 100644
index 0000000000..216c986a8b
--- /dev/null
+++ b/src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2014-2016 the libsecp256k1 contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.bitcoin;
+
+/**
+ * This class holds the context reference used in native methods
+ * to handle ECDSA operations.
+ */
+public class Secp256k1Context {
+ private static final boolean enabled; //true if the library is loaded
+ private static final long context; //ref to pointer to context obj
+
+ static { //static initializer
+ boolean isEnabled = true;
+ long contextRef = -1;
+ try {
+ System.loadLibrary("secp256k1");
+ contextRef = secp256k1_init_context();
+ } catch (UnsatisfiedLinkError e) {
+ System.out.println("UnsatisfiedLinkError: " + e.toString());
+ isEnabled = false;
+ }
+ enabled = isEnabled;
+ context = contextRef;
+ }
+
+ public static boolean isEnabled() {
+ return enabled;
+ }
+
+ public static long getContext() {
+ if(!enabled) return -1; //sanity check
+ return context;
+ }
+
+ private static native long secp256k1_init_context();
+}
diff --git a/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c b/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c
index bb4cd70728..dba9524dd4 100644
--- a/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c
+++ b/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c
@@ -1,23 +1,411 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
#include "org_bitcoin_NativeSecp256k1.h"
#include "include/secp256k1.h"
+#include "include/secp256k1_ecdh.h"
+#include "include/secp256k1_recovery.h"
+#include "include/secp256k1_schnorr.h"
-JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify
- (JNIEnv* env, jclass classObject, jobject byteBufferObject)
+
+SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone
+ (JNIEnv* env, jclass classObject, jlong ctx_l)
+{
+ const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+
+ jlong ctx_clone_l = (uintptr_t) secp256k1_context_clone(ctx);
+
+ (void)classObject;(void)env;
+
+ return ctx_clone_l;
+
+}
+
+SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+
+ const unsigned char* seed = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
+
+ (void)classObject;
+
+ return secp256k1_context_randomize(ctx, seed);
+
+}
+
+SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context
+ (JNIEnv* env, jclass classObject, jlong ctx_l)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+
+ secp256k1_context_destroy(ctx);
+
+ (void)classObject;(void)env;
+}
+
+SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+
+ unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
+ const unsigned char* sigdata = { (unsigned char*) (data + 32) };
+ const unsigned char* pubdata = { (unsigned char*) (data + siglen + 32) };
+
+ secp256k1_ecdsa_signature sig;
+ secp256k1_pubkey pubkey;
+
+ int ret = secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigdata, siglen);
+
+ if( ret ) {
+ ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen);
+
+ if( ret ) {
+ ret = secp256k1_ecdsa_verify(ctx, &sig, data, &pubkey);
+ }
+ }
+
+ (void)classObject;
+
+ return ret;
+}
+
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+ unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
+ unsigned char* secKey = (unsigned char*) (data + 32);
+
+ jobjectArray retArray;
+ jbyteArray sigArray, intsByteArray;
+ unsigned char intsarray[2];
+
+ secp256k1_ecdsa_signature sig[72];
+
+ int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL );
+
+ unsigned char outputSer[72];
+ size_t outputLen = 72;
+
+ if( ret ) {
+ int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2;
+ }
+
+ intsarray[0] = outputLen;
+ intsarray[1] = ret;
+
+ retArray = (*env)->NewObjectArray(env, 2,
+ (*env)->FindClass(env, "[B"),
+ (*env)->NewByteArray(env, 1));
+
+ sigArray = (*env)->NewByteArray(env, outputLen);
+ (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer);
+ (*env)->SetObjectArrayElement(env, retArray, 0, sigArray);
+
+ intsByteArray = (*env)->NewByteArray(env, 2);
+ (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);
+ (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);
+
+ (void)classObject;
+
+ return retArray;
+}
+
+SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+ unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
+
+ (void)classObject;
+
+ return secp256k1_ec_seckey_verify(ctx, secKey);
+}
+
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+ const unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
+
+ secp256k1_pubkey pubkey;
+
+ jobjectArray retArray;
+ jbyteArray pubkeyArray, intsByteArray;
+ unsigned char intsarray[2];
+
+ int ret = secp256k1_ec_pubkey_create(ctx, &pubkey, secKey);
+
+ unsigned char outputSer[65];
+ size_t outputLen = 65;
+
+ if( ret ) {
+ int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2;
+ }
+
+ intsarray[0] = outputLen;
+ intsarray[1] = ret;
+
+ retArray = (*env)->NewObjectArray(env, 2,
+ (*env)->FindClass(env, "[B"),
+ (*env)->NewByteArray(env, 1));
+
+ pubkeyArray = (*env)->NewByteArray(env, outputLen);
+ (*env)->SetByteArrayRegion(env, pubkeyArray, 0, outputLen, (jbyte*)outputSer);
+ (*env)->SetObjectArrayElement(env, retArray, 0, pubkeyArray);
+
+ intsByteArray = (*env)->NewByteArray(env, 2);
+ (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);
+ (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);
+
+ (void)classObject;
+
+ return retArray;
+
+}
+
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+ unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
+ const unsigned char* tweak = (unsigned char*) (privkey + 32);
+
+ jobjectArray retArray;
+ jbyteArray privArray, intsByteArray;
+ unsigned char intsarray[2];
+
+ int privkeylen = 32;
+
+ int ret = secp256k1_ec_privkey_tweak_add(ctx, privkey, tweak);
+
+ intsarray[0] = privkeylen;
+ intsarray[1] = ret;
+
+ retArray = (*env)->NewObjectArray(env, 2,
+ (*env)->FindClass(env, "[B"),
+ (*env)->NewByteArray(env, 1));
+
+ privArray = (*env)->NewByteArray(env, privkeylen);
+ (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey);
+ (*env)->SetObjectArrayElement(env, retArray, 0, privArray);
+
+ intsByteArray = (*env)->NewByteArray(env, 2);
+ (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);
+ (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);
+
+ (void)classObject;
+
+ return retArray;
+}
+
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+ unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
+ const unsigned char* tweak = (unsigned char*) (privkey + 32);
+
+ jobjectArray retArray;
+ jbyteArray privArray, intsByteArray;
+ unsigned char intsarray[2];
+
+ int privkeylen = 32;
+
+ int ret = secp256k1_ec_privkey_tweak_mul(ctx, privkey, tweak);
+
+ intsarray[0] = privkeylen;
+ intsarray[1] = ret;
+
+ retArray = (*env)->NewObjectArray(env, 2,
+ (*env)->FindClass(env, "[B"),
+ (*env)->NewByteArray(env, 1));
+
+ privArray = (*env)->NewByteArray(env, privkeylen);
+ (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey);
+ (*env)->SetObjectArrayElement(env, retArray, 0, privArray);
+
+ intsByteArray = (*env)->NewByteArray(env, 2);
+ (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);
+ (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);
+
+ (void)classObject;
+
+ return retArray;
+}
+
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+/* secp256k1_pubkey* pubkey = (secp256k1_pubkey*) (*env)->GetDirectBufferAddress(env, byteBufferObject);*/
+ unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject);
+ const unsigned char* tweak = (unsigned char*) (pkey + publen);
+
+ jobjectArray retArray;
+ jbyteArray pubArray, intsByteArray;
+ unsigned char intsarray[2];
+ unsigned char outputSer[65];
+ size_t outputLen = 65;
+
+ secp256k1_pubkey pubkey;
+ int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen);
+
+ if( ret ) {
+ ret = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, tweak);
+ }
+
+ if( ret ) {
+ int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2;
+ }
+
+ intsarray[0] = outputLen;
+ intsarray[1] = ret;
+
+ retArray = (*env)->NewObjectArray(env, 2,
+ (*env)->FindClass(env, "[B"),
+ (*env)->NewByteArray(env, 1));
+
+ pubArray = (*env)->NewByteArray(env, outputLen);
+ (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer);
+ (*env)->SetObjectArrayElement(env, retArray, 0, pubArray);
+
+ intsByteArray = (*env)->NewByteArray(env, 2);
+ (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);
+ (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);
+
+ (void)classObject;
+
+ return retArray;
+}
+
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
{
- unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
- int sigLen = *((int*)(data + 32));
- int pubLen = *((int*)(data + 32 + 4));
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+ unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject);
+ const unsigned char* tweak = (unsigned char*) (pkey + publen);
+
+ jobjectArray retArray;
+ jbyteArray pubArray, intsByteArray;
+ unsigned char intsarray[2];
+ unsigned char outputSer[65];
+ size_t outputLen = 65;
+
+ secp256k1_pubkey pubkey;
+ int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen);
+
+ if ( ret ) {
+ ret = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, tweak);
+ }
+
+ if( ret ) {
+ int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2;
+ }
+
+ intsarray[0] = outputLen;
+ intsarray[1] = ret;
+
+ retArray = (*env)->NewObjectArray(env, 2,
+ (*env)->FindClass(env, "[B"),
+ (*env)->NewByteArray(env, 1));
+
+ pubArray = (*env)->NewByteArray(env, outputLen);
+ (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer);
+ (*env)->SetObjectArrayElement(env, retArray, 0, pubArray);
- return secp256k1_ecdsa_verify(data, 32, data+32+8, sigLen, data+32+8+sigLen, pubLen);
+ intsByteArray = (*env)->NewByteArray(env, 2);
+ (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);
+ (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);
+
+ (void)classObject;
+
+ return retArray;
}
-static void __javasecp256k1_attach(void) __attribute__((constructor));
-static void __javasecp256k1_detach(void) __attribute__((destructor));
+SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1pubkey_1combine
+ (JNIEnv * env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint numkeys)
+{
+ (void)classObject;(void)env;(void)byteBufferObject;(void)ctx_l;(void)numkeys;
-static void __javasecp256k1_attach(void) {
- secp256k1_start(SECP256K1_START_VERIFY);
+ return 0;
}
-static void __javasecp256k1_detach(void) {
- secp256k1_stop();
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1schnorr_1sign
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+ unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);
+ unsigned char* secKey = (unsigned char*) (data + 32);
+
+ jobjectArray retArray;
+ jbyteArray sigArray, intsByteArray;
+ unsigned char intsarray[1];
+ unsigned char sig[64];
+
+ int ret = secp256k1_schnorr_sign(ctx, sig, data, secKey, NULL, NULL);
+
+ intsarray[0] = ret;
+
+ retArray = (*env)->NewObjectArray(env, 2,
+ (*env)->FindClass(env, "[B"),
+ (*env)->NewByteArray(env, 1));
+
+ sigArray = (*env)->NewByteArray(env, 64);
+ (*env)->SetByteArrayRegion(env, sigArray, 0, 64, (jbyte*)sig);
+ (*env)->SetObjectArrayElement(env, retArray, 0, sigArray);
+
+ intsByteArray = (*env)->NewByteArray(env, 1);
+ (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray);
+ (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);
+
+ (void)classObject;
+
+ return retArray;
+}
+
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
+{
+ secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
+ const unsigned char* secdata = (*env)->GetDirectBufferAddress(env, byteBufferObject);
+ const unsigned char* pubdata = (const unsigned char*) (secdata + 32);
+
+ jobjectArray retArray;
+ jbyteArray outArray, intsByteArray;
+ unsigned char intsarray[1];
+ secp256k1_pubkey pubkey;
+ unsigned char nonce_res[32];
+ size_t outputLen = 32;
+
+ int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen);
+
+ if (ret) {
+ ret = secp256k1_ecdh(
+ ctx,
+ nonce_res,
+ &pubkey,
+ secdata
+ );
+ }
+
+ intsarray[0] = ret;
+
+ retArray = (*env)->NewObjectArray(env, 2,
+ (*env)->FindClass(env, "[B"),
+ (*env)->NewByteArray(env, 1));
+
+ outArray = (*env)->NewByteArray(env, outputLen);
+ (*env)->SetByteArrayRegion(env, outArray, 0, 32, (jbyte*)nonce_res);
+ (*env)->SetObjectArrayElement(env, retArray, 0, outArray);
+
+ intsByteArray = (*env)->NewByteArray(env, 1);
+ (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray);
+ (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);
+
+ (void)classObject;
+
+ return retArray;
}
diff --git a/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h b/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h
index d7fb004fa8..4125a1f523 100644
--- a/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h
+++ b/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h
@@ -1,5 +1,6 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
+#include "include/secp256k1.h"
/* Header for class org_bitcoin_NativeSecp256k1 */
#ifndef _Included_org_bitcoin_NativeSecp256k1
@@ -9,11 +10,116 @@ extern "C" {
#endif
/*
* Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_ctx_clone
+ * Signature: (J)J
+ */
+SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_context_randomize
+ * Signature: (Ljava/nio/ByteBuffer;J)I
+ */
+SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize
+ (JNIEnv *, jclass, jobject, jlong);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_privkey_tweak_add
+ * Signature: (Ljava/nio/ByteBuffer;J)[[B
+ */
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add
+ (JNIEnv *, jclass, jobject, jlong);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_privkey_tweak_mul
+ * Signature: (Ljava/nio/ByteBuffer;J)[[B
+ */
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul
+ (JNIEnv *, jclass, jobject, jlong);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_pubkey_tweak_add
+ * Signature: (Ljava/nio/ByteBuffer;JI)[[B
+ */
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add
+ (JNIEnv *, jclass, jobject, jlong, jint);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_pubkey_tweak_mul
+ * Signature: (Ljava/nio/ByteBuffer;JI)[[B
+ */
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul
+ (JNIEnv *, jclass, jobject, jlong, jint);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_destroy_context
+ * Signature: (J)V
+ */
+SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
* Method: secp256k1_ecdsa_verify
- * Signature: (Ljava/nio/ByteBuffer;)I
+ * Signature: (Ljava/nio/ByteBuffer;JII)I
+ */
+SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify
+ (JNIEnv *, jclass, jobject, jlong, jint, jint);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_ecdsa_sign
+ * Signature: (Ljava/nio/ByteBuffer;J)[[B
+ */
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign
+ (JNIEnv *, jclass, jobject, jlong);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_ec_seckey_verify
+ * Signature: (Ljava/nio/ByteBuffer;J)I
+ */
+SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify
+ (JNIEnv *, jclass, jobject, jlong);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_ec_pubkey_create
+ * Signature: (Ljava/nio/ByteBuffer;J)[[B
*/
-JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify
- (JNIEnv *, jclass, jobject);
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create
+ (JNIEnv *, jclass, jobject, jlong);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_ec_pubkey_parse
+ * Signature: (Ljava/nio/ByteBuffer;JI)[[B
+ */
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse
+ (JNIEnv *, jclass, jobject, jlong, jint);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_schnorr_sign
+ * Signature: (Ljava/nio/ByteBuffer;JI)[[B
+ */
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1schnorr_1sign
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l);
+
+/*
+ * Class: org_bitcoin_NativeSecp256k1
+ * Method: secp256k1_ecdh
+ * Signature: (Ljava/nio/ByteBuffer;JI)[[B
+ */
+SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh
+ (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen);
+
#ifdef __cplusplus
}
diff --git a/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c b/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c
new file mode 100644
index 0000000000..a52939e7e7
--- /dev/null
+++ b/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c
@@ -0,0 +1,15 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include "org_bitcoin_Secp256k1Context.h"
+#include "include/secp256k1.h"
+
+SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context
+ (JNIEnv* env, jclass classObject)
+{
+ secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
+
+ (void)classObject;(void)env;
+
+ return (uintptr_t)ctx;
+}
+
diff --git a/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h b/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h
new file mode 100644
index 0000000000..0d2bc84b7f
--- /dev/null
+++ b/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h
@@ -0,0 +1,22 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+#include "include/secp256k1.h"
+/* Header for class org_bitcoin_Secp256k1Context */
+
+#ifndef _Included_org_bitcoin_Secp256k1Context
+#define _Included_org_bitcoin_Secp256k1Context
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: org_bitcoin_Secp256k1Context
+ * Method: secp256k1_init_context
+ * Signature: ()J
+ */
+SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context
+ (JNIEnv *, jclass);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/secp256k1/src/modules/ecdh/Makefile.am.include b/src/secp256k1/src/modules/ecdh/Makefile.am.include
index 670b9c1152..e3088b4697 100644
--- a/src/secp256k1/src/modules/ecdh/Makefile.am.include
+++ b/src/secp256k1/src/modules/ecdh/Makefile.am.include
@@ -4,5 +4,5 @@ noinst_HEADERS += src/modules/ecdh/tests_impl.h
if USE_BENCHMARK
noinst_PROGRAMS += bench_ecdh
bench_ecdh_SOURCES = src/bench_ecdh.c
-bench_ecdh_LDADD = libsecp256k1.la $(SECP_LIBS)
+bench_ecdh_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB)
endif
diff --git a/src/secp256k1/src/modules/recovery/Makefile.am.include b/src/secp256k1/src/modules/recovery/Makefile.am.include
index 5de3ea33ea..bf23c26e71 100644
--- a/src/secp256k1/src/modules/recovery/Makefile.am.include
+++ b/src/secp256k1/src/modules/recovery/Makefile.am.include
@@ -4,5 +4,5 @@ noinst_HEADERS += src/modules/recovery/tests_impl.h
if USE_BENCHMARK
noinst_PROGRAMS += bench_recover
bench_recover_SOURCES = src/bench_recover.c
-bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS)
+bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB)
endif
diff --git a/src/secp256k1/src/modules/schnorr/Makefile.am.include b/src/secp256k1/src/modules/schnorr/Makefile.am.include
index b3bfa7d5cc..f1af8e8325 100644
--- a/src/secp256k1/src/modules/schnorr/Makefile.am.include
+++ b/src/secp256k1/src/modules/schnorr/Makefile.am.include
@@ -6,5 +6,5 @@ noinst_HEADERS += src/modules/schnorr/tests_impl.h
if USE_BENCHMARK
noinst_PROGRAMS += bench_schnorr_verify
bench_schnorr_verify_SOURCES = src/bench_schnorr_verify.c
-bench_schnorr_verify_LDADD = libsecp256k1.la $(SECP_LIBS)
+bench_schnorr_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB)
endif
diff --git a/src/secp256k1/src/num.h b/src/secp256k1/src/num.h
index ebfa71eb44..7bb9c5be8c 100644
--- a/src/secp256k1/src/num.h
+++ b/src/secp256k1/src/num.h
@@ -32,6 +32,9 @@ static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsi
/** Compute a modular inverse. The input must be less than the modulus. */
static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m);
+/** Compute the jacobi symbol (a|b). b must be positive and odd. */
+static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b);
+
/** Compare the absolute value of two numbers. */
static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b);
@@ -57,6 +60,9 @@ static void secp256k1_num_shift(secp256k1_num *r, int bits);
/** Check whether a number is zero. */
static int secp256k1_num_is_zero(const secp256k1_num *a);
+/** Check whether a number is one. */
+static int secp256k1_num_is_one(const secp256k1_num *a);
+
/** Check whether a number is strictly negative. */
static int secp256k1_num_is_neg(const secp256k1_num *a);
diff --git a/src/secp256k1/src/num_gmp_impl.h b/src/secp256k1/src/num_gmp_impl.h
index 7b6a89719a..3a46495eea 100644
--- a/src/secp256k1/src/num_gmp_impl.h
+++ b/src/secp256k1/src/num_gmp_impl.h
@@ -144,6 +144,32 @@ static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a,
memset(v, 0, sizeof(v));
}
+static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b) {
+ int ret;
+ mpz_t ga, gb;
+ secp256k1_num_sanity(a);
+ secp256k1_num_sanity(b);
+ VERIFY_CHECK(!b->neg && (b->limbs > 0) && (b->data[0] & 1));
+
+ mpz_inits(ga, gb, NULL);
+
+ mpz_import(gb, b->limbs, -1, sizeof(mp_limb_t), 0, 0, b->data);
+ mpz_import(ga, a->limbs, -1, sizeof(mp_limb_t), 0, 0, a->data);
+ if (a->neg) {
+ mpz_neg(ga, ga);
+ }
+
+ ret = mpz_jacobi(ga, gb);
+
+ mpz_clears(ga, gb, NULL);
+
+ return ret;
+}
+
+static int secp256k1_num_is_one(const secp256k1_num *a) {
+ return (a->limbs == 1 && a->data[0] == 1);
+}
+
static int secp256k1_num_is_zero(const secp256k1_num *a) {
return (a->limbs == 1 && a->data[0] == 0);
}
diff --git a/src/secp256k1/src/scalar_impl.h b/src/secp256k1/src/scalar_impl.h
index 88ea97de86..c5baf4df41 100644
--- a/src/secp256k1/src/scalar_impl.h
+++ b/src/secp256k1/src/scalar_impl.h
@@ -7,8 +7,6 @@
#ifndef _SECP256K1_SCALAR_IMPL_H_
#define _SECP256K1_SCALAR_IMPL_H_
-#include <string.h>
-
#include "group.h"
#include "scalar.h"
diff --git a/src/secp256k1/src/secp256k1.c b/src/secp256k1/src/secp256k1.c
index 62d192baeb..7973d60c36 100644
--- a/src/secp256k1/src/secp256k1.c
+++ b/src/secp256k1/src/secp256k1.c
@@ -4,8 +4,6 @@
* file COPYING or http://www.opensource.org/licenses/mit-license.php.*
**********************************************************************/
-#define SECP256K1_BUILD (1)
-
#include "include/secp256k1.h"
#include "util.h"
@@ -152,7 +150,6 @@ static void secp256k1_pubkey_save(secp256k1_pubkey* pubkey, secp256k1_ge* ge) {
int secp256k1_ec_pubkey_parse(const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen) {
secp256k1_ge Q;
- (void)ctx;
VERIFY_CHECK(ctx != NULL);
ARG_CHECK(pubkey != NULL);
memset(pubkey, 0, sizeof(*pubkey));
@@ -170,7 +167,6 @@ int secp256k1_ec_pubkey_serialize(const secp256k1_context* ctx, unsigned char *o
size_t len;
int ret = 0;
- (void)ctx;
VERIFY_CHECK(ctx != NULL);
ARG_CHECK(outputlen != NULL);
ARG_CHECK(*outputlen >= ((flags & SECP256K1_FLAGS_BIT_COMPRESSION) ? 33 : 65));
@@ -216,7 +212,7 @@ static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature* sig, const
int secp256k1_ecdsa_signature_parse_der(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) {
secp256k1_scalar r, s;
- (void)ctx;
+ VERIFY_CHECK(ctx != NULL);
ARG_CHECK(sig != NULL);
ARG_CHECK(input != NULL);
@@ -234,7 +230,7 @@ int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context* ctx, secp25
int ret = 1;
int overflow = 0;
- (void)ctx;
+ VERIFY_CHECK(ctx != NULL);
ARG_CHECK(sig != NULL);
ARG_CHECK(input64 != NULL);
@@ -253,7 +249,7 @@ int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context* ctx, secp25
int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature* sig) {
secp256k1_scalar r, s;
- (void)ctx;
+ VERIFY_CHECK(ctx != NULL);
ARG_CHECK(output != NULL);
ARG_CHECK(outputlen != NULL);
ARG_CHECK(sig != NULL);
@@ -265,7 +261,7 @@ int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context* ctx, unsign
int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, const secp256k1_ecdsa_signature* sig) {
secp256k1_scalar r, s;
- (void)ctx;
+ VERIFY_CHECK(ctx != NULL);
ARG_CHECK(output64 != NULL);
ARG_CHECK(sig != NULL);
@@ -398,7 +394,6 @@ int secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char
int overflow;
VERIFY_CHECK(ctx != NULL);
ARG_CHECK(seckey != NULL);
- (void)ctx;
secp256k1_scalar_set_b32(&sec, seckey, &overflow);
ret = !overflow && !secp256k1_scalar_is_zero(&sec);
@@ -437,7 +432,6 @@ int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *
VERIFY_CHECK(ctx != NULL);
ARG_CHECK(seckey != NULL);
ARG_CHECK(tweak != NULL);
- (void)ctx;
secp256k1_scalar_set_b32(&term, tweak, &overflow);
secp256k1_scalar_set_b32(&sec, seckey, NULL);
@@ -485,7 +479,6 @@ int secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *
VERIFY_CHECK(ctx != NULL);
ARG_CHECK(seckey != NULL);
ARG_CHECK(tweak != NULL);
- (void)ctx;
secp256k1_scalar_set_b32(&factor, tweak, &overflow);
secp256k1_scalar_set_b32(&sec, seckey, NULL);
diff --git a/src/secp256k1/src/tests.c b/src/secp256k1/src/tests.c
index 687a5f2fdd..b32cb90813 100644
--- a/src/secp256k1/src/tests.c
+++ b/src/secp256k1/src/tests.c
@@ -473,6 +473,8 @@ void test_num_negate(void) {
}
void test_num_add_sub(void) {
+ int i;
+ secp256k1_scalar s;
secp256k1_num n1;
secp256k1_num n2;
secp256k1_num n1p2, n2p1, n1m2, n2m1;
@@ -498,6 +500,110 @@ void test_num_add_sub(void) {
CHECK(!secp256k1_num_eq(&n2p1, &n1));
secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */
CHECK(secp256k1_num_eq(&n2p1, &n1));
+
+ /* check is_one */
+ secp256k1_scalar_set_int(&s, 1);
+ secp256k1_scalar_get_num(&n1, &s);
+ CHECK(secp256k1_num_is_one(&n1));
+ /* check that 2^n + 1 is never 1 */
+ secp256k1_scalar_get_num(&n2, &s);
+ for (i = 0; i < 250; ++i) {
+ secp256k1_num_add(&n1, &n1, &n1); /* n1 *= 2 */
+ secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = n1 + 1 */
+ CHECK(!secp256k1_num_is_one(&n1p2));
+ }
+}
+
+void test_num_mod(void) {
+ int i;
+ secp256k1_scalar s;
+ secp256k1_num order, n;
+
+ /* check that 0 mod anything is 0 */
+ random_scalar_order_test(&s);
+ secp256k1_scalar_get_num(&order, &s);
+ secp256k1_scalar_set_int(&s, 0);
+ secp256k1_scalar_get_num(&n, &s);
+ secp256k1_num_mod(&n, &order);
+ CHECK(secp256k1_num_is_zero(&n));
+
+ /* check that anything mod 1 is 0 */
+ secp256k1_scalar_set_int(&s, 1);
+ secp256k1_scalar_get_num(&order, &s);
+ secp256k1_scalar_get_num(&n, &s);
+ secp256k1_num_mod(&n, &order);
+ CHECK(secp256k1_num_is_zero(&n));
+
+ /* check that increasing the number past 2^256 does not break this */
+ random_scalar_order_test(&s);
+ secp256k1_scalar_get_num(&n, &s);
+ /* multiply by 2^8, which'll test this case with high probability */
+ for (i = 0; i < 8; ++i) {
+ secp256k1_num_add(&n, &n, &n);
+ }
+ secp256k1_num_mod(&n, &order);
+ CHECK(secp256k1_num_is_zero(&n));
+}
+
+void test_num_jacobi(void) {
+ secp256k1_scalar sqr;
+ secp256k1_scalar small;
+ secp256k1_scalar five; /* five is not a quadratic residue */
+ secp256k1_num order, n;
+ int i;
+ /* squares mod 5 are 1, 4 */
+ const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 };
+
+ /* check some small values with 5 as the order */
+ secp256k1_scalar_set_int(&five, 5);
+ secp256k1_scalar_get_num(&order, &five);
+ for (i = 0; i < 10; ++i) {
+ secp256k1_scalar_set_int(&small, i);
+ secp256k1_scalar_get_num(&n, &small);
+ CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]);
+ }
+
+ /** test large values with 5 as group order */
+ secp256k1_scalar_get_num(&order, &five);
+ /* we first need a scalar which is not a multiple of 5 */
+ do {
+ secp256k1_num fiven;
+ random_scalar_order_test(&sqr);
+ secp256k1_scalar_get_num(&fiven, &five);
+ secp256k1_scalar_get_num(&n, &sqr);
+ secp256k1_num_mod(&n, &fiven);
+ } while (secp256k1_num_is_zero(&n));
+ /* next force it to be a residue. 2 is a nonresidue mod 5 so we can
+ * just multiply by two, i.e. add the number to itself */
+ if (secp256k1_num_jacobi(&n, &order) == -1) {
+ secp256k1_num_add(&n, &n, &n);
+ }
+
+ /* test residue */
+ CHECK(secp256k1_num_jacobi(&n, &order) == 1);
+ /* test nonresidue */
+ secp256k1_num_add(&n, &n, &n);
+ CHECK(secp256k1_num_jacobi(&n, &order) == -1);
+
+ /** test with secp group order as order */
+ secp256k1_scalar_order_get_num(&order);
+ random_scalar_order_test(&sqr);
+ secp256k1_scalar_sqr(&sqr, &sqr);
+ /* test residue */
+ secp256k1_scalar_get_num(&n, &sqr);
+ CHECK(secp256k1_num_jacobi(&n, &order) == 1);
+ /* test nonresidue */
+ secp256k1_scalar_mul(&sqr, &sqr, &five);
+ secp256k1_scalar_get_num(&n, &sqr);
+ CHECK(secp256k1_num_jacobi(&n, &order) == -1);
+ /* test multiple of the order*/
+ CHECK(secp256k1_num_jacobi(&order, &order) == 0);
+
+ /* check one less than the order */
+ secp256k1_scalar_set_int(&small, 1);
+ secp256k1_scalar_get_num(&n, &small);
+ secp256k1_num_sub(&n, &order, &n);
+ CHECK(secp256k1_num_jacobi(&n, &order) == 1); /* sage confirms this is 1 */
}
void run_num_smalltests(void) {
@@ -505,6 +611,8 @@ void run_num_smalltests(void) {
for (i = 0; i < 100*count; i++) {
test_num_negate();
test_num_add_sub();
+ test_num_mod();
+ test_num_jacobi();
}
}
#endif
@@ -689,6 +797,10 @@ void scalar_test(void) {
secp256k1_scalar_inverse(&inv, &inv);
/* Inverting one must result in one. */
CHECK(secp256k1_scalar_is_one(&inv));
+#ifndef USE_NUM_NONE
+ secp256k1_scalar_get_num(&invnum, &inv);
+ CHECK(secp256k1_num_is_one(&invnum));
+#endif
}
}
@@ -855,7 +967,7 @@ void run_scalar_tests(void) {
secp256k1_scalar zzv;
#endif
int overflow;
- unsigned char chal[32][2][32] = {
+ unsigned char chal[33][2][32] = {
{{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
@@ -1111,9 +1223,17 @@ void run_scalar_tests(void) {
{0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}}
+ 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},
+ {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
+ 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
+ 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},
+ {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
+ 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
+ 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}
};
- unsigned char res[32][2][32] = {
+ unsigned char res[33][2][32] = {
{{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,
0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,
0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,
@@ -1369,10 +1489,18 @@ void run_scalar_tests(void) {
{0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,
0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,
0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,
- 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}}
+ 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},
+ {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
+ 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
+ 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
+ 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},
+ {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
+ 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
+ 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
+ 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}
};
secp256k1_scalar_set_int(&one, 1);
- for (i = 0; i < 32; i++) {
+ for (i = 0; i < 33; i++) {
secp256k1_scalar_set_b32(&x, chal[i][0], &overflow);
CHECK(!overflow);
secp256k1_scalar_set_b32(&y, chal[i][1], &overflow);
@@ -1446,7 +1574,7 @@ void random_fe_non_zero(secp256k1_fe *nz) {
void random_fe_non_square(secp256k1_fe *ns) {
secp256k1_fe r;
random_fe_non_zero(ns);
- if (secp256k1_fe_sqrt_var(&r, ns)) {
+ if (secp256k1_fe_sqrt(&r, ns)) {
secp256k1_fe_negate(ns, ns, 1);
}
}
@@ -1641,7 +1769,7 @@ void run_sqr(void) {
void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) {
secp256k1_fe r1, r2;
- int v = secp256k1_fe_sqrt_var(&r1, a);
+ int v = secp256k1_fe_sqrt(&r1, a);
CHECK((v == 0) == (k == NULL));
if (k != NULL) {
@@ -1951,8 +2079,8 @@ void test_add_neg_y_diff_x(void) {
* of the sum to be wrong (since infinity has no xy coordinates).
* HOWEVER, if the x-coordinates are different, infinity is the
* wrong answer, and such degeneracies are exposed. This is the
- * root of https://github.com/bitcoin/secp256k1/issues/257 which
- * this test is a regression test for.
+ * root of https://github.com/bitcoin-core/secp256k1/issues/257
+ * which this test is a regression test for.
*
* These points were generated in sage as
* # secp256k1 params
@@ -2051,15 +2179,16 @@ void run_ec_combine(void) {
void test_group_decompress(const secp256k1_fe* x) {
/* The input itself, normalized. */
secp256k1_fe fex = *x;
- secp256k1_fe tmp;
+ secp256k1_fe fez;
/* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */
secp256k1_ge ge_quad, ge_even, ge_odd;
+ secp256k1_gej gej_quad;
/* Return values of the above calls. */
int res_quad, res_even, res_odd;
secp256k1_fe_normalize_var(&fex);
- res_quad = secp256k1_ge_set_xquad_var(&ge_quad, &fex);
+ res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex);
res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);
res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);
@@ -2085,13 +2214,29 @@ void test_group_decompress(const secp256k1_fe* x) {
CHECK(secp256k1_fe_equal_var(&ge_odd.x, x));
/* Check that the Y coordinate result in ge_quad is a square. */
- CHECK(secp256k1_fe_sqrt_var(&tmp, &ge_quad.y));
- secp256k1_fe_sqr(&tmp, &tmp);
- CHECK(secp256k1_fe_equal_var(&tmp, &ge_quad.y));
+ CHECK(secp256k1_fe_is_quad_var(&ge_quad.y));
/* Check odd/even Y in ge_odd, ge_even. */
CHECK(secp256k1_fe_is_odd(&ge_odd.y));
CHECK(!secp256k1_fe_is_odd(&ge_even.y));
+
+ /* Check secp256k1_gej_has_quad_y_var. */
+ secp256k1_gej_set_ge(&gej_quad, &ge_quad);
+ CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
+ do {
+ random_fe_test(&fez);
+ } while (secp256k1_fe_is_zero(&fez));
+ secp256k1_gej_rescale(&gej_quad, &fez);
+ CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
+ secp256k1_gej_neg(&gej_quad, &gej_quad);
+ CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));
+ do {
+ random_fe_test(&fez);
+ } while (secp256k1_fe_is_zero(&fez));
+ secp256k1_gej_rescale(&gej_quad, &fez);
+ CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));
+ secp256k1_gej_neg(&gej_quad, &gej_quad);
+ CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
}
}
@@ -2383,9 +2528,7 @@ void test_constant_wnaf(const secp256k1_scalar *number, int w) {
secp256k1_scalar x, shift;
int wnaf[256] = {0};
int i;
-#ifdef USE_ENDOMORPHISM
int skew;
-#endif
secp256k1_scalar num = *number;
secp256k1_scalar_set_int(&x, 0);
@@ -2395,10 +2538,8 @@ void test_constant_wnaf(const secp256k1_scalar *number, int w) {
for (i = 0; i < 16; ++i) {
secp256k1_scalar_shr_int(&num, 8);
}
- skew = secp256k1_wnaf_const(wnaf, num, w);
-#else
- secp256k1_wnaf_const(wnaf, num, w);
#endif
+ skew = secp256k1_wnaf_const(wnaf, num, w);
for (i = WNAF_SIZE(w); i >= 0; --i) {
secp256k1_scalar t;
@@ -2417,10 +2558,8 @@ void test_constant_wnaf(const secp256k1_scalar *number, int w) {
}
secp256k1_scalar_add(&x, &x, &t);
}
-#ifdef USE_ENDOMORPHISM
- /* Skew num because when encoding 128-bit numbers as odd we use an offset */
+ /* Skew num because when encoding numbers as odd we use an offset */
secp256k1_scalar_cadd_bit(&num, skew == 2, 1);
-#endif
CHECK(secp256k1_scalar_eq(&x, &num));
}
@@ -3484,12 +3623,14 @@ void run_ecdsa_end_to_end(void) {
int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) {
static const unsigned char zeroes[32] = {0};
+#ifdef ENABLE_OPENSSL_TESTS
static const unsigned char max_scalar[32] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40
};
+#endif
int ret = 0;
@@ -3607,13 +3748,13 @@ static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) {
static void damage_array(unsigned char *sig, size_t *len) {
int pos;
int action = secp256k1_rand_bits(3);
- if (action < 1) {
+ if (action < 1 && *len > 3) {
/* Delete a byte. */
pos = secp256k1_rand_int(*len);
memmove(sig + pos, sig + pos + 1, *len - pos - 1);
(*len)--;
return;
- } else if (action < 2) {
+ } else if (action < 2 && *len < 2048) {
/* Insert a byte. */
pos = secp256k1_rand_int(1 + *len);
memmove(sig + pos + 1, sig + pos, *len - pos);
@@ -3785,6 +3926,7 @@ void run_ecdsa_der_parse(void) {
int certainly_der = 0;
int certainly_not_der = 0;
random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der);
+ CHECK(buflen <= 2048);
for (j = 0; j < 16; j++) {
int ret = 0;
if (j > 0) {
diff --git a/src/serialize.h b/src/serialize.h
index 5fe7fc1f35..1f51da82ff 100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -44,33 +44,32 @@ inline T* NCONST_PTR(const T* val)
return const_cast<T*>(val);
}
-/**
- * Get begin pointer of vector (non-const version).
- * @note These functions avoid the undefined case of indexing into an empty
- * vector, as well as that of indexing after the end of the vector.
+/**
+ * Important: Do not use the following functions in new code, but use v.data()
+ * and v.data() + v.size() respectively directly. They were once introduced to
+ * have a compatible, safe way to get the begin and end pointer of a vector.
+ * However with C++11 the language has built-in functionality for this and it's
+ * more readable to just use that.
*/
template <typename V>
inline typename V::value_type* begin_ptr(V& v)
{
- return v.empty() ? NULL : &v[0];
+ return v.data();
}
-/** Get begin pointer of vector (const version) */
template <typename V>
inline const typename V::value_type* begin_ptr(const V& v)
{
- return v.empty() ? NULL : &v[0];
+ return v.data();
}
-/** Get end pointer of vector (non-const version) */
template <typename V>
inline typename V::value_type* end_ptr(V& v)
{
- return v.empty() ? NULL : (&v[0] + v.size());
+ return v.data() + v.size();
}
-/** Get end pointer of vector (const version) */
template <typename V>
inline const typename V::value_type* end_ptr(const V& v)
{
- return v.empty() ? NULL : (&v[0] + v.size());
+ return v.data() + v.size();
}
/*
@@ -322,8 +321,8 @@ uint64_t ReadCompactSize(Stream& is)
* 0: [0x00] 256: [0x81 0x00]
* 1: [0x01] 16383: [0xFE 0x7F]
* 127: [0x7F] 16384: [0xFF 0x00]
- * 128: [0x80 0x00] 16511: [0x80 0xFF 0x7F]
- * 255: [0x80 0x7F] 65535: [0x82 0xFD 0x7F]
+ * 128: [0x80 0x00] 16511: [0xFF 0x7F]
+ * 255: [0x80 0x7F] 65535: [0x82 0xFE 0x7F]
* 2^32: [0x8E 0xFE 0xFE 0xFF 0x00]
*/
@@ -373,6 +372,7 @@ I ReadVarInt(Stream& is)
#define FLATDATA(obj) REF(CFlatData((char*)&(obj), (char*)&(obj) + sizeof(obj)))
#define VARINT(obj) REF(WrapVarInt(REF(obj)))
+#define COMPACTSIZE(obj) REF(CCompactSize(REF(obj)))
#define LIMITED_STRING(obj,n) REF(LimitedString< n >(REF(obj)))
/**
@@ -443,6 +443,28 @@ public:
}
};
+class CCompactSize
+{
+protected:
+ uint64_t &n;
+public:
+ CCompactSize(uint64_t& nIn) : n(nIn) { }
+
+ unsigned int GetSerializeSize(int, int) const {
+ return GetSizeOfCompactSize(n);
+ }
+
+ template<typename Stream>
+ void Serialize(Stream &s, int, int) const {
+ WriteCompactSize<Stream>(s, n);
+ }
+
+ template<typename Stream>
+ void Unserialize(Stream& s, int, int) {
+ n = ReadCompactSize<Stream>(s);
+ }
+};
+
template<size_t Limit>
class LimitedString
{
diff --git a/src/streams.h b/src/streams.h
index 8610e4d18e..7132364eb1 100644
--- a/src/streams.h
+++ b/src/streams.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
@@ -22,6 +22,39 @@
#include <utility>
#include <vector>
+template<typename Stream>
+class OverrideStream
+{
+ Stream* stream;
+public:
+ const int nType;
+ const int nVersion;
+
+ OverrideStream(Stream* stream_, int nType_, int nVersion_) : stream(stream_), nType(nType_), nVersion(nVersion_) {}
+
+ template<typename T>
+ OverrideStream<Stream>& operator<<(const T& obj)
+ {
+ // Serialize to this stream
+ ::Serialize(*this->stream, obj, nType, nVersion);
+ return (*this);
+ }
+
+ template<typename T>
+ OverrideStream<Stream>& operator>>(T& obj)
+ {
+ // Unserialize from this stream
+ ::Unserialize(*this->stream, obj, nType, nVersion);
+ return (*this);
+ }
+};
+
+template<typename S>
+OverrideStream<S> WithOrVersion(S* s, int nVersionFlag)
+{
+ return OverrideStream<S>(s, s->GetType(), s->GetVersion() | nVersionFlag);
+}
+
/** Double ended buffer combining vector and stream-like interfaces.
*
* >> and << read and write unformatted data using the above serialization templates.
@@ -240,7 +273,9 @@ public:
CDataStream& ignore(int nSize)
{
// Ignore from the beginning of the buffer
- assert(nSize >= 0);
+ if (nSize < 0) {
+ throw std::ios_base::failure("CDataStream::ignore(): nSize negative");
+ }
unsigned int nReadPosNext = nReadPos + nSize;
if (nReadPosNext >= vch.size())
{
@@ -404,6 +439,20 @@ public:
return (*this);
}
+ CAutoFile& ignore(size_t nSize)
+ {
+ if (!file)
+ throw std::ios_base::failure("CAutoFile::ignore: file handle is NULL");
+ unsigned char data[4096];
+ while (nSize > 0) {
+ size_t nNow = std::min<size_t>(nSize, sizeof(data));
+ if (fread(data, 1, nNow, file) != nNow)
+ throw std::ios_base::failure(feof(file) ? "CAutoFile::ignore: end of file" : "CAutoFile::read: fread failed");
+ nSize -= nNow;
+ }
+ return (*this);
+ }
+
CAutoFile& write(const char* pch, size_t nSize)
{
if (!file)
diff --git a/src/support/allocators/secure.h b/src/support/allocators/secure.h
index 5e7bb66ea2..1ec40fe830 100644
--- a/src/support/allocators/secure.h
+++ b/src/support/allocators/secure.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
diff --git a/src/support/allocators/zeroafterfree.h b/src/support/allocators/zeroafterfree.h
index 41e23392e8..28a940ad1b 100644
--- a/src/support/allocators/zeroafterfree.h
+++ b/src/support/allocators/zeroafterfree.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
diff --git a/src/support/pagelocker.cpp b/src/support/pagelocker.cpp
index 440e0a5193..7cea2d88c5 100644
--- a/src/support/pagelocker.cpp
+++ b/src/support/pagelocker.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2013 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.
diff --git a/src/support/pagelocker.h b/src/support/pagelocker.h
index 88b95cce73..538bf39453 100644
--- a/src/support/pagelocker.h
+++ b/src/support/pagelocker.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
@@ -28,11 +28,11 @@ template <class Locker>
class LockedPageManagerBase
{
public:
- LockedPageManagerBase(size_t page_size) : page_size(page_size)
+ LockedPageManagerBase(size_t _page_size) : page_size(_page_size)
{
// Determine bitmask for extracting page from address
- assert(!(page_size & (page_size - 1))); // size must be power of two
- page_mask = ~(page_size - 1);
+ assert(!(_page_size & (_page_size - 1))); // size must be power of two
+ page_mask = ~(_page_size - 1);
}
~LockedPageManagerBase()
diff --git a/src/sync.cpp b/src/sync.cpp
index 1837e8d53d..641ed2c8ca 100644
--- a/src/sync.cpp
+++ b/src/sync.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2012 The Bitcoin Core developers
+// 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.
@@ -56,11 +56,24 @@ private:
};
typedef std::vector<std::pair<void*, CLockLocation> > LockStack;
+typedef std::map<std::pair<void*, void*>, LockStack> LockOrders;
+typedef std::set<std::pair<void*, void*> > InvLockOrders;
-static boost::mutex dd_mutex;
-static std::map<std::pair<void*, void*>, LockStack> lockorders;
-static boost::thread_specific_ptr<LockStack> lockstack;
+struct LockData {
+ // Very ugly hack: as the global constructs and destructors run single
+ // threaded, we use this boolean to know whether LockData still exists,
+ // as DeleteLock can get called by global CCriticalSection destructors
+ // after LockData disappears.
+ bool available;
+ LockData() : available(true) {}
+ ~LockData() { available = false; }
+ LockOrders lockorders;
+ InvLockOrders invlockorders;
+ boost::mutex dd_mutex;
+} static lockdata;
+
+boost::thread_specific_ptr<LockStack> lockstack;
static void potential_deadlock_detected(const std::pair<void*, void*>& mismatch, const LockStack& s1, const LockStack& s2)
{
@@ -117,7 +130,7 @@ static void push_lock(void* c, const CLockLocation& locklocation, bool fTry)
if (lockstack.get() == NULL)
lockstack.reset(new LockStack);
- dd_mutex.lock();
+ boost::unique_lock<boost::mutex> lock(lockdata.dd_mutex);
(*lockstack).push_back(std::make_pair(c, locklocation));
@@ -127,23 +140,21 @@ static void push_lock(void* c, const CLockLocation& locklocation, bool fTry)
break;
std::pair<void*, void*> p1 = std::make_pair(i.first, c);
- if (lockorders.count(p1))
+ if (lockdata.lockorders.count(p1))
continue;
- lockorders[p1] = (*lockstack);
+ lockdata.lockorders[p1] = (*lockstack);
std::pair<void*, void*> p2 = std::make_pair(c, i.first);
- if (lockorders.count(p2))
- potential_deadlock_detected(p1, lockorders[p2], lockorders[p1]);
+ lockdata.invlockorders.insert(p2);
+ if (lockdata.lockorders.count(p2))
+ potential_deadlock_detected(p1, lockdata.lockorders[p2], lockdata.lockorders[p1]);
}
}
- dd_mutex.unlock();
}
static void pop_lock()
{
- dd_mutex.lock();
(*lockstack).pop_back();
- dd_mutex.unlock();
}
void EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry)
@@ -173,4 +184,26 @@ void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine,
abort();
}
+void DeleteLock(void* cs)
+{
+ if (!lockdata.available) {
+ // We're already shutting down.
+ return;
+ }
+ boost::unique_lock<boost::mutex> lock(lockdata.dd_mutex);
+ std::pair<void*, void*> item = std::make_pair(cs, (void*)0);
+ LockOrders::iterator it = lockdata.lockorders.lower_bound(item);
+ while (it != lockdata.lockorders.end() && it->first.first == cs) {
+ std::pair<void*, void*> invitem = std::make_pair(it->first.second, it->first.first);
+ lockdata.invlockorders.erase(invitem);
+ lockdata.lockorders.erase(it++);
+ }
+ InvLockOrders::iterator invit = lockdata.invlockorders.lower_bound(item);
+ while (invit != lockdata.invlockorders.end() && invit->first == cs) {
+ std::pair<void*, void*> invinvitem = std::make_pair(invit->second, invit->first);
+ lockdata.lockorders.erase(invinvitem);
+ lockdata.invlockorders.erase(invit++);
+ }
+}
+
#endif /* DEBUG_LOCKORDER */
diff --git a/src/sync.h b/src/sync.h
index 68a9443084..7733910749 100644
--- a/src/sync.h
+++ b/src/sync.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
@@ -71,30 +71,39 @@ public:
}
};
-/**
- * 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 */
-typedef AnnotatedMixin<boost::mutex> CWaitableCriticalSection;
-
-/** Just a typedef for boost::condition_variable, can be wrapped later if desired */
-typedef boost::condition_variable CConditionVariable;
-
#ifdef DEBUG_LOCKORDER
void EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false);
void LeaveCritical();
std::string LocksHeld();
void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs);
+void DeleteLock(void* cs);
#else
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) {}
+void static inline DeleteLock(void* cs) {}
#endif
#define AssertLockHeld(cs) AssertLockHeldInternal(#cs, __FILE__, __LINE__, &cs)
+/**
+ * Wrapped boost mutex: supports recursive locking, but no waiting
+ * TODO: We should move away from using the recursive lock by default.
+ */
+class CCriticalSection : public AnnotatedMixin<boost::recursive_mutex>
+{
+public:
+ ~CCriticalSection() {
+ DeleteLock((void*)this);
+ }
+};
+
+typedef CCriticalSection CDynamicCriticalSection;
+/** Wrapped boost mutex: supports waiting but not recursive locking */
+typedef AnnotatedMixin<boost::mutex> CWaitableCriticalSection;
+
+/** Just a typedef for boost::condition_variable, can be wrapped later if desired */
+typedef boost::condition_variable CConditionVariable;
+
#ifdef DEBUG_LOCKCONTENTION
void PrintLockContention(const char* pszName, const char* pszFile, int nLine);
#endif
@@ -162,7 +171,10 @@ public:
typedef CMutexLock<CCriticalSection> CCriticalBlock;
-#define LOCK(cs) CCriticalBlock criticalblock(cs, #cs, __FILE__, __LINE__)
+#define PASTE(x, y) x ## y
+#define PASTE2(x, y) PASTE(x, y)
+
+#define LOCK(cs) CCriticalBlock PASTE2(criticalblock, __COUNTER__)(cs, #cs, __FILE__, __LINE__)
#define LOCK2(cs1, cs2) CCriticalBlock criticalblock1(cs1, #cs1, __FILE__, __LINE__), criticalblock2(cs2, #cs2, __FILE__, __LINE__)
#define TRY_LOCK(cs, name) CCriticalBlock name(cs, #cs, __FILE__, __LINE__, true)
diff --git a/src/test/Checkpoints_tests.cpp b/src/test/Checkpoints_tests.cpp
index 0a23c430ed..1b7d368e13 100644
--- a/src/test/Checkpoints_tests.cpp
+++ b/src/test/Checkpoints_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/test/DoS_tests.cpp b/src/test/DoS_tests.cpp
index da296a0461..97abeb7211 100644
--- a/src/test/DoS_tests.cpp
+++ b/src/test/DoS_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -40,69 +40,75 @@ CService ip(uint32_t i)
return CService(CNetAddr(s), Params().GetDefaultPort());
}
+static NodeId id = 0;
+
BOOST_FIXTURE_TEST_SUITE(DoS_tests, TestingSetup)
BOOST_AUTO_TEST_CASE(DoS_banning)
{
- CNode::ClearBanned();
- CAddress addr1(ip(0xa0b0c001));
- CNode dummyNode1(INVALID_SOCKET, addr1, "", true);
+ connman->ClearBanned();
+ CAddress addr1(ip(0xa0b0c001), NODE_NONE);
+ CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 0, "", true);
+ GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
dummyNode1.nVersion = 1;
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
- SendMessages(&dummyNode1, false);
- BOOST_CHECK(CNode::IsBanned(addr1));
- BOOST_CHECK(!CNode::IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned
+ SendMessages(&dummyNode1, *connman);
+ BOOST_CHECK(connman->IsBanned(addr1));
+ BOOST_CHECK(!connman->IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned
- CAddress addr2(ip(0xa0b0c002));
- CNode dummyNode2(INVALID_SOCKET, addr2, "", true);
+ CAddress addr2(ip(0xa0b0c002), NODE_NONE);
+ CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, "", true);
+ GetNodeSignals().InitializeNode(dummyNode2.GetId(), &dummyNode2);
dummyNode2.nVersion = 1;
Misbehaving(dummyNode2.GetId(), 50);
- SendMessages(&dummyNode2, false);
- BOOST_CHECK(!CNode::IsBanned(addr2)); // 2 not banned yet...
- BOOST_CHECK(CNode::IsBanned(addr1)); // ... but 1 still should be
+ SendMessages(&dummyNode2, *connman);
+ BOOST_CHECK(!connman->IsBanned(addr2)); // 2 not banned yet...
+ BOOST_CHECK(connman->IsBanned(addr1)); // ... but 1 still should be
Misbehaving(dummyNode2.GetId(), 50);
- SendMessages(&dummyNode2, false);
- BOOST_CHECK(CNode::IsBanned(addr2));
+ SendMessages(&dummyNode2, *connman);
+ BOOST_CHECK(connman->IsBanned(addr2));
}
BOOST_AUTO_TEST_CASE(DoS_banscore)
{
- CNode::ClearBanned();
+ connman->ClearBanned();
mapArgs["-banscore"] = "111"; // because 11 is my favorite number
- CAddress addr1(ip(0xa0b0c001));
- CNode dummyNode1(INVALID_SOCKET, addr1, "", true);
+ CAddress addr1(ip(0xa0b0c001), NODE_NONE);
+ CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 3, "", true);
+ GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
dummyNode1.nVersion = 1;
Misbehaving(dummyNode1.GetId(), 100);
- SendMessages(&dummyNode1, false);
- BOOST_CHECK(!CNode::IsBanned(addr1));
+ SendMessages(&dummyNode1, *connman);
+ BOOST_CHECK(!connman->IsBanned(addr1));
Misbehaving(dummyNode1.GetId(), 10);
- SendMessages(&dummyNode1, false);
- BOOST_CHECK(!CNode::IsBanned(addr1));
+ SendMessages(&dummyNode1, *connman);
+ BOOST_CHECK(!connman->IsBanned(addr1));
Misbehaving(dummyNode1.GetId(), 1);
- SendMessages(&dummyNode1, false);
- BOOST_CHECK(CNode::IsBanned(addr1));
+ SendMessages(&dummyNode1, *connman);
+ BOOST_CHECK(connman->IsBanned(addr1));
mapArgs.erase("-banscore");
}
BOOST_AUTO_TEST_CASE(DoS_bantime)
{
- CNode::ClearBanned();
+ connman->ClearBanned();
int64_t nStartTime = GetTime();
SetMockTime(nStartTime); // Overrides future calls to GetTime()
- CAddress addr(ip(0xa0b0c001));
- CNode dummyNode(INVALID_SOCKET, addr, "", true);
+ CAddress addr(ip(0xa0b0c001), NODE_NONE);
+ CNode dummyNode(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr, 4, "", true);
+ GetNodeSignals().InitializeNode(dummyNode.GetId(), &dummyNode);
dummyNode.nVersion = 1;
Misbehaving(dummyNode.GetId(), 100);
- SendMessages(&dummyNode, false);
- BOOST_CHECK(CNode::IsBanned(addr));
+ SendMessages(&dummyNode, *connman);
+ BOOST_CHECK(connman->IsBanned(addr));
SetMockTime(nStartTime+60*60);
- BOOST_CHECK(CNode::IsBanned(addr));
+ BOOST_CHECK(connman->IsBanned(addr));
SetMockTime(nStartTime+60*60*24+1);
- BOOST_CHECK(!CNode::IsBanned(addr));
+ BOOST_CHECK(!connman->IsBanned(addr));
}
CTransaction RandomOrphan()
@@ -148,7 +154,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
tx.vout.resize(1);
tx.vout[0].nValue = 1*CENT;
tx.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID());
- SignSignature(keystore, txPrev, tx, 0);
+ SignSignature(keystore, txPrev, tx, 0, SIGHASH_ALL);
AddOrphanTx(tx, i);
}
@@ -162,13 +168,13 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
tx.vout.resize(1);
tx.vout[0].nValue = 1*CENT;
tx.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID());
- tx.vin.resize(500);
+ tx.vin.resize(2777);
for (unsigned int j = 0; j < tx.vin.size(); j++)
{
tx.vin[j].prevout.n = j;
tx.vin[j].prevout.hash = txPrev.GetHash();
}
- SignSignature(keystore, txPrev, tx, 0);
+ SignSignature(keystore, txPrev, tx, 0, SIGHASH_ALL);
// Re-use same signature for other inputs
// (they don't have to be valid for this test)
for (unsigned int j = 1; j < tx.vin.size(); j++)
diff --git a/src/test/README.md b/src/test/README.md
index b2d6be14f1..3afdefe5fc 100644
--- a/src/test/README.md
+++ b/src/test/README.md
@@ -5,18 +5,15 @@ sense to simply use this framework rather than require developers to
configure some other framework (we want as few impediments to creating
unit tests as possible).
-The build system is setup to compile an executable called "test_bitcoin"
+The build system is setup to compile an executable called `test_bitcoin`
that runs all of the unit tests. The main source file is called
-test_bitcoin.cpp, which simply includes other files that contain the
-actual unit tests (outside of a couple required preprocessor
-directives). The pattern is to create one test file for each class or
-source file for which you want to create unit tests. The file naming
-convention is "<source_filename>_tests.cpp" and such files should wrap
-their tests in a test suite called "<source_filename>_tests". For an
-examples of this pattern, examine uint160_tests.cpp and
-uint256_tests.cpp.
-
-Add the source files to /src/Makefile.test.include to add them to the build.
+test_bitcoin.cpp. To add a new unit test file to our test suite you need
+to add the file to `src/Makefile.test.include`. The pattern is to create
+one test file for each class or source file for which you want to create
+unit tests. The file naming convention is `<source_filename>_tests.cpp`
+and such files should wrap their tests in a test suite
+called `<source_filename>_tests`. For an example of this pattern,
+examine `uint256_tests.cpp`.
For further reading, I found the following website to be helpful in
explaining how the boost unit test framework works:
@@ -31,5 +28,13 @@ example, to run just the getarg_tests verbosely:
test_bitcoin --run_test=getarg_tests/doubledash
-Run test_bitcoin --help for the full list.
+Run `test_bitcoin --help` for the full list.
+
+### bitcoin-util-test.py
+
+The test directory also contains the bitcoin-util-test.py tool, which tests bitcoin utils (currently just bitcoin-tx). This test gets run automatically during the `make check` build process. It is also possible to run the test manually from the src directory:
+
+```
+test/bitcoin-util-test.py --srcdir=[current directory]
+``` \ No newline at end of file
diff --git a/src/test/addrman_tests.cpp b/src/test/addrman_tests.cpp
index cfcdd9abb2..5ccaeb57bb 100644
--- a/src/test/addrman_tests.cpp
+++ b/src/test/addrman_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
#include "addrman.h"
@@ -6,11 +6,74 @@
#include <string>
#include <boost/test/unit_test.hpp>
+#include "hash.h"
+#include "netbase.h"
#include "random.h"
using namespace std;
-class CAddrManTest : public CAddrMan{};
+class CAddrManTest : public CAddrMan
+{
+ uint64_t state;
+
+public:
+ CAddrManTest()
+ {
+ state = 1;
+ }
+
+ //! Ensure that bucket placement is always the same for testing purposes.
+ void MakeDeterministic()
+ {
+ nKey.SetNull();
+ seed_insecure_rand(true);
+ }
+
+ int RandomInt(int nMax)
+ {
+ state = (CHashWriter(SER_GETHASH, 0) << state).GetHash().GetCheapHash();
+ return (unsigned int)(state % nMax);
+ }
+
+ CAddrInfo* Find(const CNetAddr& addr, int* pnId = NULL)
+ {
+ return CAddrMan::Find(addr, pnId);
+ }
+
+ CAddrInfo* Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId = NULL)
+ {
+ return CAddrMan::Create(addr, addrSource, pnId);
+ }
+
+ void Delete(int nId)
+ {
+ CAddrMan::Delete(nId);
+ }
+};
+
+static CNetAddr ResolveIP(const char* ip)
+{
+ CNetAddr addr;
+ BOOST_CHECK_MESSAGE(LookupHost(ip, addr, false), strprintf("failed to resolve: %s", ip));
+ return addr;
+}
+
+static CNetAddr ResolveIP(std::string ip)
+{
+ return ResolveIP(ip.c_str());
+}
+
+static CService ResolveService(const char* ip, int port = 0)
+{
+ CService serv;
+ BOOST_CHECK_MESSAGE(Lookup(ip, serv, port, false), strprintf("failed to resolve: %s:%i", ip, port));
+ return serv;
+}
+
+static CService ResolveService(std::string ip, int port = 0)
+{
+ return ResolveService(ip.c_str(), port);
+}
BOOST_FIXTURE_TEST_SUITE(addrman_tests, BasicTestingSetup)
@@ -21,7 +84,7 @@ BOOST_AUTO_TEST_CASE(addrman_simple)
// Set addrman addr placement to be deterministic.
addrman.MakeDeterministic();
- CNetAddr source = CNetAddr("252.2.2.2:8333");
+ CNetAddr source = ResolveIP("252.2.2.2");
// Test 1: Does Addrman respond correctly when empty.
BOOST_CHECK(addrman.size() == 0);
@@ -29,26 +92,26 @@ BOOST_AUTO_TEST_CASE(addrman_simple)
BOOST_CHECK(addr_null.ToString() == "[::]:0");
// Test 2: Does Addrman::Add work as expected.
- CService addr1 = CService("250.1.1.1:8333");
- addrman.Add(CAddress(addr1), source);
+ CService addr1 = ResolveService("250.1.1.1", 8333);
+ addrman.Add(CAddress(addr1, NODE_NONE), source);
BOOST_CHECK(addrman.size() == 1);
CAddrInfo addr_ret1 = addrman.Select();
BOOST_CHECK(addr_ret1.ToString() == "250.1.1.1:8333");
- // Test 3: Does IP address deduplication work correctly.
+ // Test 3: Does IP address deduplication work correctly.
// Expected dup IP should not be added.
- CService addr1_dup = CService("250.1.1.1:8333");
- addrman.Add(CAddress(addr1_dup), source);
+ CService addr1_dup = ResolveService("250.1.1.1", 8333);
+ addrman.Add(CAddress(addr1_dup, NODE_NONE), source);
BOOST_CHECK(addrman.size() == 1);
// Test 5: New table has one addr and we add a diff addr we should
// have two addrs.
- CService addr2 = CService("250.1.1.2:8333");
- addrman.Add(CAddress(addr2), source);
+ CService addr2 = ResolveService("250.1.1.2", 8333);
+ addrman.Add(CAddress(addr2, NODE_NONE), source);
BOOST_CHECK(addrman.size() == 2);
- // Test 6: AddrMan::Clear() should empty the new table.
+ // Test 6: AddrMan::Clear() should empty the new table.
addrman.Clear();
BOOST_CHECK(addrman.size() == 0);
CAddrInfo addr_null2 = addrman.Select();
@@ -62,24 +125,24 @@ BOOST_AUTO_TEST_CASE(addrman_ports)
// Set addrman addr placement to be deterministic.
addrman.MakeDeterministic();
- CNetAddr source = CNetAddr("252.2.2.2:8333");
+ CNetAddr source = ResolveIP("252.2.2.2");
BOOST_CHECK(addrman.size() == 0);
// Test 7; Addr with same IP but diff port does not replace existing addr.
- CService addr1 = CService("250.1.1.1:8333");
- addrman.Add(CAddress(addr1), source);
+ CService addr1 = ResolveService("250.1.1.1", 8333);
+ addrman.Add(CAddress(addr1, NODE_NONE), source);
BOOST_CHECK(addrman.size() == 1);
- CService addr1_port = CService("250.1.1.1:8334");
- addrman.Add(CAddress(addr1_port), source);
+ CService addr1_port = ResolveService("250.1.1.1", 8334);
+ addrman.Add(CAddress(addr1_port, NODE_NONE), source);
BOOST_CHECK(addrman.size() == 1);
CAddrInfo addr_ret2 = addrman.Select();
BOOST_CHECK(addr_ret2.ToString() == "250.1.1.1:8333");
// Test 8: Add same IP but diff port to tried table, it doesn't get added.
// Perhaps this is not ideal behavior but it is the current behavior.
- addrman.Good(CAddress(addr1_port));
+ addrman.Good(CAddress(addr1_port, NODE_NONE));
BOOST_CHECK(addrman.size() == 1);
bool newOnly = true;
CAddrInfo addr_ret3 = addrman.Select(newOnly);
@@ -94,26 +157,58 @@ BOOST_AUTO_TEST_CASE(addrman_select)
// Set addrman addr placement to be deterministic.
addrman.MakeDeterministic();
- CNetAddr source = CNetAddr("252.2.2.2:8333");
+ CNetAddr source = ResolveIP("252.2.2.2");
// Test 9: Select from new with 1 addr in new.
- CService addr1 = CService("250.1.1.1:8333");
- addrman.Add(CAddress(addr1), source);
+ CService addr1 = ResolveService("250.1.1.1", 8333);
+ addrman.Add(CAddress(addr1, NODE_NONE), source);
BOOST_CHECK(addrman.size() == 1);
bool newOnly = true;
CAddrInfo addr_ret1 = addrman.Select(newOnly);
BOOST_CHECK(addr_ret1.ToString() == "250.1.1.1:8333");
-
// Test 10: move addr to tried, select from new expected nothing returned.
- addrman.Good(CAddress(addr1));
+ addrman.Good(CAddress(addr1, NODE_NONE));
BOOST_CHECK(addrman.size() == 1);
CAddrInfo addr_ret2 = addrman.Select(newOnly);
BOOST_CHECK(addr_ret2.ToString() == "[::]:0");
CAddrInfo addr_ret3 = addrman.Select();
BOOST_CHECK(addr_ret3.ToString() == "250.1.1.1:8333");
+
+ BOOST_CHECK(addrman.size() == 1);
+
+
+ // Add three addresses to new table.
+ CService addr2 = ResolveService("250.3.1.1", 8333);
+ CService addr3 = ResolveService("250.3.2.2", 9999);
+ CService addr4 = ResolveService("250.3.3.3", 9999);
+
+ addrman.Add(CAddress(addr2, NODE_NONE), ResolveService("250.3.1.1", 8333));
+ addrman.Add(CAddress(addr3, NODE_NONE), ResolveService("250.3.1.1", 8333));
+ addrman.Add(CAddress(addr4, NODE_NONE), ResolveService("250.4.1.1", 8333));
+
+ // Add three addresses to tried table.
+ CService addr5 = ResolveService("250.4.4.4", 8333);
+ CService addr6 = ResolveService("250.4.5.5", 7777);
+ CService addr7 = ResolveService("250.4.6.6", 8333);
+
+ addrman.Add(CAddress(addr5, NODE_NONE), ResolveService("250.3.1.1", 8333));
+ addrman.Good(CAddress(addr5, NODE_NONE));
+ addrman.Add(CAddress(addr6, NODE_NONE), ResolveService("250.3.1.1", 8333));
+ addrman.Good(CAddress(addr6, NODE_NONE));
+ addrman.Add(CAddress(addr7, NODE_NONE), ResolveService("250.1.1.3", 8333));
+ addrman.Good(CAddress(addr7, NODE_NONE));
+
+ // Test 11: 6 addrs + 1 addr from last test = 7.
+ BOOST_CHECK(addrman.size() == 7);
+
+ // Test 12: Select pulls from new and tried regardless of port number.
+ BOOST_CHECK(addrman.Select().ToString() == "250.4.6.6:8333");
+ BOOST_CHECK(addrman.Select().ToString() == "250.3.2.2:9999");
+ BOOST_CHECK(addrman.Select().ToString() == "250.3.3.3:9999");
+ BOOST_CHECK(addrman.Select().ToString() == "250.4.4.4:8333");
}
BOOST_AUTO_TEST_CASE(addrman_new_collisions)
@@ -123,26 +218,26 @@ BOOST_AUTO_TEST_CASE(addrman_new_collisions)
// Set addrman addr placement to be deterministic.
addrman.MakeDeterministic();
- CNetAddr source = CNetAddr("252.2.2.2:8333");
+ CNetAddr source = ResolveIP("252.2.2.2");
BOOST_CHECK(addrman.size() == 0);
- for (unsigned int i = 1; i < 4; i++){
- CService addr = CService("250.1.1."+boost::to_string(i));
- addrman.Add(CAddress(addr), source);
+ for (unsigned int i = 1; i < 18; i++) {
+ CService addr = ResolveService("250.1.1." + boost::to_string(i));
+ addrman.Add(CAddress(addr, NODE_NONE), source);
- //Test 11: No collision in new table yet.
+ //Test 13: No collision in new table yet.
BOOST_CHECK(addrman.size() == i);
}
- //Test 12: new table collision!
- CService addr1 = CService("250.1.1.4");
- addrman.Add(CAddress(addr1), source);
- BOOST_CHECK(addrman.size() == 3);
+ //Test 14: new table collision!
+ CService addr1 = ResolveService("250.1.1.18");
+ addrman.Add(CAddress(addr1, NODE_NONE), source);
+ BOOST_CHECK(addrman.size() == 17);
- CService addr2 = CService("250.1.1.5");
- addrman.Add(CAddress(addr2), source);
- BOOST_CHECK(addrman.size() == 4);
+ CService addr2 = ResolveService("250.1.1.19");
+ addrman.Add(CAddress(addr2, NODE_NONE), source);
+ BOOST_CHECK(addrman.size() == 18);
}
BOOST_AUTO_TEST_CASE(addrman_tried_collisions)
@@ -152,29 +247,299 @@ BOOST_AUTO_TEST_CASE(addrman_tried_collisions)
// Set addrman addr placement to be deterministic.
addrman.MakeDeterministic();
- CNetAddr source = CNetAddr("252.2.2.2:8333");
+ CNetAddr source = ResolveIP("252.2.2.2");
BOOST_CHECK(addrman.size() == 0);
- for (unsigned int i = 1; i < 75; i++){
- CService addr = CService("250.1.1."+boost::to_string(i));
- addrman.Add(CAddress(addr), source);
- addrman.Good(CAddress(addr));
+ for (unsigned int i = 1; i < 80; i++) {
+ CService addr = ResolveService("250.1.1." + boost::to_string(i));
+ addrman.Add(CAddress(addr, NODE_NONE), source);
+ addrman.Good(CAddress(addr, NODE_NONE));
- //Test 13: No collision in tried table yet.
- BOOST_TEST_MESSAGE(addrman.size());
- BOOST_CHECK(addrman.size() == i);
+ //Test 15: No collision in tried table yet.
+ BOOST_CHECK_EQUAL(addrman.size(), i);
+ }
+
+ //Test 16: tried table collision!
+ CService addr1 = ResolveService("250.1.1.80");
+ addrman.Add(CAddress(addr1, NODE_NONE), source);
+ BOOST_CHECK(addrman.size() == 79);
+
+ CService addr2 = ResolveService("250.1.1.81");
+ addrman.Add(CAddress(addr2, NODE_NONE), source);
+ BOOST_CHECK(addrman.size() == 80);
+}
+
+BOOST_AUTO_TEST_CASE(addrman_find)
+{
+ CAddrManTest addrman;
+
+ // Set addrman addr placement to be deterministic.
+ addrman.MakeDeterministic();
+
+ BOOST_CHECK(addrman.size() == 0);
+
+ CAddress addr1 = CAddress(ResolveService("250.1.2.1", 8333), NODE_NONE);
+ CAddress addr2 = CAddress(ResolveService("250.1.2.1", 9999), NODE_NONE);
+ CAddress addr3 = CAddress(ResolveService("251.255.2.1", 8333), NODE_NONE);
+
+ CNetAddr source1 = ResolveIP("250.1.2.1");
+ CNetAddr source2 = ResolveIP("250.1.2.2");
+
+ addrman.Add(addr1, source1);
+ addrman.Add(addr2, source2);
+ addrman.Add(addr3, source1);
+
+ // Test 17: ensure Find returns an IP matching what we searched on.
+ CAddrInfo* info1 = addrman.Find(addr1);
+ BOOST_CHECK(info1);
+ if (info1)
+ BOOST_CHECK(info1->ToString() == "250.1.2.1:8333");
+
+ // Test 18; Find does not discriminate by port number.
+ CAddrInfo* info2 = addrman.Find(addr2);
+ BOOST_CHECK(info2);
+ if (info2)
+ BOOST_CHECK(info2->ToString() == info1->ToString());
+
+ // Test 19: Find returns another IP matching what we searched on.
+ CAddrInfo* info3 = addrman.Find(addr3);
+ BOOST_CHECK(info3);
+ if (info3)
+ BOOST_CHECK(info3->ToString() == "251.255.2.1:8333");
+}
+
+BOOST_AUTO_TEST_CASE(addrman_create)
+{
+ CAddrManTest addrman;
+
+ // Set addrman addr placement to be deterministic.
+ addrman.MakeDeterministic();
+
+ BOOST_CHECK(addrman.size() == 0);
+
+ CAddress addr1 = CAddress(ResolveService("250.1.2.1", 8333), NODE_NONE);
+ CNetAddr source1 = ResolveIP("250.1.2.1");
+
+ int nId;
+ CAddrInfo* pinfo = addrman.Create(addr1, source1, &nId);
+
+ // Test 20: The result should be the same as the input addr.
+ BOOST_CHECK(pinfo->ToString() == "250.1.2.1:8333");
+
+ CAddrInfo* info2 = addrman.Find(addr1);
+ BOOST_CHECK(info2->ToString() == "250.1.2.1:8333");
+}
+
+
+BOOST_AUTO_TEST_CASE(addrman_delete)
+{
+ CAddrManTest addrman;
+
+ // Set addrman addr placement to be deterministic.
+ addrman.MakeDeterministic();
+
+ BOOST_CHECK(addrman.size() == 0);
+
+ CAddress addr1 = CAddress(ResolveService("250.1.2.1", 8333), NODE_NONE);
+ CNetAddr source1 = ResolveIP("250.1.2.1");
+
+ int nId;
+ addrman.Create(addr1, source1, &nId);
+
+ // Test 21: Delete should actually delete the addr.
+ BOOST_CHECK(addrman.size() == 1);
+ addrman.Delete(nId);
+ BOOST_CHECK(addrman.size() == 0);
+ CAddrInfo* info2 = addrman.Find(addr1);
+ BOOST_CHECK(info2 == NULL);
+}
+
+BOOST_AUTO_TEST_CASE(addrman_getaddr)
+{
+ CAddrManTest addrman;
+
+ // Set addrman addr placement to be deterministic.
+ addrman.MakeDeterministic();
+
+ // Test 22: Sanity check, GetAddr should never return anything if addrman
+ // is empty.
+ BOOST_CHECK(addrman.size() == 0);
+ vector<CAddress> vAddr1 = addrman.GetAddr();
+ BOOST_CHECK(vAddr1.size() == 0);
+
+ CAddress addr1 = CAddress(ResolveService("250.250.2.1", 8333), NODE_NONE);
+ addr1.nTime = GetAdjustedTime(); // Set time so isTerrible = false
+ CAddress addr2 = CAddress(ResolveService("250.251.2.2", 9999), NODE_NONE);
+ addr2.nTime = GetAdjustedTime();
+ CAddress addr3 = CAddress(ResolveService("251.252.2.3", 8333), NODE_NONE);
+ addr3.nTime = GetAdjustedTime();
+ CAddress addr4 = CAddress(ResolveService("252.253.3.4", 8333), NODE_NONE);
+ addr4.nTime = GetAdjustedTime();
+ CAddress addr5 = CAddress(ResolveService("252.254.4.5", 8333), NODE_NONE);
+ addr5.nTime = GetAdjustedTime();
+ CNetAddr source1 = ResolveIP("250.1.2.1");
+ CNetAddr source2 = ResolveIP("250.2.3.3");
+
+ // Test 23: Ensure GetAddr works with new addresses.
+ addrman.Add(addr1, source1);
+ addrman.Add(addr2, source2);
+ addrman.Add(addr3, source1);
+ addrman.Add(addr4, source2);
+ addrman.Add(addr5, source1);
+
+ // GetAddr returns 23% of addresses, 23% of 5 is 1 rounded down.
+ BOOST_CHECK(addrman.GetAddr().size() == 1);
+
+ // Test 24: Ensure GetAddr works with new and tried addresses.
+ addrman.Good(CAddress(addr1, NODE_NONE));
+ addrman.Good(CAddress(addr2, NODE_NONE));
+ BOOST_CHECK(addrman.GetAddr().size() == 1);
+
+ // Test 25: Ensure GetAddr still returns 23% when addrman has many addrs.
+ for (unsigned int i = 1; i < (8 * 256); i++) {
+ int octet1 = i % 256;
+ int octet2 = (i / 256) % 256;
+ int octet3 = (i / (256 * 2)) % 256;
+ string strAddr = boost::to_string(octet1) + "." + boost::to_string(octet2) + "." + boost::to_string(octet3) + ".23";
+ CAddress addr = CAddress(ResolveService(strAddr), NODE_NONE);
+
+ // Ensure that for all addrs in addrman, isTerrible == false.
+ addr.nTime = GetAdjustedTime();
+ addrman.Add(addr, ResolveIP(strAddr));
+ if (i % 8 == 0)
+ addrman.Good(addr);
}
+ vector<CAddress> vAddr = addrman.GetAddr();
+
+ size_t percent23 = (addrman.size() * 23) / 100;
+ BOOST_CHECK(vAddr.size() == percent23);
+ BOOST_CHECK(vAddr.size() == 461);
+ // (Addrman.size() < number of addresses added) due to address collisons.
+ BOOST_CHECK(addrman.size() == 2007);
+}
- //Test 14: tried table collision!
- CService addr1 = CService("250.1.1.76");
- addrman.Add(CAddress(addr1), source);
- BOOST_CHECK(addrman.size() == 74);
- CService addr2 = CService("250.1.1.77");
- addrman.Add(CAddress(addr2), source);
- BOOST_CHECK(addrman.size() == 75);
+BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
+{
+ CAddrManTest addrman;
+
+ // Set addrman addr placement to be deterministic.
+ addrman.MakeDeterministic();
+
+ CAddress addr1 = CAddress(ResolveService("250.1.1.1", 8333), NODE_NONE);
+ CAddress addr2 = CAddress(ResolveService("250.1.1.1", 9999), NODE_NONE);
+
+ CNetAddr source1 = ResolveIP("250.1.1.1");
+
+
+ CAddrInfo info1 = CAddrInfo(addr1, source1);
+
+ uint256 nKey1 = (uint256)(CHashWriter(SER_GETHASH, 0) << 1).GetHash();
+ uint256 nKey2 = (uint256)(CHashWriter(SER_GETHASH, 0) << 2).GetHash();
+
+
+ BOOST_CHECK(info1.GetTriedBucket(nKey1) == 40);
+
+ // Test 26: Make sure key actually randomizes bucket placement. A fail on
+ // this test could be a security issue.
+ BOOST_CHECK(info1.GetTriedBucket(nKey1) != info1.GetTriedBucket(nKey2));
+
+ // Test 27: Two addresses with same IP but different ports can map to
+ // different buckets because they have different keys.
+ CAddrInfo info2 = CAddrInfo(addr2, source1);
+
+ BOOST_CHECK(info1.GetKey() != info2.GetKey());
+ BOOST_CHECK(info1.GetTriedBucket(nKey1) != info2.GetTriedBucket(nKey1));
+
+ set<int> buckets;
+ for (int i = 0; i < 255; i++) {
+ CAddrInfo infoi = CAddrInfo(
+ CAddress(ResolveService("250.1.1." + boost::to_string(i)), NODE_NONE),
+ ResolveIP("250.1.1." + boost::to_string(i)));
+ int bucket = infoi.GetTriedBucket(nKey1);
+ buckets.insert(bucket);
+ }
+ // Test 28: IP addresses in the same group (\16 prefix for IPv4) should
+ // never get more than 8 buckets
+ BOOST_CHECK(buckets.size() == 8);
+
+ buckets.clear();
+ for (int j = 0; j < 255; j++) {
+ CAddrInfo infoj = CAddrInfo(
+ CAddress(ResolveService("250." + boost::to_string(j) + ".1.1"), NODE_NONE),
+ ResolveIP("250." + boost::to_string(j) + ".1.1"));
+ int bucket = infoj.GetTriedBucket(nKey1);
+ buckets.insert(bucket);
+ }
+ // Test 29: IP addresses in the different groups should map to more than
+ // 8 buckets.
+ BOOST_CHECK(buckets.size() == 160);
}
+BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
+{
+ CAddrManTest addrman;
+
+ // Set addrman addr placement to be deterministic.
+ addrman.MakeDeterministic();
+
+ CAddress addr1 = CAddress(ResolveService("250.1.2.1", 8333), NODE_NONE);
+ CAddress addr2 = CAddress(ResolveService("250.1.2.1", 9999), NODE_NONE);
+
+ CNetAddr source1 = ResolveIP("250.1.2.1");
+
+ CAddrInfo info1 = CAddrInfo(addr1, source1);
+
+ uint256 nKey1 = (uint256)(CHashWriter(SER_GETHASH, 0) << 1).GetHash();
+ uint256 nKey2 = (uint256)(CHashWriter(SER_GETHASH, 0) << 2).GetHash();
-BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file
+ BOOST_CHECK(info1.GetNewBucket(nKey1) == 786);
+
+ // Test 30: Make sure key actually randomizes bucket placement. A fail on
+ // this test could be a security issue.
+ BOOST_CHECK(info1.GetNewBucket(nKey1) != info1.GetNewBucket(nKey2));
+
+ // Test 31: Ports should not effect bucket placement in the addr
+ CAddrInfo info2 = CAddrInfo(addr2, source1);
+ BOOST_CHECK(info1.GetKey() != info2.GetKey());
+ BOOST_CHECK(info1.GetNewBucket(nKey1) == info2.GetNewBucket(nKey1));
+
+ set<int> buckets;
+ for (int i = 0; i < 255; i++) {
+ CAddrInfo infoi = CAddrInfo(
+ CAddress(ResolveService("250.1.1." + boost::to_string(i)), NODE_NONE),
+ ResolveIP("250.1.1." + boost::to_string(i)));
+ int bucket = infoi.GetNewBucket(nKey1);
+ buckets.insert(bucket);
+ }
+ // Test 32: IP addresses in the same group (\16 prefix for IPv4) should
+ // always map to the same bucket.
+ BOOST_CHECK(buckets.size() == 1);
+
+ buckets.clear();
+ for (int j = 0; j < 4 * 255; j++) {
+ CAddrInfo infoj = CAddrInfo(CAddress(
+ ResolveService(
+ boost::to_string(250 + (j / 255)) + "." + boost::to_string(j % 256) + ".1.1"), NODE_NONE),
+ ResolveIP("251.4.1.1"));
+ int bucket = infoj.GetNewBucket(nKey1);
+ buckets.insert(bucket);
+ }
+ // Test 33: IP addresses in the same source groups should map to no more
+ // than 64 buckets.
+ BOOST_CHECK(buckets.size() <= 64);
+
+ buckets.clear();
+ for (int p = 0; p < 255; p++) {
+ CAddrInfo infoj = CAddrInfo(
+ CAddress(ResolveService("250.1.1.1"), NODE_NONE),
+ ResolveIP("250." + boost::to_string(p) + ".1.1"));
+ int bucket = infoj.GetNewBucket(nKey1);
+ buckets.insert(bucket);
+ }
+ // Test 34: IP addresses in the different source groups should map to more
+ // than 64 buckets.
+ BOOST_CHECK(buckets.size() > 64);
+}
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/alert_tests.cpp b/src/test/alert_tests.cpp
deleted file mode 100644
index 468eda1c9b..0000000000
--- a/src/test/alert_tests.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright (c) 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.
-
-// Unit tests for alert system
-
-#include "alert.h"
-#include "chain.h"
-#include "chainparams.h"
-#include "clientversion.h"
-#include "data/alertTests.raw.h"
-#include "main.h" // For PartitionCheck
-#include "serialize.h"
-#include "streams.h"
-#include "util.h"
-#include "utilstrencodings.h"
-
-#include "test/test_bitcoin.h"
-
-#include <fstream>
-
-#include <boost/filesystem/operations.hpp>
-#include <boost/foreach.hpp>
-#include <boost/test/unit_test.hpp>
-
-#if 0
-//
-// alertTests contains 7 alerts, generated with this code:
-// (SignAndSave code not shown, alert signing key is secret)
-//
-{
- CAlert alert;
- alert.nRelayUntil = 60;
- alert.nExpiration = 24 * 60 * 60;
- alert.nID = 1;
- alert.nCancel = 0; // cancels previous messages up to this ID number
- alert.nMinVer = 0; // These versions are protocol versions
- alert.nMaxVer = 999001;
- alert.nPriority = 1;
- alert.strComment = "Alert comment";
- alert.strStatusBar = "Alert 1";
-
- SignAndSave(alert, "test/alertTests");
-
- alert.setSubVer.insert(std::string("/Satoshi:0.1.0/"));
- alert.strStatusBar = "Alert 1 for Satoshi 0.1.0";
- SignAndSave(alert, "test/alertTests");
-
- alert.setSubVer.insert(std::string("/Satoshi:0.2.0/"));
- alert.strStatusBar = "Alert 1 for Satoshi 0.1.0, 0.2.0";
- SignAndSave(alert, "test/alertTests");
-
- alert.setSubVer.clear();
- ++alert.nID;
- alert.nCancel = 1;
- alert.nPriority = 100;
- alert.strStatusBar = "Alert 2, cancels 1";
- SignAndSave(alert, "test/alertTests");
-
- alert.nExpiration += 60;
- ++alert.nID;
- SignAndSave(alert, "test/alertTests");
-
- ++alert.nID;
- alert.nMinVer = 11;
- alert.nMaxVer = 22;
- SignAndSave(alert, "test/alertTests");
-
- ++alert.nID;
- alert.strStatusBar = "Alert 2 for Satoshi 0.1.0";
- alert.setSubVer.insert(std::string("/Satoshi:0.1.0/"));
- SignAndSave(alert, "test/alertTests");
-
- ++alert.nID;
- alert.nMinVer = 0;
- alert.nMaxVer = 999999;
- alert.strStatusBar = "Evil Alert'; /bin/ls; echo '";
- alert.setSubVer.clear();
- SignAndSave(alert, "test/alertTests");
-}
-#endif
-
-struct ReadAlerts : public TestingSetup
-{
- ReadAlerts()
- {
- std::vector<unsigned char> vch(alert_tests::alertTests, alert_tests::alertTests + sizeof(alert_tests::alertTests));
- CDataStream stream(vch, SER_DISK, CLIENT_VERSION);
- try {
- while (!stream.eof())
- {
- CAlert alert;
- stream >> alert;
- alerts.push_back(alert);
- }
- }
- catch (const std::exception&) { }
- }
- ~ReadAlerts() { }
-
- static std::vector<std::string> read_lines(boost::filesystem::path filepath)
- {
- std::vector<std::string> result;
-
- std::ifstream f(filepath.string().c_str());
- std::string line;
- while (std::getline(f,line))
- result.push_back(line);
-
- return result;
- }
-
- std::vector<CAlert> alerts;
-};
-
-BOOST_FIXTURE_TEST_SUITE(Alert_tests, ReadAlerts)
-
-
-BOOST_AUTO_TEST_CASE(AlertApplies)
-{
- SetMockTime(11);
- const std::vector<unsigned char>& alertKey = Params(CBaseChainParams::MAIN).AlertKey();
-
- BOOST_FOREACH(const CAlert& alert, alerts)
- {
- BOOST_CHECK(alert.CheckSignature(alertKey));
- }
-
- BOOST_CHECK(alerts.size() >= 3);
-
- // Matches:
- BOOST_CHECK(alerts[0].AppliesTo(1, ""));
- BOOST_CHECK(alerts[0].AppliesTo(999001, ""));
- BOOST_CHECK(alerts[0].AppliesTo(1, "/Satoshi:11.11.11/"));
-
- BOOST_CHECK(alerts[1].AppliesTo(1, "/Satoshi:0.1.0/"));
- BOOST_CHECK(alerts[1].AppliesTo(999001, "/Satoshi:0.1.0/"));
-
- BOOST_CHECK(alerts[2].AppliesTo(1, "/Satoshi:0.1.0/"));
- BOOST_CHECK(alerts[2].AppliesTo(1, "/Satoshi:0.2.0/"));
-
- // Don't match:
- BOOST_CHECK(!alerts[0].AppliesTo(-1, ""));
- BOOST_CHECK(!alerts[0].AppliesTo(999002, ""));
-
- BOOST_CHECK(!alerts[1].AppliesTo(1, ""));
- BOOST_CHECK(!alerts[1].AppliesTo(1, "Satoshi:0.1.0"));
- BOOST_CHECK(!alerts[1].AppliesTo(1, "/Satoshi:0.1.0"));
- BOOST_CHECK(!alerts[1].AppliesTo(1, "Satoshi:0.1.0/"));
- BOOST_CHECK(!alerts[1].AppliesTo(-1, "/Satoshi:0.1.0/"));
- BOOST_CHECK(!alerts[1].AppliesTo(999002, "/Satoshi:0.1.0/"));
- BOOST_CHECK(!alerts[1].AppliesTo(1, "/Satoshi:0.2.0/"));
-
- BOOST_CHECK(!alerts[2].AppliesTo(1, "/Satoshi:0.3.0/"));
-
- SetMockTime(0);
-}
-
-
-BOOST_AUTO_TEST_CASE(AlertNotify)
-{
- SetMockTime(11);
- const std::vector<unsigned char>& alertKey = Params(CBaseChainParams::MAIN).AlertKey();
-
- boost::filesystem::path temp = GetTempPath() /
- boost::filesystem::unique_path("alertnotify-%%%%.txt");
-
- mapArgs["-alertnotify"] = std::string("echo %s >> ") + temp.string();
-
- BOOST_FOREACH(CAlert alert, alerts)
- alert.ProcessAlert(alertKey, false);
-
- std::vector<std::string> r = read_lines(temp);
- BOOST_CHECK_EQUAL(r.size(), 4u);
-
-// Windows built-in echo semantics are different than posixy shells. Quotes and
-// whitespace are printed literally.
-
-#ifndef WIN32
- BOOST_CHECK_EQUAL(r[0], "Alert 1");
- BOOST_CHECK_EQUAL(r[1], "Alert 2, cancels 1");
- BOOST_CHECK_EQUAL(r[2], "Alert 2, cancels 1");
- BOOST_CHECK_EQUAL(r[3], "Evil Alert; /bin/ls; echo "); // single-quotes should be removed
-#else
- BOOST_CHECK_EQUAL(r[0], "'Alert 1' ");
- BOOST_CHECK_EQUAL(r[1], "'Alert 2, cancels 1' ");
- BOOST_CHECK_EQUAL(r[2], "'Alert 2, cancels 1' ");
- BOOST_CHECK_EQUAL(r[3], "'Evil Alert; /bin/ls; echo ' ");
-#endif
- boost::filesystem::remove(temp);
-
- 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
- }
-
- strMiscWarning = "";
-
- // Test 1: chain with blocks every nPowTargetSpacing seconds,
- // as normal, no worries:
- PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
- BOOST_CHECK_MESSAGE(strMiscWarning.empty(), strMiscWarning);
-
- // 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/allocator_tests.cpp b/src/test/allocator_tests.cpp
index 2108efece5..613f6c12d7 100644
--- a/src/test/allocator_tests.cpp
+++ b/src/test/allocator_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
diff --git a/src/test/amount_tests.cpp b/src/test/amount_tests.cpp
new file mode 100644
index 0000000000..fd6f88b366
--- /dev/null
+++ b/src/test/amount_tests.cpp
@@ -0,0 +1,71 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "amount.h"
+#include "test/test_bitcoin.h"
+
+#include <boost/test/unit_test.hpp>
+
+BOOST_FIXTURE_TEST_SUITE(amount_tests, BasicTestingSetup)
+
+BOOST_AUTO_TEST_CASE(GetFeeTest)
+{
+ CFeeRate feeRate;
+
+ feeRate = CFeeRate(0);
+ // Must always return 0
+ BOOST_CHECK_EQUAL(feeRate.GetFee(0), 0);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(1e5), 0);
+
+ feeRate = CFeeRate(1000);
+ // Must always just return the arg
+ BOOST_CHECK_EQUAL(feeRate.GetFee(0), 0);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(1), 1);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(121), 121);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(999), 999);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), 1e3);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), 9e3);
+
+ feeRate = CFeeRate(-1000);
+ // Must always just return -1 * arg
+ BOOST_CHECK_EQUAL(feeRate.GetFee(0), 0);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(1), -1);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(121), -121);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(999), -999);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), -1e3);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), -9e3);
+
+ feeRate = CFeeRate(123);
+ // Truncates the result, if not integer
+ BOOST_CHECK_EQUAL(feeRate.GetFee(0), 0);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(8), 1); // Special case: returns 1 instead of 0
+ BOOST_CHECK_EQUAL(feeRate.GetFee(9), 1);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(121), 14);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(122), 15);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(999), 122);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), 123);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), 1107);
+
+ feeRate = CFeeRate(-123);
+ // Truncates the result, if not integer
+ BOOST_CHECK_EQUAL(feeRate.GetFee(0), 0);
+ BOOST_CHECK_EQUAL(feeRate.GetFee(8), -1); // Special case: returns -1 instead of 0
+ BOOST_CHECK_EQUAL(feeRate.GetFee(9), -1);
+
+ // Check full constructor
+ // default value
+ BOOST_CHECK(CFeeRate(CAmount(-1), 1000) == CFeeRate(-1));
+ BOOST_CHECK(CFeeRate(CAmount(0), 1000) == CFeeRate(0));
+ BOOST_CHECK(CFeeRate(CAmount(1), 1000) == CFeeRate(1));
+ // lost precision (can only resolve satoshis per kB)
+ BOOST_CHECK(CFeeRate(CAmount(1), 1001) == CFeeRate(0));
+ BOOST_CHECK(CFeeRate(CAmount(2), 1001) == CFeeRate(1));
+ // some more integer checks
+ BOOST_CHECK(CFeeRate(CAmount(26), 789) == CFeeRate(32));
+ BOOST_CHECK(CFeeRate(CAmount(27), 789) == CFeeRate(34));
+ // Maximum size in bytes, should not crash
+ CFeeRate(MAX_MONEY, std::numeric_limits<size_t>::max() >> 1).GetFeePerK();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/arith_uint256_tests.cpp b/src/test/arith_uint256_tests.cpp
index 17d6bed6d2..b19d2faea0 100644
--- a/src/test/arith_uint256_tests.cpp
+++ b/src/test/arith_uint256_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -112,7 +112,7 @@ BOOST_AUTO_TEST_CASE( basics ) // constructors, equality, inequality
BOOST_CHECK( (R1L & arith_uint256("0xffffffffffffffff")) == arith_uint256(R1LLow64));
BOOST_CHECK(ZeroL == arith_uint256(0));
BOOST_CHECK(OneL == arith_uint256(1));
- BOOST_CHECK(arith_uint256("0xffffffffffffffff") = arith_uint256(0xffffffffffffffffULL));
+ BOOST_CHECK(arith_uint256("0xffffffffffffffff") == arith_uint256(0xffffffffffffffffULL));
// Assignment (from base_uint)
arith_uint256 tmpL = ~ZeroL; BOOST_CHECK(tmpL == ~ZeroL);
diff --git a/src/test/base32_tests.cpp b/src/test/base32_tests.cpp
index 8ec8861425..6422b3a88f 100644
--- a/src/test/base32_tests.cpp
+++ b/src/test/base32_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp
index 9845df697f..ac3ab4c83f 100644
--- a/src/test/base58_tests.cpp
+++ b/src/test/base58_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -79,7 +79,7 @@ class TestAddrTypeVisitor : public boost::static_visitor<bool>
private:
std::string exp_addrType;
public:
- TestAddrTypeVisitor(const std::string &exp_addrType) : exp_addrType(exp_addrType) { }
+ TestAddrTypeVisitor(const std::string &_exp_addrType) : exp_addrType(_exp_addrType) { }
bool operator()(const CKeyID &id) const
{
return (exp_addrType == "pubkey");
@@ -100,7 +100,7 @@ class TestPayloadVisitor : public boost::static_visitor<bool>
private:
std::vector<unsigned char> exp_payload;
public:
- TestPayloadVisitor(std::vector<unsigned char> &exp_payload) : exp_payload(exp_payload) { }
+ TestPayloadVisitor(std::vector<unsigned char> &_exp_payload) : exp_payload(_exp_payload) { }
bool operator()(const CKeyID &id) const
{
uint160 exp_key(exp_payload);
@@ -121,7 +121,6 @@ public:
BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
{
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);
@@ -179,7 +178,6 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
{
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;
for (unsigned int idx = 0; idx < tests.size(); idx++) {
UniValue test = tests[idx];
@@ -247,7 +245,6 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
BOOST_AUTO_TEST_CASE(base58_keys_invalid)
{
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;
diff --git a/src/test/base64_tests.cpp b/src/test/base64_tests.cpp
index 54c081b0ef..ccad94d946 100644
--- a/src/test/base64_tests.cpp
+++ b/src/test/base64_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/test/bctest.py b/src/test/bctest.py
index 3a8d0ea51b..d801415c70 100644
--- a/src/test/bctest.py
+++ b/src/test/bctest.py
@@ -1,7 +1,7 @@
# Copyright 2014 BitPay, Inc.
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
+from __future__ import division,print_function,unicode_literals
import subprocess
import os
import json
@@ -24,6 +24,9 @@ def bctest(testDir, testObj, exeext):
if "output_cmp" in testObj:
outputFn = testObj['output_cmp']
outputData = open(testDir + "/" + outputFn).read()
+ if not outputData:
+ print("Output data missing for " + outputFn)
+ sys.exit(1)
proc = subprocess.Popen(execrun, stdin=stdinCfg, stdout=subprocess.PIPE, stderr=subprocess.PIPE,universal_newlines=True)
try:
outs = proc.communicate(input=inputData)
@@ -42,13 +45,17 @@ def bctest(testDir, testObj, exeext):
print("Return code mismatch for " + outputFn)
sys.exit(1)
-def bctester(testDir, input_basename, buildenv):
+def bctester(testDir, input_basename, buildenv, verbose = False):
input_filename = testDir + "/" + input_basename
raw_data = open(input_filename).read()
input_data = json.loads(raw_data)
for testObj in input_data:
+ if verbose and "description" in testObj:
+ print ("Testing: " + testObj["description"])
bctest(testDir, testObj, buildenv.exeext)
+ if verbose and "description" in testObj:
+ print ("PASS")
sys.exit(0)
diff --git a/src/test/bip32_tests.cpp b/src/test/bip32_tests.cpp
index 69084213a2..7f1c2a32dd 100644
--- a/src/test/bip32_tests.cpp
+++ b/src/test/bip32_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2013 The Bitcoin Core developers
+// Copyright (c) 2013-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.
@@ -117,6 +117,22 @@ void RunTest(const TestVector &test) {
}
key = keyNew;
pubkey = pubkeyNew;
+
+ CDataStream ssPub(SER_DISK, CLIENT_VERSION);
+ ssPub << pubkeyNew;
+ BOOST_CHECK(ssPub.size() == 75);
+
+ CDataStream ssPriv(SER_DISK, CLIENT_VERSION);
+ ssPriv << keyNew;
+ BOOST_CHECK(ssPriv.size() == 75);
+
+ CExtPubKey pubCheck;
+ CExtKey privCheck;
+ ssPub >> pubCheck;
+ ssPriv >> privCheck;
+
+ BOOST_CHECK(pubCheck == pubkeyNew);
+ BOOST_CHECK(privCheck == keyNew);
}
}
diff --git a/src/test/bitcoin-util-test.py b/src/test/bitcoin-util-test.py
index 20afb16a9e..3099506d6d 100755
--- a/src/test/bitcoin-util-test.py
+++ b/src/test/bitcoin-util-test.py
@@ -1,13 +1,32 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright 2014 BitPay, Inc.
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
+from __future__ import division,print_function,unicode_literals
import os
import bctest
import buildenv
+import argparse
-if __name__ == '__main__':
- bctest.bctester(os.environ["srcdir"] + "/test/data",
- "bitcoin-util-test.json",buildenv)
+help_text="""Test framework for bitcoin utils.
+
+Runs automatically during `make check`.
+
+Can also be run manually from the src directory by specifiying the source directory:
+test/bitcoin-util-test.py --src=[srcdir]
+"""
+
+
+if __name__ == '__main__':
+ verbose = False
+ try:
+ srcdir = os.environ["srcdir"]
+ except:
+ parser = argparse.ArgumentParser(description=help_text)
+ parser.add_argument('-s', '--srcdir')
+ parser.add_argument('-v', '--verbose', action='store_true')
+ args = parser.parse_args()
+ srcdir = args.srcdir
+ verbose = args.verbose
+ bctest.bctester(srcdir + "/test/data", "bitcoin-util-test.json", buildenv, verbose = verbose)
diff --git a/src/test/blockencodings_tests.cpp b/src/test/blockencodings_tests.cpp
new file mode 100644
index 0000000000..7530b013bd
--- /dev/null
+++ b/src/test/blockencodings_tests.cpp
@@ -0,0 +1,314 @@
+// 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 "blockencodings.h"
+#include "consensus/merkle.h"
+#include "chainparams.h"
+#include "random.h"
+
+#include "test/test_bitcoin.h"
+
+#include <boost/test/unit_test.hpp>
+
+struct RegtestingSetup : public TestingSetup {
+ RegtestingSetup() : TestingSetup(CBaseChainParams::REGTEST) {}
+};
+
+BOOST_FIXTURE_TEST_SUITE(blockencodings_tests, RegtestingSetup)
+
+static CBlock BuildBlockTestCase() {
+ CBlock block;
+ CMutableTransaction tx;
+ tx.vin.resize(1);
+ tx.vin[0].scriptSig.resize(10);
+ tx.vout.resize(1);
+ tx.vout[0].nValue = 42;
+
+ block.vtx.resize(3);
+ block.vtx[0] = tx;
+ block.nVersion = 42;
+ block.hashPrevBlock = GetRandHash();
+ block.nBits = 0x207fffff;
+
+ tx.vin[0].prevout.hash = GetRandHash();
+ tx.vin[0].prevout.n = 0;
+ block.vtx[1] = tx;
+
+ tx.vin.resize(10);
+ for (size_t i = 0; i < tx.vin.size(); i++) {
+ tx.vin[i].prevout.hash = GetRandHash();
+ tx.vin[i].prevout.n = 0;
+ }
+ block.vtx[2] = tx;
+
+ bool mutated;
+ block.hashMerkleRoot = BlockMerkleRoot(block, &mutated);
+ assert(!mutated);
+ while (!CheckProofOfWork(block.GetHash(), block.nBits, Params().GetConsensus())) ++block.nNonce;
+ return block;
+}
+
+// Number of shared use_counts we expect for a tx we havent touched
+// == 2 (mempool + our copy from the GetSharedTx call)
+#define SHARED_TX_OFFSET 2
+
+BOOST_AUTO_TEST_CASE(SimpleRoundTripTest)
+{
+ CTxMemPool pool(CFeeRate(0));
+ TestMemPoolEntryHelper entry;
+ CBlock block(BuildBlockTestCase());
+
+ pool.addUnchecked(block.vtx[2].GetHash(), entry.FromTx(block.vtx[2]));
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0);
+
+ // Do a simple ShortTxIDs RT
+ {
+ CBlockHeaderAndShortTxIDs shortIDs(block, true);
+
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << shortIDs;
+
+ CBlockHeaderAndShortTxIDs shortIDs2;
+ stream >> shortIDs2;
+
+ PartiallyDownloadedBlock partialBlock(&pool);
+ BOOST_CHECK(partialBlock.InitData(shortIDs2) == READ_STATUS_OK);
+ BOOST_CHECK( partialBlock.IsTxAvailable(0));
+ BOOST_CHECK(!partialBlock.IsTxAvailable(1));
+ BOOST_CHECK( partialBlock.IsTxAvailable(2));
+
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 1);
+
+ std::list<CTransaction> removed;
+ pool.removeRecursive(block.vtx[2], removed);
+ BOOST_CHECK_EQUAL(removed.size(), 1);
+
+ CBlock block2;
+ std::vector<CTransaction> vtx_missing;
+ BOOST_CHECK(partialBlock.FillBlock(block2, vtx_missing) == READ_STATUS_INVALID); // No transactions
+
+ vtx_missing.push_back(block.vtx[2]); // Wrong transaction
+ partialBlock.FillBlock(block2, vtx_missing); // Current implementation doesn't check txn here, but don't require that
+ bool mutated;
+ BOOST_CHECK(block.hashMerkleRoot != BlockMerkleRoot(block2, &mutated));
+
+ vtx_missing[0] = block.vtx[1];
+ CBlock block3;
+ BOOST_CHECK(partialBlock.FillBlock(block3, vtx_missing) == READ_STATUS_OK);
+ BOOST_CHECK_EQUAL(block.GetHash().ToString(), block3.GetHash().ToString());
+ BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block3, &mutated).ToString());
+ BOOST_CHECK(!mutated);
+ }
+}
+
+class TestHeaderAndShortIDs {
+ // Utility to encode custom CBlockHeaderAndShortTxIDs
+public:
+ CBlockHeader header;
+ uint64_t nonce;
+ std::vector<uint64_t> shorttxids;
+ std::vector<PrefilledTransaction> prefilledtxn;
+
+ TestHeaderAndShortIDs(const CBlockHeaderAndShortTxIDs& orig) {
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << orig;
+ stream >> *this;
+ }
+ TestHeaderAndShortIDs(const CBlock& block) :
+ TestHeaderAndShortIDs(CBlockHeaderAndShortTxIDs(block, true)) {}
+
+ uint64_t GetShortID(const uint256& txhash) const {
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << *this;
+ CBlockHeaderAndShortTxIDs base;
+ stream >> base;
+ return base.GetShortID(txhash);
+ }
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(header);
+ READWRITE(nonce);
+ size_t shorttxids_size = shorttxids.size();
+ READWRITE(VARINT(shorttxids_size));
+ shorttxids.resize(shorttxids_size);
+ for (size_t i = 0; i < shorttxids.size(); i++) {
+ uint32_t lsb = shorttxids[i] & 0xffffffff;
+ uint16_t msb = (shorttxids[i] >> 32) & 0xffff;
+ READWRITE(lsb);
+ READWRITE(msb);
+ shorttxids[i] = (uint64_t(msb) << 32) | uint64_t(lsb);
+ }
+ READWRITE(prefilledtxn);
+ }
+};
+
+BOOST_AUTO_TEST_CASE(NonCoinbasePreforwardRTTest)
+{
+ CTxMemPool pool(CFeeRate(0));
+ TestMemPoolEntryHelper entry;
+ CBlock block(BuildBlockTestCase());
+
+ pool.addUnchecked(block.vtx[2].GetHash(), entry.FromTx(block.vtx[2]));
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0);
+
+ // Test with pre-forwarding tx 1, but not coinbase
+ {
+ TestHeaderAndShortIDs shortIDs(block);
+ shortIDs.prefilledtxn.resize(1);
+ shortIDs.prefilledtxn[0] = {1, block.vtx[1]};
+ shortIDs.shorttxids.resize(2);
+ shortIDs.shorttxids[0] = shortIDs.GetShortID(block.vtx[0].GetHash());
+ shortIDs.shorttxids[1] = shortIDs.GetShortID(block.vtx[2].GetHash());
+
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << shortIDs;
+
+ CBlockHeaderAndShortTxIDs shortIDs2;
+ stream >> shortIDs2;
+
+ PartiallyDownloadedBlock partialBlock(&pool);
+ BOOST_CHECK(partialBlock.InitData(shortIDs2) == READ_STATUS_OK);
+ BOOST_CHECK(!partialBlock.IsTxAvailable(0));
+ BOOST_CHECK( partialBlock.IsTxAvailable(1));
+ BOOST_CHECK( partialBlock.IsTxAvailable(2));
+
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 1);
+
+ CBlock block2;
+ std::vector<CTransaction> vtx_missing;
+ BOOST_CHECK(partialBlock.FillBlock(block2, vtx_missing) == READ_STATUS_INVALID); // No transactions
+
+ vtx_missing.push_back(block.vtx[1]); // Wrong transaction
+ partialBlock.FillBlock(block2, vtx_missing); // Current implementation doesn't check txn here, but don't require that
+ bool mutated;
+ BOOST_CHECK(block.hashMerkleRoot != BlockMerkleRoot(block2, &mutated));
+
+ vtx_missing[0] = block.vtx[0];
+ CBlock block3;
+ BOOST_CHECK(partialBlock.FillBlock(block3, vtx_missing) == READ_STATUS_OK);
+ BOOST_CHECK_EQUAL(block.GetHash().ToString(), block3.GetHash().ToString());
+ BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block3, &mutated).ToString());
+ BOOST_CHECK(!mutated);
+
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 1);
+ }
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0);
+}
+
+BOOST_AUTO_TEST_CASE(SufficientPreforwardRTTest)
+{
+ CTxMemPool pool(CFeeRate(0));
+ TestMemPoolEntryHelper entry;
+ CBlock block(BuildBlockTestCase());
+
+ pool.addUnchecked(block.vtx[1].GetHash(), entry.FromTx(block.vtx[1]));
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[1].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0);
+
+ // Test with pre-forwarding coinbase + tx 2 with tx 1 in mempool
+ {
+ TestHeaderAndShortIDs shortIDs(block);
+ shortIDs.prefilledtxn.resize(2);
+ shortIDs.prefilledtxn[0] = {0, block.vtx[0]};
+ shortIDs.prefilledtxn[1] = {1, block.vtx[2]}; // id == 1 as it is 1 after index 1
+ shortIDs.shorttxids.resize(1);
+ shortIDs.shorttxids[0] = shortIDs.GetShortID(block.vtx[1].GetHash());
+
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << shortIDs;
+
+ CBlockHeaderAndShortTxIDs shortIDs2;
+ stream >> shortIDs2;
+
+ PartiallyDownloadedBlock partialBlock(&pool);
+ BOOST_CHECK(partialBlock.InitData(shortIDs2) == READ_STATUS_OK);
+ BOOST_CHECK( partialBlock.IsTxAvailable(0));
+ BOOST_CHECK( partialBlock.IsTxAvailable(1));
+ BOOST_CHECK( partialBlock.IsTxAvailable(2));
+
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[1].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 1);
+
+ CBlock block2;
+ std::vector<CTransaction> vtx_missing;
+ BOOST_CHECK(partialBlock.FillBlock(block2, vtx_missing) == READ_STATUS_OK);
+ BOOST_CHECK_EQUAL(block.GetHash().ToString(), block2.GetHash().ToString());
+ bool mutated;
+ BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block2, &mutated).ToString());
+ BOOST_CHECK(!mutated);
+
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[1].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 1);
+ }
+ BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[1].GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0);
+}
+
+BOOST_AUTO_TEST_CASE(EmptyBlockRoundTripTest)
+{
+ CTxMemPool pool(CFeeRate(0));
+ CMutableTransaction coinbase;
+ coinbase.vin.resize(1);
+ coinbase.vin[0].scriptSig.resize(10);
+ coinbase.vout.resize(1);
+ coinbase.vout[0].nValue = 42;
+
+ CBlock block;
+ block.vtx.resize(1);
+ block.vtx[0] = coinbase;
+ block.nVersion = 42;
+ block.hashPrevBlock = GetRandHash();
+ block.nBits = 0x207fffff;
+
+ bool mutated;
+ block.hashMerkleRoot = BlockMerkleRoot(block, &mutated);
+ assert(!mutated);
+ while (!CheckProofOfWork(block.GetHash(), block.nBits, Params().GetConsensus())) ++block.nNonce;
+
+ // Test simple header round-trip with only coinbase
+ {
+ CBlockHeaderAndShortTxIDs shortIDs(block, false);
+
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << shortIDs;
+
+ CBlockHeaderAndShortTxIDs shortIDs2;
+ stream >> shortIDs2;
+
+ PartiallyDownloadedBlock partialBlock(&pool);
+ BOOST_CHECK(partialBlock.InitData(shortIDs2) == READ_STATUS_OK);
+ BOOST_CHECK(partialBlock.IsTxAvailable(0));
+
+ CBlock block2;
+ std::vector<CTransaction> vtx_missing;
+ BOOST_CHECK(partialBlock.FillBlock(block2, vtx_missing) == READ_STATUS_OK);
+ BOOST_CHECK_EQUAL(block.GetHash().ToString(), block2.GetHash().ToString());
+ BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block2, &mutated).ToString());
+ BOOST_CHECK(!mutated);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(TransactionsRequestSerializationTest) {
+ BlockTransactionsRequest req1;
+ req1.blockhash = GetRandHash();
+ req1.indexes.resize(4);
+ req1.indexes[0] = 0;
+ req1.indexes[1] = 1;
+ req1.indexes[2] = 3;
+ req1.indexes[3] = 4;
+
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << req1;
+
+ BlockTransactionsRequest req2;
+ stream >> req2;
+
+ BOOST_CHECK_EQUAL(req1.blockhash.ToString(), req2.blockhash.ToString());
+ BOOST_CHECK_EQUAL(req1.indexes.size(), req2.indexes.size());
+ BOOST_CHECK_EQUAL(req1.indexes[0], req2.indexes[0]);
+ BOOST_CHECK_EQUAL(req1.indexes[1], req2.indexes[1]);
+ BOOST_CHECK_EQUAL(req1.indexes[2], req2.indexes[2]);
+ BOOST_CHECK_EQUAL(req1.indexes[3], req2.indexes[3]);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/bloom_tests.cpp b/src/test/bloom_tests.cpp
index 6b30d6aa8a..042fad42da 100644
--- a/src/test/bloom_tests.cpp
+++ b/src/test/bloom_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
@@ -204,7 +204,8 @@ BOOST_AUTO_TEST_CASE(merkle_block_1)
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 8);
vector<uint256> vMatched;
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ vector<unsigned int> vIndex;
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -221,7 +222,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_1)
BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0xdd1fd2a6fc16404faf339881a90adbde7f4f728691ac62e8f168809cdfae1053"));
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 7);
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -249,7 +250,8 @@ BOOST_AUTO_TEST_CASE(merkle_block_2)
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
vector<uint256> vMatched;
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ vector<unsigned int> vIndex;
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -275,7 +277,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2)
BOOST_CHECK(merkleBlock.vMatchedTxn[3].second == uint256S("0x3c1d7e82342158e4109df2e0b6348b6e84e403d8b4046d7007663ace63cddb23"));
BOOST_CHECK(merkleBlock.vMatchedTxn[3].first == 3);
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -303,7 +305,8 @@ BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
vector<uint256> vMatched;
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ vector<unsigned int> vIndex;
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -326,7 +329,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
BOOST_CHECK(merkleBlock.vMatchedTxn[2].second == uint256S("0x3c1d7e82342158e4109df2e0b6348b6e84e403d8b4046d7007663ace63cddb23"));
BOOST_CHECK(merkleBlock.vMatchedTxn[2].first == 3);
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -353,7 +356,8 @@ BOOST_AUTO_TEST_CASE(merkle_block_3_and_serialize)
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
vector<uint256> vMatched;
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ vector<unsigned int> vIndex;
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -392,7 +396,8 @@ BOOST_AUTO_TEST_CASE(merkle_block_4)
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 6);
vector<uint256> vMatched;
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ vector<unsigned int> vIndex;
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -409,7 +414,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_4)
BOOST_CHECK(merkleBlock.vMatchedTxn[1] == pair);
- BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched) == block.hashMerkleRoot);
+ BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
@@ -509,11 +514,14 @@ BOOST_AUTO_TEST_CASE(rolling_bloom)
if (i >= 100)
BOOST_CHECK(rb1.contains(data[i-100]));
rb1.insert(data[i]);
+ BOOST_CHECK(rb1.contains(data[i]));
}
// Insert 999 more random entries:
for (int i = 0; i < 999; i++) {
- rb1.insert(RandomData());
+ std::vector<unsigned char> d = RandomData();
+ rb1.insert(d);
+ BOOST_CHECK(rb1.contains(d));
}
// Sanity check to make sure the filter isn't just filling up:
nHits = 0;
diff --git a/src/test/buildenv.py.in b/src/test/buildenv.py.in
index 1618bdeb76..153f34a3db 100644
--- a/src/test/buildenv.py.in
+++ b/src/test/buildenv.py.in
@@ -1,2 +1,2 @@
-#!/usr/bin/python
+#!/usr/bin/env python
exeext="@EXEEXT@"
diff --git a/src/test/checkblock_tests.cpp b/src/test/checkblock_tests.cpp
deleted file mode 100644
index f7e2470617..0000000000
--- a/src/test/checkblock_tests.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2013-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.
-
-#include "clientversion.h"
-#include "consensus/validation.h"
-#include "main.h" // For CheckBlock
-#include "primitives/block.h"
-#include "test/test_bitcoin.h"
-#include "utiltime.h"
-
-#include <cstdio>
-
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
-#include <boost/test/unit_test.hpp>
-
-
-BOOST_FIXTURE_TEST_SUITE(CheckBlock_tests, BasicTestingSetup)
-
-bool read_block(const std::string& filename, CBlock& block)
-{
- namespace fs = boost::filesystem;
- fs::path testFile = fs::current_path() / "data" / filename;
-#ifdef TEST_DATA_DIR
- if (!fs::exists(testFile))
- {
- testFile = fs::path(BOOST_PP_STRINGIZE(TEST_DATA_DIR)) / filename;
- }
-#endif
- FILE* fp = fopen(testFile.string().c_str(), "rb");
- if (!fp) return false;
-
- fseek(fp, 8, SEEK_SET); // skip msgheader/size
-
- CAutoFile filein(fp, SER_DISK, CLIENT_VERSION);
- if (filein.IsNull()) return false;
-
- filein >> block;
-
- return true;
-}
-
-BOOST_AUTO_TEST_CASE(May15)
-{
- // Putting a 1MB binary file in the git repository is not a great
- // idea, so this test is only run if you manually download
- // test/data/Mar12Fork.dat from
- // http://sourceforge.net/projects/bitcoin/files/Bitcoin/blockchain/Mar12Fork.dat/download
- unsigned int tMay15 = 1368576000;
- SetMockTime(tMay15); // Test as if it was right at May 15
-
- CBlock forkingBlock;
- if (read_block("Mar12Fork.dat", forkingBlock))
- {
- CValidationState state;
-
- // After May 15'th, big blocks are OK:
- forkingBlock.nTime = tMay15; // Invalidates PoW
- BOOST_CHECK(CheckBlock(forkingBlock, state, false, false));
- }
-
- SetMockTime(0);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp
index 9489a19f63..e692326559 100644
--- a/src/test/coins_tests.cpp
+++ b/src/test/coins_tests.cpp
@@ -1,10 +1,12 @@
-// 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.
#include "coins.h"
#include "random.h"
+#include "script/standard.h"
#include "uint256.h"
+#include "utilstrencodings.h"
#include "test/test_bitcoin.h"
#include "main.h"
#include "consensus/validation.h"
@@ -61,8 +63,6 @@ public:
hashBestBlock_ = hashBlock;
return true;
}
-
- bool GetStats(CCoinsStats& stats) const { return false; }
};
class CCoinsViewCacheTest : public CCoinsViewCache
@@ -297,8 +297,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
CCoins &coins = result[tx.GetHash()];
coins.FromTx(tx, height);
- CValidationState dummy;
- UpdateCoins(tx, dummy, *(stack.back()), height);
+ UpdateCoins(tx, *(stack.back()), height);
}
// Once every 1000 iterations and at the end, verify the full cache.
@@ -347,4 +346,73 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
BOOST_CHECK(spent_a_duplicate_coinbase);
}
+BOOST_AUTO_TEST_CASE(ccoins_serialization)
+{
+ // Good example
+ CDataStream ss1(ParseHex("0104835800816115944e077fe7c803cfa57f29b36bf87c1d358bb85e"), SER_DISK, CLIENT_VERSION);
+ CCoins cc1;
+ ss1 >> cc1;
+ BOOST_CHECK_EQUAL(cc1.nVersion, 1);
+ BOOST_CHECK_EQUAL(cc1.fCoinBase, false);
+ BOOST_CHECK_EQUAL(cc1.nHeight, 203998);
+ BOOST_CHECK_EQUAL(cc1.vout.size(), 2);
+ BOOST_CHECK_EQUAL(cc1.IsAvailable(0), false);
+ BOOST_CHECK_EQUAL(cc1.IsAvailable(1), true);
+ BOOST_CHECK_EQUAL(cc1.vout[1].nValue, 60000000000ULL);
+ BOOST_CHECK_EQUAL(HexStr(cc1.vout[1].scriptPubKey), HexStr(GetScriptForDestination(CKeyID(uint160(ParseHex("816115944e077fe7c803cfa57f29b36bf87c1d35"))))));
+
+ // Good example
+ CDataStream ss2(ParseHex("0109044086ef97d5790061b01caab50f1b8e9c50a5057eb43c2d9563a4eebbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa486af3b"), SER_DISK, CLIENT_VERSION);
+ CCoins cc2;
+ ss2 >> cc2;
+ BOOST_CHECK_EQUAL(cc2.nVersion, 1);
+ BOOST_CHECK_EQUAL(cc2.fCoinBase, true);
+ BOOST_CHECK_EQUAL(cc2.nHeight, 120891);
+ BOOST_CHECK_EQUAL(cc2.vout.size(), 17);
+ for (int i = 0; i < 17; i++) {
+ BOOST_CHECK_EQUAL(cc2.IsAvailable(i), i == 4 || i == 16);
+ }
+ BOOST_CHECK_EQUAL(cc2.vout[4].nValue, 234925952);
+ BOOST_CHECK_EQUAL(HexStr(cc2.vout[4].scriptPubKey), HexStr(GetScriptForDestination(CKeyID(uint160(ParseHex("61b01caab50f1b8e9c50a5057eb43c2d9563a4ee"))))));
+ BOOST_CHECK_EQUAL(cc2.vout[16].nValue, 110397);
+ BOOST_CHECK_EQUAL(HexStr(cc2.vout[16].scriptPubKey), HexStr(GetScriptForDestination(CKeyID(uint160(ParseHex("8c988f1a4a4de2161e0f50aac7f17e7f9555caa4"))))));
+
+ // Smallest possible example
+ CDataStream ssx(SER_DISK, CLIENT_VERSION);
+ BOOST_CHECK_EQUAL(HexStr(ssx.begin(), ssx.end()), "");
+
+ CDataStream ss3(ParseHex("0002000600"), SER_DISK, CLIENT_VERSION);
+ CCoins cc3;
+ ss3 >> cc3;
+ BOOST_CHECK_EQUAL(cc3.nVersion, 0);
+ BOOST_CHECK_EQUAL(cc3.fCoinBase, false);
+ BOOST_CHECK_EQUAL(cc3.nHeight, 0);
+ BOOST_CHECK_EQUAL(cc3.vout.size(), 1);
+ BOOST_CHECK_EQUAL(cc3.IsAvailable(0), true);
+ BOOST_CHECK_EQUAL(cc3.vout[0].nValue, 0);
+ BOOST_CHECK_EQUAL(cc3.vout[0].scriptPubKey.size(), 0);
+
+ // scriptPubKey that ends beyond the end of the stream
+ CDataStream ss4(ParseHex("0002000800"), SER_DISK, CLIENT_VERSION);
+ try {
+ CCoins cc4;
+ ss4 >> cc4;
+ BOOST_CHECK_MESSAGE(false, "We should have thrown");
+ } catch (const std::ios_base::failure& e) {
+ }
+
+ // Very large scriptPubKey (3*10^9 bytes) past the end of the stream
+ CDataStream tmp(SER_DISK, CLIENT_VERSION);
+ uint64_t x = 3000000000ULL;
+ tmp << VARINT(x);
+ BOOST_CHECK_EQUAL(HexStr(tmp.begin(), tmp.end()), "8a95c0bb00");
+ CDataStream ss5(ParseHex("0002008a95c0bb0000"), SER_DISK, CLIENT_VERSION);
+ try {
+ CCoins cc5;
+ ss5 >> cc5;
+ BOOST_CHECK_MESSAGE(false, "We should have thrown");
+ } catch (const std::ios_base::failure& e) {
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/compress_tests.cpp b/src/test/compress_tests.cpp
index 376ae93681..35e4458bba 100644
--- a/src/test/compress_tests.cpp
+++ b/src/test/compress_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
diff --git a/src/test/crypto_tests.cpp b/src/test/crypto_tests.cpp
index aeb2a5caa3..ff0adae1d2 100644
--- a/src/test/crypto_tests.cpp
+++ b/src/test/crypto_tests.cpp
@@ -1,7 +1,8 @@
-// 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.
+#include "crypto/aes.h"
#include "crypto/ripemd160.h"
#include "crypto/sha1.h"
#include "crypto/sha256.h"
@@ -16,6 +17,8 @@
#include <boost/assign/list_of.hpp>
#include <boost/test/unit_test.hpp>
+#include <openssl/aes.h>
+#include <openssl/evp.h>
BOOST_FIXTURE_TEST_SUITE(crypto_tests, BasicTestingSetup)
@@ -63,6 +66,127 @@ void TestHMACSHA512(const std::string &hexkey, const std::string &hexin, const s
TestVector(CHMAC_SHA512(&key[0], key.size()), ParseHex(hexin), ParseHex(hexout));
}
+void TestAES128(const std::string &hexkey, const std::string &hexin, const std::string &hexout)
+{
+ std::vector<unsigned char> key = ParseHex(hexkey);
+ std::vector<unsigned char> in = ParseHex(hexin);
+ std::vector<unsigned char> correctout = ParseHex(hexout);
+ std::vector<unsigned char> buf, buf2;
+
+ assert(key.size() == 16);
+ assert(in.size() == 16);
+ assert(correctout.size() == 16);
+ AES128Encrypt enc(&key[0]);
+ buf.resize(correctout.size());
+ buf2.resize(correctout.size());
+ enc.Encrypt(&buf[0], &in[0]);
+ BOOST_CHECK_EQUAL(HexStr(buf), HexStr(correctout));
+ AES128Decrypt dec(&key[0]);
+ dec.Decrypt(&buf2[0], &buf[0]);
+ BOOST_CHECK_EQUAL(HexStr(buf2), HexStr(in));
+}
+
+void TestAES256(const std::string &hexkey, const std::string &hexin, const std::string &hexout)
+{
+ std::vector<unsigned char> key = ParseHex(hexkey);
+ std::vector<unsigned char> in = ParseHex(hexin);
+ std::vector<unsigned char> correctout = ParseHex(hexout);
+ std::vector<unsigned char> buf;
+
+ assert(key.size() == 32);
+ assert(in.size() == 16);
+ assert(correctout.size() == 16);
+ AES256Encrypt enc(&key[0]);
+ buf.resize(correctout.size());
+ enc.Encrypt(&buf[0], &in[0]);
+ BOOST_CHECK(buf == correctout);
+ AES256Decrypt dec(&key[0]);
+ dec.Decrypt(&buf[0], &buf[0]);
+ BOOST_CHECK(buf == in);
+}
+
+void TestAES128CBC(const std::string &hexkey, const std::string &hexiv, bool pad, const std::string &hexin, const std::string &hexout)
+{
+ std::vector<unsigned char> key = ParseHex(hexkey);
+ std::vector<unsigned char> iv = ParseHex(hexiv);
+ std::vector<unsigned char> in = ParseHex(hexin);
+ std::vector<unsigned char> correctout = ParseHex(hexout);
+ std::vector<unsigned char> realout(in.size() + AES_BLOCKSIZE);
+
+ // Encrypt the plaintext and verify that it equals the cipher
+ AES128CBCEncrypt enc(&key[0], &iv[0], pad);
+ int size = enc.Encrypt(&in[0], in.size(), &realout[0]);
+ realout.resize(size);
+ BOOST_CHECK(realout.size() == correctout.size());
+ BOOST_CHECK_MESSAGE(realout == correctout, HexStr(realout) + std::string(" != ") + hexout);
+
+ // Decrypt the cipher and verify that it equals the plaintext
+ std::vector<unsigned char> decrypted(correctout.size());
+ AES128CBCDecrypt dec(&key[0], &iv[0], pad);
+ size = dec.Decrypt(&correctout[0], correctout.size(), &decrypted[0]);
+ decrypted.resize(size);
+ BOOST_CHECK(decrypted.size() == in.size());
+ BOOST_CHECK_MESSAGE(decrypted == in, HexStr(decrypted) + std::string(" != ") + hexin);
+
+ // Encrypt and re-decrypt substrings of the plaintext and verify that they equal each-other
+ for(std::vector<unsigned char>::iterator i(in.begin()); i != in.end(); ++i)
+ {
+ std::vector<unsigned char> sub(i, in.end());
+ std::vector<unsigned char> subout(sub.size() + AES_BLOCKSIZE);
+ int _size = enc.Encrypt(&sub[0], sub.size(), &subout[0]);
+ if (_size != 0)
+ {
+ subout.resize(_size);
+ std::vector<unsigned char> subdecrypted(subout.size());
+ _size = dec.Decrypt(&subout[0], subout.size(), &subdecrypted[0]);
+ subdecrypted.resize(_size);
+ BOOST_CHECK(decrypted.size() == in.size());
+ BOOST_CHECK_MESSAGE(subdecrypted == sub, HexStr(subdecrypted) + std::string(" != ") + HexStr(sub));
+ }
+ }
+}
+
+void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, bool pad, const std::string &hexin, const std::string &hexout)
+{
+ std::vector<unsigned char> key = ParseHex(hexkey);
+ std::vector<unsigned char> iv = ParseHex(hexiv);
+ std::vector<unsigned char> in = ParseHex(hexin);
+ std::vector<unsigned char> correctout = ParseHex(hexout);
+ std::vector<unsigned char> realout(in.size() + AES_BLOCKSIZE);
+
+ // Encrypt the plaintext and verify that it equals the cipher
+ AES256CBCEncrypt enc(&key[0], &iv[0], pad);
+ int size = enc.Encrypt(&in[0], in.size(), &realout[0]);
+ realout.resize(size);
+ BOOST_CHECK(realout.size() == correctout.size());
+ BOOST_CHECK_MESSAGE(realout == correctout, HexStr(realout) + std::string(" != ") + hexout);
+
+ // Decrypt the cipher and verify that it equals the plaintext
+ std::vector<unsigned char> decrypted(correctout.size());
+ AES256CBCDecrypt dec(&key[0], &iv[0], pad);
+ size = dec.Decrypt(&correctout[0], correctout.size(), &decrypted[0]);
+ decrypted.resize(size);
+ BOOST_CHECK(decrypted.size() == in.size());
+ BOOST_CHECK_MESSAGE(decrypted == in, HexStr(decrypted) + std::string(" != ") + hexin);
+
+ // Encrypt and re-decrypt substrings of the plaintext and verify that they equal each-other
+ for(std::vector<unsigned char>::iterator i(in.begin()); i != in.end(); ++i)
+ {
+ std::vector<unsigned char> sub(i, in.end());
+ std::vector<unsigned char> subout(sub.size() + AES_BLOCKSIZE);
+ int _size = enc.Encrypt(&sub[0], sub.size(), &subout[0]);
+ if (_size != 0)
+ {
+ subout.resize(_size);
+ std::vector<unsigned char> subdecrypted(subout.size());
+ _size = dec.Decrypt(&subout[0], subout.size(), &subdecrypted[0]);
+ subdecrypted.resize(_size);
+ BOOST_CHECK(decrypted.size() == in.size());
+ BOOST_CHECK_MESSAGE(subdecrypted == sub, HexStr(subdecrypted) + std::string(" != ") + HexStr(sub));
+ }
+ }
+}
+
std::string LongTestString(void) {
std::string ret;
for (int i=0; i<200000; i++) {
@@ -248,4 +372,71 @@ BOOST_AUTO_TEST_CASE(hmac_sha512_testvectors) {
"b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58");
}
+BOOST_AUTO_TEST_CASE(aes_testvectors) {
+ // AES test vectors from FIPS 197.
+ TestAES128("000102030405060708090a0b0c0d0e0f", "00112233445566778899aabbccddeeff", "69c4e0d86a7b0430d8cdb78070b4c55a");
+ TestAES256("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", "00112233445566778899aabbccddeeff", "8ea2b7ca516745bfeafc49904b496089");
+
+ // AES-ECB test vectors from NIST sp800-38a.
+ TestAES128("2b7e151628aed2a6abf7158809cf4f3c", "6bc1bee22e409f96e93d7e117393172a", "3ad77bb40d7a3660a89ecaf32466ef97");
+ TestAES128("2b7e151628aed2a6abf7158809cf4f3c", "ae2d8a571e03ac9c9eb76fac45af8e51", "f5d3d58503b9699de785895a96fdbaaf");
+ TestAES128("2b7e151628aed2a6abf7158809cf4f3c", "30c81c46a35ce411e5fbc1191a0a52ef", "43b1cd7f598ece23881b00e3ed030688");
+ TestAES128("2b7e151628aed2a6abf7158809cf4f3c", "f69f2445df4f9b17ad2b417be66c3710", "7b0c785e27e8ad3f8223207104725dd4");
+ TestAES256("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "6bc1bee22e409f96e93d7e117393172a", "f3eed1bdb5d2a03c064b5a7e3db181f8");
+ TestAES256("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "ae2d8a571e03ac9c9eb76fac45af8e51", "591ccb10d410ed26dc5ba74a31362870");
+ TestAES256("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "30c81c46a35ce411e5fbc1191a0a52ef", "b6ed21b99ca6f4f9f153e7b1beafed1d");
+ TestAES256("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "f69f2445df4f9b17ad2b417be66c3710", "23304b7a39f9f3ff067d8d8f9e24ecc7");
+}
+
+BOOST_AUTO_TEST_CASE(aes_cbc_testvectors) {
+
+ // NIST AES CBC 128-bit encryption test-vectors
+ TestAES128CBC("2b7e151628aed2a6abf7158809cf4f3c", "000102030405060708090A0B0C0D0E0F", false, \
+ "6bc1bee22e409f96e93d7e117393172a", "7649abac8119b246cee98e9b12e9197d");
+ TestAES128CBC("2b7e151628aed2a6abf7158809cf4f3c", "7649ABAC8119B246CEE98E9B12E9197D", false, \
+ "ae2d8a571e03ac9c9eb76fac45af8e51", "5086cb9b507219ee95db113a917678b2");
+ TestAES128CBC("2b7e151628aed2a6abf7158809cf4f3c", "5086cb9b507219ee95db113a917678b2", false, \
+ "30c81c46a35ce411e5fbc1191a0a52ef", "73bed6b8e3c1743b7116e69e22229516");
+ TestAES128CBC("2b7e151628aed2a6abf7158809cf4f3c", "73bed6b8e3c1743b7116e69e22229516", false, \
+ "f69f2445df4f9b17ad2b417be66c3710", "3ff1caa1681fac09120eca307586e1a7");
+
+ // The same vectors with padding enabled
+ TestAES128CBC("2b7e151628aed2a6abf7158809cf4f3c", "000102030405060708090A0B0C0D0E0F", true, \
+ "6bc1bee22e409f96e93d7e117393172a", "7649abac8119b246cee98e9b12e9197d8964e0b149c10b7b682e6e39aaeb731c");
+ TestAES128CBC("2b7e151628aed2a6abf7158809cf4f3c", "7649ABAC8119B246CEE98E9B12E9197D", true, \
+ "ae2d8a571e03ac9c9eb76fac45af8e51", "5086cb9b507219ee95db113a917678b255e21d7100b988ffec32feeafaf23538");
+ TestAES128CBC("2b7e151628aed2a6abf7158809cf4f3c", "5086cb9b507219ee95db113a917678b2", true, \
+ "30c81c46a35ce411e5fbc1191a0a52ef", "73bed6b8e3c1743b7116e69e22229516f6eccda327bf8e5ec43718b0039adceb");
+ TestAES128CBC("2b7e151628aed2a6abf7158809cf4f3c", "73bed6b8e3c1743b7116e69e22229516", true, \
+ "f69f2445df4f9b17ad2b417be66c3710", "3ff1caa1681fac09120eca307586e1a78cb82807230e1321d3fae00d18cc2012");
+
+ // NIST AES CBC 256-bit encryption test-vectors
+ TestAES256CBC("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", \
+ "000102030405060708090A0B0C0D0E0F", false, "6bc1bee22e409f96e93d7e117393172a", \
+ "f58c4c04d6e5f1ba779eabfb5f7bfbd6");
+ TestAES256CBC("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", \
+ "F58C4C04D6E5F1BA779EABFB5F7BFBD6", false, "ae2d8a571e03ac9c9eb76fac45af8e51", \
+ "9cfc4e967edb808d679f777bc6702c7d");
+ TestAES256CBC("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", \
+ "9CFC4E967EDB808D679F777BC6702C7D", false, "30c81c46a35ce411e5fbc1191a0a52ef",
+ "39f23369a9d9bacfa530e26304231461");
+ TestAES256CBC("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", \
+ "39F23369A9D9BACFA530E26304231461", false, "f69f2445df4f9b17ad2b417be66c3710", \
+ "b2eb05e2c39be9fcda6c19078c6a9d1b");
+
+ // The same vectors with padding enabled
+ TestAES256CBC("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", \
+ "000102030405060708090A0B0C0D0E0F", true, "6bc1bee22e409f96e93d7e117393172a", \
+ "f58c4c04d6e5f1ba779eabfb5f7bfbd6485a5c81519cf378fa36d42b8547edc0");
+ TestAES256CBC("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", \
+ "F58C4C04D6E5F1BA779EABFB5F7BFBD6", true, "ae2d8a571e03ac9c9eb76fac45af8e51", \
+ "9cfc4e967edb808d679f777bc6702c7d3a3aa5e0213db1a9901f9036cf5102d2");
+ TestAES256CBC("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", \
+ "9CFC4E967EDB808D679F777BC6702C7D", true, "30c81c46a35ce411e5fbc1191a0a52ef",
+ "39f23369a9d9bacfa530e263042314612f8da707643c90a6f732b3de1d3f5cee");
+ TestAES256CBC("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", \
+ "39F23369A9D9BACFA530E26304231461", true, "f69f2445df4f9b17ad2b417be66c3710", \
+ "b2eb05e2c39be9fcda6c19078c6a9d1b3f461796d6b0d6b2e0c2a72b4d80e644");
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/data/alertTests.raw b/src/test/data/alertTests.raw
deleted file mode 100644
index 01f50680b9..0000000000
--- a/src/test/data/alertTests.raw
+++ /dev/null
Binary files differ
diff --git a/src/test/data/bitcoin-util-test.json b/src/test/data/bitcoin-util-test.json
index 3bf80ca434..de95044597 100644
--- a/src/test/data/bitcoin-util-test.json
+++ b/src/test/data/bitcoin-util-test.json
@@ -1,37 +1,73 @@
[
- { "exec": "././bitcoin-tx",
+ { "exec": "./bitcoin-tx",
"args": ["-create"],
- "output_cmp": "blanktx.hex"
+ "output_cmp": "blanktx.hex",
+ "description": "Creates a blank transaction"
+ },
+ { "exec": "./bitcoin-tx",
+ "args": ["-json","-create"],
+ "output_cmp": "blanktx.json",
+ "description": "Creates a blank transaction (output in json)"
},
{ "exec": "./bitcoin-tx",
"args": ["-"],
"input": "blanktx.hex",
- "output_cmp": "blanktx.hex"
+ "output_cmp": "blanktx.hex",
+ "description": "Creates a blank transaction when nothing is piped into bitcoin-tx"
+ },
+ { "exec": "./bitcoin-tx",
+ "args": ["-json","-"],
+ "input": "blanktx.hex",
+ "output_cmp": "blanktx.json",
+ "description": "Creates a blank transaction when nothing is piped into bitcoin-tx (output in json)"
},
{ "exec": "./bitcoin-tx",
"args": ["-", "delin=1"],
"input": "tx394b54bb.hex",
- "output_cmp": "tt-delin1-out.hex"
+ "output_cmp": "tt-delin1-out.hex",
+ "description": "Deletes a single input from a transaction"
+ },
+ { "exec": "./bitcoin-tx",
+ "args": ["-json", "-", "delin=1"],
+ "input": "tx394b54bb.hex",
+ "output_cmp": "tt-delin1-out.json",
+ "description": "Deletes a single input from a transaction (output in json)"
},
{ "exec": "./bitcoin-tx",
"args": ["-", "delin=31"],
"input": "tx394b54bb.hex",
- "return_code": 1
+ "return_code": 1,
+ "description": "Attempts to delete an input with a bad index from a transaction. Expected to fail."
},
{ "exec": "./bitcoin-tx",
"args": ["-", "delout=1"],
"input": "tx394b54bb.hex",
- "output_cmp": "tt-delout1-out.hex"
+ "output_cmp": "tt-delout1-out.hex",
+ "description": "Deletes a single output from a transaction"
+ },
+ { "exec": "./bitcoin-tx",
+ "args": ["-json", "-", "delout=1"],
+ "input": "tx394b54bb.hex",
+ "output_cmp": "tt-delout1-out.json",
+ "description": "Deletes a single output from a transaction (output in json)"
},
{ "exec": "./bitcoin-tx",
"args": ["-", "delout=2"],
"input": "tx394b54bb.hex",
- "return_code": 1
+ "return_code": 1,
+ "description": "Attempts to delete an output with a bad index from a transaction. Expected to fail."
},
{ "exec": "./bitcoin-tx",
"args": ["-", "locktime=317000"],
"input": "tx394b54bb.hex",
- "output_cmp": "tt-locktime317000-out.hex"
+ "output_cmp": "tt-locktime317000-out.hex",
+ "description": "Adds an nlocktime to a transaction"
+ },
+ { "exec": "./bitcoin-tx",
+ "args": ["-json", "-", "locktime=317000"],
+ "input": "tx394b54bb.hex",
+ "output_cmp": "tt-locktime317000-out.json",
+ "description": "Adds an nlocktime to a transaction (output in json)"
},
{ "exec": "./bitcoin-tx",
"args":
@@ -41,11 +77,30 @@
"in=22a6f904655d53ae2ff70e701a0bbd90aa3975c0f40bfc6cc996a9049e31cdfc:1",
"outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
"outaddr=4:1P8yWvZW8jVihP1bzHeqfE4aoXNX8AVa46"],
- "output_cmp": "txcreate1.hex"
+ "output_cmp": "txcreate1.hex",
+ "description": "Creates a new transaction with three inputs and two outputs"
+ },
+ { "exec": "./bitcoin-tx",
+ "args":
+ ["-json",
+ "-create",
+ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0",
+ "in=bf829c6bcf84579331337659d31f89dfd138f7f7785802d5501c92333145ca7c:18",
+ "in=22a6f904655d53ae2ff70e701a0bbd90aa3975c0f40bfc6cc996a9049e31cdfc:1",
+ "outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
+ "outaddr=4:1P8yWvZW8jVihP1bzHeqfE4aoXNX8AVa46"],
+ "output_cmp": "txcreate1.json",
+ "description": "Creates a new transaction with three inputs and two outputs (output in json)"
},
{ "exec": "./bitcoin-tx",
"args": ["-create", "outscript=0:"],
- "output_cmp": "txcreate2.hex"
+ "output_cmp": "txcreate2.hex",
+ "description": "Creates a new transaction with a single empty output script"
+ },
+ { "exec": "./bitcoin-tx",
+ "args": ["-json", "-create", "outscript=0:"],
+ "output_cmp": "txcreate2.json",
+ "description": "Creates a new transaction with a single empty output script (output in json)"
},
{ "exec": "./bitcoin-tx",
"args":
@@ -55,21 +110,36 @@
"set=prevtxs:[{\"txid\":\"4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485\",\"vout\":0,\"scriptPubKey\":\"76a91491b24bf9f5288532960ac687abb035127b1d28a588ac\"}]",
"sign=ALL",
"outaddr=0.001:193P6LtvS4nCnkDvM9uXn1gsSRqh4aDAz7"],
- "output_cmp": "txcreatesign.hex"
+ "output_cmp": "txcreatesign.hex",
+ "description": "Creates a new transaction with a single input and a single output, and then signs the transaction"
+ },
+ { "exec": "./bitcoin-tx",
+ "args":
+ ["-json",
+ "-create",
+ "in=4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485:0",
+ "set=privatekeys:[\"5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf\"]",
+ "set=prevtxs:[{\"txid\":\"4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485\",\"vout\":0,\"scriptPubKey\":\"76a91491b24bf9f5288532960ac687abb035127b1d28a588ac\"}]",
+ "sign=ALL",
+ "outaddr=0.001:193P6LtvS4nCnkDvM9uXn1gsSRqh4aDAz7"],
+ "output_cmp": "txcreatesign.json",
+ "description": "Creates a new transaction with a single input and a single output, and then signs the transaction (output in json)"
},
{ "exec": "./bitcoin-tx",
"args":
["-create",
"in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0",
"outdata=4:badhexdata"],
- "return_code": 1
+ "return_code": 1,
+ "description": "Attempts to create a new transaction with one input and an output with malformed hex data. Expected to fail"
},
{ "exec": "./bitcoin-tx",
"args":
["-create",
"in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0",
"outdata=badhexdata"],
- "return_code": 1
+ "return_code": 1,
+ "description": "Attempts to create a new transaction with one input and an output with no value and malformed hex data. Expected to fail"
},
{ "exec": "./bitcoin-tx",
"args":
@@ -77,7 +147,18 @@
"in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0",
"outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
"outdata=4:54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e"],
- "output_cmp": "txcreatedata1.hex"
+ "output_cmp": "txcreatedata1.hex",
+ "description": "Creates a new transaction with one input, one address output and one data output"
+ },
+ { "exec": "./bitcoin-tx",
+ "args":
+ ["-json",
+ "-create",
+ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0",
+ "outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
+ "outdata=4:54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e"],
+ "output_cmp": "txcreatedata1.json",
+ "description": "Creates a new transaction with one input, one address output and one data output (output in json)"
},
{ "exec": "./bitcoin-tx",
"args":
@@ -85,6 +166,49 @@
"in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0",
"outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
"outdata=54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e"],
- "output_cmp": "txcreatedata2.hex"
+ "output_cmp": "txcreatedata2.hex",
+ "description": "Creates a new transaction with one input, one address output and one data (zero value) output"
+ },
+ { "exec": "./bitcoin-tx",
+ "args":
+ ["-json",
+ "-create",
+ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0",
+ "outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
+ "outdata=54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e"],
+ "output_cmp": "txcreatedata2.json",
+ "description": "Creates a new transaction with one input, one address output and one data (zero value) output (output in json)"
+ },
+ { "exec": "./bitcoin-tx",
+ "args":
+ ["-create",
+ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0:4294967293",
+ "outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"],
+ "output_cmp": "txcreatedata_seq0.hex",
+ "description": "Creates a new transaction with one input with sequence number and one address output"
+ },
+ { "exec": "./bitcoin-tx",
+ "args":
+ ["-json",
+ "-create",
+ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0:4294967293",
+ "outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"],
+ "output_cmp": "txcreatedata_seq0.json",
+ "description": "Creates a new transaction with one input with sequence number and one address output (output in json)"
+ },
+ { "exec": "./bitcoin-tx",
+ "args":
+ ["01000000011f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000fdffffff0180a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac00000000",
+ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0:1"],
+ "output_cmp": "txcreatedata_seq1.hex",
+ "description": "Adds a new input with sequence number to a transaction"
+ },
+ { "exec": "./bitcoin-tx",
+ "args":
+ ["-json",
+ "01000000011f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000fdffffff0180a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac00000000",
+ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0:1"],
+ "output_cmp": "txcreatedata_seq1.json",
+ "description": "Adds a new input with sequence number to a transaction (output in json)"
}
]
diff --git a/src/test/data/blanktx.json b/src/test/data/blanktx.json
new file mode 100644
index 0000000000..51c25a5a98
--- /dev/null
+++ b/src/test/data/blanktx.json
@@ -0,0 +1,11 @@
+{
+ "txid": "d21633ba23f70118185227be58a63527675641ad37967e2aa461559f577aec43",
+ "hash": "d21633ba23f70118185227be58a63527675641ad37967e2aa461559f577aec43",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ ],
+ "vout": [
+ ],
+ "hex": "01000000000000000000"
+}
diff --git a/src/test/data/script_invalid.json b/src/test/data/script_invalid.json
deleted file mode 100644
index 7afa2abf49..0000000000
--- a/src/test/data/script_invalid.json
+++ /dev/null
@@ -1,814 +0,0 @@
-[
-["Format is: [scriptSig, scriptPubKey, flags, ... comments]"],
-["It is evaluated as if there was a crediting coinbase transaction with two 0"],
-["pushes as scriptSig, and one output of 0 satoshi and given scriptPubKey,"],
-["followed by a spending transaction which spends this output as only input (and"],
-["correct prevout hash), using the given scriptSig. All nLockTimes are 0, all"],
-["nSequences are max."],
-
-["", "DEPTH", "P2SH,STRICTENC", "Test the test: we should have an empty stack after scriptSig evaluation"],
-[" ", "DEPTH", "P2SH,STRICTENC", "and multiple spaces should not change that."],
-[" ", "DEPTH", "P2SH,STRICTENC"],
-[" ", "DEPTH", "P2SH,STRICTENC"],
-
-["", "", "P2SH,STRICTENC"],
-["", "NOP", "P2SH,STRICTENC"],
-["", "NOP DEPTH", "P2SH,STRICTENC"],
-["NOP", "", "P2SH,STRICTENC"],
-["NOP", "DEPTH", "P2SH,STRICTENC"],
-["NOP","NOP", "P2SH,STRICTENC"],
-["NOP","NOP DEPTH", "P2SH,STRICTENC"],
-
-["DEPTH", "", "P2SH,STRICTENC"],
-
-["0x4c01","0x01 NOP", "P2SH,STRICTENC", "PUSHDATA1 with not enough bytes"],
-["0x4d0200ff","0x01 NOP", "P2SH,STRICTENC", "PUSHDATA2 with not enough bytes"],
-["0x4e03000000ffff","0x01 NOP", "P2SH,STRICTENC", "PUSHDATA4 with not enough bytes"],
-
-["1", "IF 0x50 ENDIF 1", "P2SH,STRICTENC", "0x50 is reserved"],
-["0x52", "0x5f ADD 0x60 EQUAL", "P2SH,STRICTENC", "0x51 through 0x60 push 1 through 16 onto stack"],
-["0","NOP", "P2SH,STRICTENC"],
-["1", "IF VER ELSE 1 ENDIF", "P2SH,STRICTENC", "VER non-functional"],
-["0", "IF VERIF ELSE 1 ENDIF", "P2SH,STRICTENC", "VERIF illegal everywhere"],
-["0", "IF ELSE 1 ELSE VERIF ENDIF", "P2SH,STRICTENC", "VERIF illegal everywhere"],
-["0", "IF VERNOTIF ELSE 1 ENDIF", "P2SH,STRICTENC", "VERNOTIF illegal everywhere"],
-["0", "IF ELSE 1 ELSE VERNOTIF ENDIF", "P2SH,STRICTENC", "VERNOTIF illegal everywhere"],
-
-["1 IF", "1 ENDIF", "P2SH,STRICTENC", "IF/ENDIF can't span scriptSig/scriptPubKey"],
-["1 IF 0 ENDIF", "1 ENDIF", "P2SH,STRICTENC"],
-["1 ELSE 0 ENDIF", "1", "P2SH,STRICTENC"],
-["0 NOTIF", "123", "P2SH,STRICTENC"],
-
-["0", "DUP IF ENDIF", "P2SH,STRICTENC"],
-["0", "IF 1 ENDIF", "P2SH,STRICTENC"],
-["0", "DUP IF ELSE ENDIF", "P2SH,STRICTENC"],
-["0", "IF 1 ELSE ENDIF", "P2SH,STRICTENC"],
-["0", "NOTIF ELSE 1 ENDIF", "P2SH,STRICTENC"],
-
-["0 1", "IF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC"],
-["0 0", "IF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC"],
-["1 0", "IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC"],
-["0 1", "IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC"],
-
-["0 0", "NOTIF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC"],
-["0 1", "NOTIF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC"],
-["1 1", "NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC"],
-["0 0", "NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC"],
-
-["1", "IF RETURN ELSE ELSE 1 ENDIF", "P2SH,STRICTENC", "Multiple ELSEs"],
-["1", "IF 1 ELSE ELSE RETURN ENDIF", "P2SH,STRICTENC"],
-
-["1", "ENDIF", "P2SH,STRICTENC", "Malformed IF/ELSE/ENDIF sequence"],
-["1", "ELSE ENDIF", "P2SH,STRICTENC"],
-["1", "ENDIF ELSE", "P2SH,STRICTENC"],
-["1", "ENDIF ELSE IF", "P2SH,STRICTENC"],
-["1", "IF ELSE ENDIF ELSE", "P2SH,STRICTENC"],
-["1", "IF ELSE ENDIF ELSE ENDIF", "P2SH,STRICTENC"],
-["1", "IF ENDIF ENDIF", "P2SH,STRICTENC"],
-["1", "IF ELSE ELSE ENDIF ENDIF", "P2SH,STRICTENC"],
-
-["1", "RETURN", "P2SH,STRICTENC"],
-["1", "DUP IF RETURN ENDIF", "P2SH,STRICTENC"],
-
-["1", "RETURN 'data'", "P2SH,STRICTENC", "canonical prunable txout format"],
-["0 IF", "RETURN ENDIF 1", "P2SH,STRICTENC", "still prunable because IF/ENDIF can't span scriptSig/scriptPubKey"],
-
-["0", "VERIFY 1", "P2SH,STRICTENC"],
-["1", "VERIFY", "P2SH,STRICTENC"],
-["1", "VERIFY 0", "P2SH,STRICTENC"],
-
-["1 TOALTSTACK", "FROMALTSTACK 1", "P2SH,STRICTENC", "alt stack not shared between sig/pubkey"],
-
-["IFDUP", "DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["DROP", "DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["DUP", "DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["1", "DUP 1 ADD 2 EQUALVERIFY 0 EQUAL", "P2SH,STRICTENC"],
-["NOP", "NIP", "P2SH,STRICTENC"],
-["NOP", "1 NIP", "P2SH,STRICTENC"],
-["NOP", "1 0 NIP", "P2SH,STRICTENC"],
-["NOP", "OVER 1", "P2SH,STRICTENC"],
-["1", "OVER", "P2SH,STRICTENC"],
-["0 1", "OVER DEPTH 3 EQUALVERIFY", "P2SH,STRICTENC"],
-["19 20 21", "PICK 19 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC"],
-["NOP", "0 PICK", "P2SH,STRICTENC"],
-["1", "-1 PICK", "P2SH,STRICTENC"],
-["19 20 21", "0 PICK 20 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC"],
-["19 20 21", "1 PICK 21 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC"],
-["19 20 21", "2 PICK 22 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC"],
-["NOP", "0 ROLL", "P2SH,STRICTENC"],
-["1", "-1 ROLL", "P2SH,STRICTENC"],
-["19 20 21", "0 ROLL 20 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC"],
-["19 20 21", "1 ROLL 21 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC"],
-["19 20 21", "2 ROLL 22 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC"],
-["NOP", "ROT 1", "P2SH,STRICTENC"],
-["NOP", "1 ROT 1", "P2SH,STRICTENC"],
-["NOP", "1 2 ROT 1", "P2SH,STRICTENC"],
-["NOP", "0 1 2 ROT", "P2SH,STRICTENC"],
-["NOP", "SWAP 1", "P2SH,STRICTENC"],
-["1", "SWAP 1", "P2SH,STRICTENC"],
-["0 1", "SWAP 1 EQUALVERIFY", "P2SH,STRICTENC"],
-["NOP", "TUCK 1", "P2SH,STRICTENC"],
-["1", "TUCK 1", "P2SH,STRICTENC"],
-["1 0", "TUCK DEPTH 3 EQUALVERIFY SWAP 2DROP", "P2SH,STRICTENC"],
-["NOP", "2DUP 1", "P2SH,STRICTENC"],
-["1", "2DUP 1", "P2SH,STRICTENC"],
-["NOP", "3DUP 1", "P2SH,STRICTENC"],
-["1", "3DUP 1", "P2SH,STRICTENC"],
-["1 2", "3DUP 1", "P2SH,STRICTENC"],
-["NOP", "2OVER 1", "P2SH,STRICTENC"],
-["1", "2 3 2OVER 1", "P2SH,STRICTENC"],
-["NOP", "2SWAP 1", "P2SH,STRICTENC"],
-["1", "2 3 2SWAP 1", "P2SH,STRICTENC"],
-
-["'a' 'b'", "CAT", "P2SH,STRICTENC", "CAT disabled"],
-["'a' 'b' 0", "IF CAT ELSE 1 ENDIF", "P2SH,STRICTENC", "CAT disabled"],
-["'abc' 1 1", "SUBSTR", "P2SH,STRICTENC", "SUBSTR disabled"],
-["'abc' 1 1 0", "IF SUBSTR ELSE 1 ENDIF", "P2SH,STRICTENC", "SUBSTR disabled"],
-["'abc' 2 0", "IF LEFT ELSE 1 ENDIF", "P2SH,STRICTENC", "LEFT disabled"],
-["'abc' 2 0", "IF RIGHT ELSE 1 ENDIF", "P2SH,STRICTENC", "RIGHT disabled"],
-
-["NOP", "SIZE 1", "P2SH,STRICTENC"],
-
-["'abc'", "IF INVERT ELSE 1 ENDIF", "P2SH,STRICTENC", "INVERT disabled"],
-["1 2 0 IF AND ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "AND disabled"],
-["1 2 0 IF OR ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "OR disabled"],
-["1 2 0 IF XOR ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "XOR disabled"],
-["2 0 IF 2MUL ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "2MUL disabled"],
-["2 0 IF 2DIV ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "2DIV disabled"],
-["2 2 0 IF MUL ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "MUL disabled"],
-["2 2 0 IF DIV ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DIV disabled"],
-["2 2 0 IF MOD ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "MOD disabled"],
-["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"],
-
-["2147483648 0 ADD", "NOP", "P2SH,STRICTENC", "arithmetic operands must be in range [-2^31...2^31] "],
-["-2147483648 0 ADD", "NOP", "P2SH,STRICTENC", "arithmetic operands must be in range [-2^31...2^31] "],
-["2147483647 DUP ADD", "4294967294 NUMEQUAL", "P2SH,STRICTENC", "NUMEQUAL must be in numeric range"],
-["'abcdef' NOT", "0 EQUAL", "P2SH,STRICTENC", "NOT is an arithmetic operand"],
-
-["2 DUP MUL", "4 EQUAL", "P2SH,STRICTENC", "disabled"],
-["2 DUP DIV", "1 EQUAL", "P2SH,STRICTENC", "disabled"],
-["2 2MUL", "4 EQUAL", "P2SH,STRICTENC", "disabled"],
-["2 2DIV", "1 EQUAL", "P2SH,STRICTENC", "disabled"],
-["7 3 MOD", "1 EQUAL", "P2SH,STRICTENC", "disabled"],
-["2 2 LSHIFT", "8 EQUAL", "P2SH,STRICTENC", "disabled"],
-["2 1 RSHIFT", "1 EQUAL", "P2SH,STRICTENC", "disabled"],
-
-["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 2 EQUAL", "P2SH,STRICTENC"],
-["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_11' EQUAL", "P2SH,STRICTENC"],
-
-["Ensure 100% coverage of discouraged NOPS"],
-["1", "NOP1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP2", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP3", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP4", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP5", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP6", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP7", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP8", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP9", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-["1", "NOP10", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
-
-["NOP10", "1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in scriptSig"],
-
-["1 0x01 0xb9", "HASH160 0x14 0x15727299b05b45fdaf9ac9ecf7565cfe27c3e567 EQUAL",
- "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"],
-
-["0x50","1", "P2SH,STRICTENC", "opcode 0x50 is reserved"],
-["1", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
-["1", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xbd ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xbe ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xbf ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc1 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc2 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc3 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc4 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc5 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc6 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc7 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc8 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xc9 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xca ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xcb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xcc ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xcd ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xce ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xcf ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd1 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd2 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd3 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd4 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd5 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd6 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd7 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd8 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xd9 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xda ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xdb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xdc ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xdd ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xde ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xdf ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe1 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe2 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe3 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe4 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe5 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe6 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe7 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe8 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xe9 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xea ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xeb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xec ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xed ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xee ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xef ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf1 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf2 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf3 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf4 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf5 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf6 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf7 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf8 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xf9 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xfa ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xfb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xfc ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xfd ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xfe ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 0xff ELSE 1 ENDIF", "P2SH,STRICTENC"],
-
-["1 IF 1 ELSE", "0xff ENDIF", "P2SH,STRICTENC", "invalid because scriptSig and scriptPubKey are processed separately"],
-
-["NOP", "RIPEMD160", "P2SH,STRICTENC"],
-["NOP", "SHA1", "P2SH,STRICTENC"],
-["NOP", "SHA256", "P2SH,STRICTENC"],
-["NOP", "HASH160", "P2SH,STRICTENC"],
-["NOP", "HASH256", "P2SH,STRICTENC"],
-
-["NOP",
-"'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'",
-"P2SH,STRICTENC",
-">520 byte push"],
-["0",
-"IF 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' ENDIF 1",
-"P2SH,STRICTENC",
-">520 byte push in non-executed IF branch"],
-["1",
-"0x61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
-"P2SH,STRICTENC",
-">201 opcodes executed. 0x61 is NOP"],
-["0",
-"IF 0x6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161 ENDIF 1",
-"P2SH,STRICTENC",
-">201 opcodes including non-executed IF branch. 0x61 is NOP"],
-["1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"1 2 3 4 5 6 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"P2SH,STRICTENC",
-">1,000 stack size (0x6f is 3DUP)"],
-["1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"1 TOALTSTACK 2 TOALTSTACK 3 4 5 6 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"P2SH,STRICTENC",
-">1,000 stack+altstack size"],
-["NOP",
-"0 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f 2DUP 0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
-"P2SH,STRICTENC",
-"10,001-byte scriptPubKey"],
-
-["NOP1","NOP10", "P2SH,STRICTENC"],
-
-["1","VER", "P2SH,STRICTENC", "OP_VER is reserved"],
-["1","VERIF", "P2SH,STRICTENC", "OP_VERIF is reserved"],
-["1","VERNOTIF", "P2SH,STRICTENC", "OP_VERNOTIF is reserved"],
-["1","RESERVED", "P2SH,STRICTENC", "OP_RESERVED is reserved"],
-["1","RESERVED1", "P2SH,STRICTENC", "OP_RESERVED1 is reserved"],
-["1","RESERVED2", "P2SH,STRICTENC", "OP_RESERVED2 is reserved"],
-["1","0xba", "P2SH,STRICTENC", "0xba == OP_NOP10 + 1"],
-
-["2147483648", "1ADD 1", "P2SH,STRICTENC", "We cannot do math on 5-byte integers"],
-["2147483648", "NEGATE 1", "P2SH,STRICTENC", "We cannot do math on 5-byte integers"],
-["-2147483648", "1ADD 1", "P2SH,STRICTENC", "Because we use a sign bit, -2147483648 is also 5 bytes"],
-["2147483647", "1ADD 1SUB 1", "P2SH,STRICTENC", "We cannot do math on 5-byte integers, even if the result is 4-bytes"],
-["2147483648", "1SUB 1", "P2SH,STRICTENC", "We cannot do math on 5-byte integers, even if the result is 4-bytes"],
-
-["2147483648 1", "BOOLOR 1", "P2SH,STRICTENC", "We cannot do BOOLOR on 5-byte integers (but we can still do IF etc)"],
-["2147483648 1", "BOOLAND 1", "P2SH,STRICTENC", "We cannot do BOOLAND on 5-byte integers"],
-
-["1", "1 ENDIF", "P2SH,STRICTENC", "ENDIF without IF"],
-["1", "IF 1", "P2SH,STRICTENC", "IF without ENDIF"],
-["1 IF 1", "ENDIF", "P2SH,STRICTENC", "IFs don't carry over"],
-
-["NOP", "IF 1 ENDIF", "P2SH,STRICTENC", "The following tests check the if(stack.size() < N) tests in each opcode"],
-["NOP", "NOTIF 1 ENDIF", "P2SH,STRICTENC", "They are here to catch copy-and-paste errors"],
-["NOP", "VERIFY 1", "P2SH,STRICTENC", "Most of them are duplicated elsewhere,"],
-
-["NOP", "TOALTSTACK 1", "P2SH,STRICTENC", "but, hey, more is always better, right?"],
-["1", "FROMALTSTACK", "P2SH,STRICTENC"],
-["1", "2DROP 1", "P2SH,STRICTENC"],
-["1", "2DUP", "P2SH,STRICTENC"],
-["1 1", "3DUP", "P2SH,STRICTENC"],
-["1 1 1", "2OVER", "P2SH,STRICTENC"],
-["1 1 1 1 1", "2ROT", "P2SH,STRICTENC"],
-["1 1 1", "2SWAP", "P2SH,STRICTENC"],
-["NOP", "IFDUP 1", "P2SH,STRICTENC"],
-["NOP", "DROP 1", "P2SH,STRICTENC"],
-["NOP", "DUP 1", "P2SH,STRICTENC"],
-["1", "NIP", "P2SH,STRICTENC"],
-["1", "OVER", "P2SH,STRICTENC"],
-["1 1 1 3", "PICK", "P2SH,STRICTENC"],
-["0", "PICK 1", "P2SH,STRICTENC"],
-["1 1 1 3", "ROLL", "P2SH,STRICTENC"],
-["0", "ROLL 1", "P2SH,STRICTENC"],
-["1 1", "ROT", "P2SH,STRICTENC"],
-["1", "SWAP", "P2SH,STRICTENC"],
-["1", "TUCK", "P2SH,STRICTENC"],
-
-["NOP", "SIZE 1", "P2SH,STRICTENC"],
-
-["1", "EQUAL 1", "P2SH,STRICTENC"],
-["1", "EQUALVERIFY 1", "P2SH,STRICTENC"],
-
-["NOP", "1ADD 1", "P2SH,STRICTENC"],
-["NOP", "1SUB 1", "P2SH,STRICTENC"],
-["NOP", "NEGATE 1", "P2SH,STRICTENC"],
-["NOP", "ABS 1", "P2SH,STRICTENC"],
-["NOP", "NOT 1", "P2SH,STRICTENC"],
-["NOP", "0NOTEQUAL 1", "P2SH,STRICTENC"],
-
-["1", "ADD", "P2SH,STRICTENC"],
-["1", "SUB", "P2SH,STRICTENC"],
-["1", "BOOLAND", "P2SH,STRICTENC"],
-["1", "BOOLOR", "P2SH,STRICTENC"],
-["1", "NUMEQUAL", "P2SH,STRICTENC"],
-["1", "NUMEQUALVERIFY 1", "P2SH,STRICTENC"],
-["1", "NUMNOTEQUAL", "P2SH,STRICTENC"],
-["1", "LESSTHAN", "P2SH,STRICTENC"],
-["1", "GREATERTHAN", "P2SH,STRICTENC"],
-["1", "LESSTHANOREQUAL", "P2SH,STRICTENC"],
-["1", "GREATERTHANOREQUAL", "P2SH,STRICTENC"],
-["1", "MIN", "P2SH,STRICTENC"],
-["1", "MAX", "P2SH,STRICTENC"],
-["1 1", "WITHIN", "P2SH,STRICTENC"],
-
-["NOP", "RIPEMD160 1", "P2SH,STRICTENC"],
-["NOP", "SHA1 1", "P2SH,STRICTENC"],
-["NOP", "SHA256 1", "P2SH,STRICTENC"],
-["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",
-"202 CHECKMULTISIGS, fails due to 201 op limit"],
-
-["1",
-"0 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY",
-"P2SH,STRICTENC"],
-
-["",
-"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG",
-"P2SH,STRICTENC",
-"Fails due to 201 sig op limit"],
-
-["1",
-"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY",
-"P2SH,STRICTENC"],
-
-
-["0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21", "21 CHECKMULTISIG 1", "P2SH,STRICTENC", "nPubKeys > 20"],
-["0 'sig' 1 0", "CHECKMULTISIG 1", "P2SH,STRICTENC", "nSigs > nPubKeys"],
-
-
-["NOP 0x01 1", "HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL", "P2SH,STRICTENC", "Tests for Script.IsPushOnly()"],
-["NOP1 0x01 1", "HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL", "P2SH,STRICTENC"],
-
-["0 0x01 0x50", "HASH160 0x14 0xece424a6bb6ddf4db592c0faed60685047a361b1 EQUAL", "P2SH,STRICTENC", "OP_RESERVED in P2SH should fail"],
-["0 0x01 VER", "HASH160 0x14 0x0f4d7845db968f2a81b530b6f3c1d6246d4c7e01 EQUAL", "P2SH,STRICTENC", "OP_VER in P2SH should fail"],
-
-["0x00", "'00' EQUAL", "P2SH,STRICTENC", "Basic OP_0 execution"],
-
-["MINIMALDATA enforcement for PUSHDATAs"],
-
-["0x4c 0x00", "DROP 1", "MINIMALDATA", "Empty vector minimally represented by OP_0"],
-["0x01 0x81", "DROP 1", "MINIMALDATA", "-1 minimally represented by OP_1NEGATE"],
-["0x01 0x01", "DROP 1", "MINIMALDATA", "1 to 16 minimally represented by OP_1 to OP_16"],
-["0x01 0x02", "DROP 1", "MINIMALDATA"],
-["0x01 0x03", "DROP 1", "MINIMALDATA"],
-["0x01 0x04", "DROP 1", "MINIMALDATA"],
-["0x01 0x05", "DROP 1", "MINIMALDATA"],
-["0x01 0x06", "DROP 1", "MINIMALDATA"],
-["0x01 0x07", "DROP 1", "MINIMALDATA"],
-["0x01 0x08", "DROP 1", "MINIMALDATA"],
-["0x01 0x09", "DROP 1", "MINIMALDATA"],
-["0x01 0x0a", "DROP 1", "MINIMALDATA"],
-["0x01 0x0b", "DROP 1", "MINIMALDATA"],
-["0x01 0x0c", "DROP 1", "MINIMALDATA"],
-["0x01 0x0d", "DROP 1", "MINIMALDATA"],
-["0x01 0x0e", "DROP 1", "MINIMALDATA"],
-["0x01 0x0f", "DROP 1", "MINIMALDATA"],
-["0x01 0x10", "DROP 1", "MINIMALDATA"],
-
-["0x4c 0x48 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
- "PUSHDATA1 of 72 bytes minimally represented by direct push"],
-
-["0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
- "PUSHDATA2 of 255 bytes minimally represented by PUSHDATA1"],
-
-["0x4e 0x00010000 0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
- "PUSHDATA4 of 256 bytes minimally represented by PUSHDATA2"],
-
-
-["MINIMALDATA enforcement for numeric arguments"],
-
-["0x01 0x00", "NOT DROP 1", "MINIMALDATA", "numequals 0"],
-["0x02 0x0000", "NOT DROP 1", "MINIMALDATA", "numequals 0"],
-["0x01 0x80", "NOT DROP 1", "MINIMALDATA", "0x80 (negative zero) numequals 0"],
-["0x02 0x0080", "NOT DROP 1", "MINIMALDATA", "numequals 0"],
-["0x02 0x0500", "NOT DROP 1", "MINIMALDATA", "numequals 5"],
-["0x03 0x050000", "NOT DROP 1", "MINIMALDATA", "numequals 5"],
-["0x02 0x0580", "NOT DROP 1", "MINIMALDATA", "numequals -5"],
-["0x03 0x050080", "NOT DROP 1", "MINIMALDATA", "numequals -5"],
-["0x03 0xff7f80", "NOT DROP 1", "MINIMALDATA", "Minimal encoding is 0xffff"],
-["0x03 0xff7f00", "NOT DROP 1", "MINIMALDATA", "Minimal encoding is 0xff7f"],
-["0x04 0xffff7f80", "NOT DROP 1", "MINIMALDATA", "Minimal encoding is 0xffffff"],
-["0x04 0xffff7f00", "NOT DROP 1", "MINIMALDATA", "Minimal encoding is 0xffff7f"],
-
-["Test every numeric-accepting opcode for correct handling of the numeric minimal encoding rule"],
-
-["1 0x02 0x0000", "PICK DROP", "MINIMALDATA"],
-["1 0x02 0x0000", "ROLL DROP 1", "MINIMALDATA"],
-["0x02 0x0000", "1ADD DROP 1", "MINIMALDATA"],
-["0x02 0x0000", "1SUB DROP 1", "MINIMALDATA"],
-["0x02 0x0000", "NEGATE DROP 1", "MINIMALDATA"],
-["0x02 0x0000", "ABS DROP 1", "MINIMALDATA"],
-["0x02 0x0000", "NOT DROP 1", "MINIMALDATA"],
-["0x02 0x0000", "0NOTEQUAL DROP 1", "MINIMALDATA"],
-
-["0 0x02 0x0000", "ADD DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "ADD DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "SUB DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "SUB DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "BOOLAND DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "BOOLAND DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "BOOLOR DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "BOOLOR DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "NUMEQUAL DROP 1", "MINIMALDATA"],
-["0x02 0x0000 1", "NUMEQUAL DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "NUMEQUALVERIFY 1", "MINIMALDATA"],
-["0x02 0x0000 0", "NUMEQUALVERIFY 1", "MINIMALDATA"],
-["0 0x02 0x0000", "NUMNOTEQUAL DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "NUMNOTEQUAL DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "LESSTHAN DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "LESSTHAN DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "GREATERTHAN DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "GREATERTHAN DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "LESSTHANOREQUAL DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "LESSTHANOREQUAL DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "GREATERTHANOREQUAL DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "GREATERTHANOREQUAL DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "MIN DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "MIN DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000", "MAX DROP 1", "MINIMALDATA"],
-["0x02 0x0000 0", "MAX DROP 1", "MINIMALDATA"],
-
-["0x02 0x0000 0 0", "WITHIN DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000 0", "WITHIN DROP 1", "MINIMALDATA"],
-["0 0 0x02 0x0000", "WITHIN DROP 1", "MINIMALDATA"],
-
-["0 0 0x02 0x0000", "CHECKMULTISIG DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000 0", "CHECKMULTISIG DROP 1", "MINIMALDATA"],
-["0 0x02 0x0000 0 1", "CHECKMULTISIG DROP 1", "MINIMALDATA"],
-["0 0 0x02 0x0000", "CHECKMULTISIGVERIFY 1", "MINIMALDATA"],
-["0 0x02 0x0000 0", "CHECKMULTISIGVERIFY 1", "MINIMALDATA"],
-
-
-["Order of CHECKMULTISIG evaluation tests, inverted by swapping the order of"],
-["pubkeys/signatures so they fail due to the STRICTENC rules on validly encoded"],
-["signatures and pubkeys."],
-[
- "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
- "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0 2 CHECKMULTISIG NOT",
- "STRICTENC",
- "2-of-2 CHECKMULTISIG NOT with the first pubkey invalid, and both signatures validly encoded."
-],
-[
- "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 1",
- "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
- "STRICTENC",
- "2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but first signature invalid."
-],
-
-["Increase DERSIG test coverage"],
-["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Overly long signature is incorrectly encoded for DERSIG"],
-["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Missing S is incorrectly encoded for DERSIG"],
-["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "S with invalid S length is incorrectly encoded for DERSIG"],
-["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer R is incorrectly encoded for DERSIG"],
-["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer S is incorrectly encoded for DERSIG"],
-["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Zero-length R is incorrectly encoded for DERSIG"],
-["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "DERSIG", "Zero-length S is incorrectly encoded for DERSIG"],
-["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Negative S is incorrectly encoded for DERSIG"],
-
-["Automatically generated test cases"],
-[
- "0x47 0x304402200a5c6163f07b8c3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
- "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
- "",
- "P2PK, bad sig"
-],
-[
- "0x47 0x3044022034bb0494b50b8ef130e2185bb220265b9284ef5b4b8a8da4d8415df489c83b5102206259a26d9cc0a125ac26af6153b17c02956855ebe1467412f066e402f5f05d1201 0x21 0x03363d90d446b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
- "DUP HASH160 0x14 0xc0834c0c158f53be706d234c38fd52de7eece656 EQUALVERIFY CHECKSIG",
- "",
- "P2PKH, bad pubkey"
-],
-[
- "0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790201",
- "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
- "",
- "P2PK anyonecanpay marked with normal hashtype"
-],
-[
- "0x47 0x3044022003fef42ed6c7be8917441218f525a60e2431be978e28b7aca4d7a532cc413ae8022067a1f82c74e8d69291b90d148778405c6257bbcfc2353cc38a3e1f22bf44254601 0x23 0x210279be667ef9dcbbac54a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
- "HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
- "P2SH",
- "P2SH(P2PK), bad redeemscript"
-],
-[
- "0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
- "HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
- "P2SH",
- "P2SH(P2PKH), bad sig"
-],
-[
- "0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0",
- "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
- "",
- "3-of-3, 2 sigs"
-],
-[
- "0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
- "HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
- "P2SH",
- "P2SH(2-of-3), 1 sig"
-],
-[
- "0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "DERSIG",
- "P2PK with too much R padding"
-],
-[
- "0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "DERSIG",
- "P2PK with too much S padding"
-],
-[
- "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "DERSIG",
- "P2PK with too little R padding"
-],
-[
- "0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
- "DERSIG",
- "P2PK NOT with bad sig with too much R padding"
-],
-[
- "0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
- "",
- "P2PK NOT with too much R padding but no DERSIG"
-],
-[
- "0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
- "DERSIG",
- "P2PK NOT with too much R padding"
-],
-[
- "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "DERSIG",
- "BIP66 example 1, with DERSIG"
-],
-[
- "0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
- "",
- "BIP66 example 2, without DERSIG"
-],
-[
- "0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
- "DERSIG",
- "BIP66 example 2, with DERSIG"
-],
-[
- "0",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "",
- "BIP66 example 3, without DERSIG"
-],
-[
- "0",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "DERSIG",
- "BIP66 example 3, with DERSIG"
-],
-[
- "1",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "",
- "BIP66 example 5, without DERSIG"
-],
-[
- "1",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "DERSIG",
- "BIP66 example 5, with DERSIG"
-],
-[
- "1",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
- "DERSIG",
- "BIP66 example 6, with DERSIG"
-],
-[
- "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
- "DERSIG",
- "BIP66 example 7, with DERSIG"
-],
-[
- "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
- "",
- "BIP66 example 8, without DERSIG"
-],
-[
- "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
- "DERSIG",
- "BIP66 example 8, with DERSIG"
-],
-[
- "0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
- "",
- "BIP66 example 9, without DERSIG"
-],
-[
- "0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
- "DERSIG",
- "BIP66 example 9, with DERSIG"
-],
-[
- "0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
- "DERSIG",
- "BIP66 example 10, with DERSIG"
-],
-[
- "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
- "",
- "BIP66 example 11, without DERSIG"
-],
-[
- "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
- "DERSIG",
- "BIP66 example 11, with DERSIG"
-],
-[
- "0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
- "DERSIG",
- "P2PK with multi-byte hashtype, with DERSIG"
-],
-[
- "0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
- "LOW_S",
- "P2PK with high S"
-],
-[
- "0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01",
- "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
- "STRICTENC",
- "P2PK with hybrid pubkey"
-],
-[
- "0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
- "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
- "",
- "P2PK NOT with hybrid pubkey but no STRICTENC"
-],
-[
- "0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
- "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
- "STRICTENC",
- "P2PK NOT with hybrid pubkey"
-],
-[
- "0x47 0x30440220035d554e3153c04950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
- "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
- "STRICTENC",
- "P2PK NOT with invalid hybrid pubkey"
-],
-[
- "0 0x47 0x3044022079c7824d6c868e0e1a273484e28c2654a27d043c8a27f49f52cb72efed0759090220452bbbf7089574fa082095a4fc1b3a16bafcf97a3a34d745fafc922cce66b27201",
- "1 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 2 CHECKMULTISIG",
- "STRICTENC",
- "1-of-2 with the first 1 hybrid pubkey"
-],
-[
- "0x47 0x304402206177d513ec2cda444c021a1f4f656fc4c72ba108ae063e157eb86dc3575784940220666fc66702815d0e5413bb9b1df22aed44f5f1efb8b99d41dd5dc9a5be6d205205",
- "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
- "STRICTENC",
- "P2PK with undefined hashtype"
-],
-[
- "0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05",
- "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
- "STRICTENC",
- "P2PK NOT with invalid sig and undefined hashtype"
-],
-[
- "1 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
- "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
- "NULLDUMMY",
- "3-of-3 with nonzero dummy"
-],
-[
- "1 0x47 0x304402201bb2edab700a5d020236df174fefed78087697143731f659bea59642c759c16d022061f42cdbae5bcd3e8790f20bf76687443436e94a634321c16a72aa54cbc7c2ea01 0x47 0x304402204bb4a64f2a6e5c7fb2f07fef85ee56fde5e6da234c6a984262307a20e99842d702206f8303aaba5e625d223897e2ffd3f88ef1bcffef55f38dc3768e5f2e94c923f901 0x47 0x3044022040c2809b71fffb155ec8b82fe7a27f666bd97f941207be4e14ade85a1249dd4d02204d56c85ec525dd18e29a0533d5ddf61b6b1bb32980c2f63edf951aebf7a27bfe01",
- "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT",
- "NULLDUMMY",
- "3-of-3 NOT with invalid sig with nonzero dummy"
-],
-[
- "0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 DUP",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
- "SIGPUSHONLY",
- "2-of-2 with two identical keys and sigs pushed using OP_DUP"
-],
-[
- "0x47 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb125101 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
- "",
- "P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY"
-],
-[
- "0x47 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb125101 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
- "SIGPUSHONLY",
- "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",
- "P2PK with unnecessary input"
-],
-[
- "11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
- "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
- "CLEANSTACK,P2SH",
- "P2SH with unnecessary input"
-],
-
-["The End"]
-]
diff --git a/src/test/data/script_tests.json b/src/test/data/script_tests.json
new file mode 100644
index 0000000000..5c054ed3e8
--- /dev/null
+++ b/src/test/data/script_tests.json
@@ -0,0 +1,2609 @@
+[
+["Format is: [[wit..., amount]?, scriptSig, scriptPubKey, flags, expected_scripterror, ... comments]"],
+["It is evaluated as if there was a crediting coinbase transaction with two 0"],
+["pushes as scriptSig, and one output of 0 satoshi and given scriptPubKey,"],
+["followed by a spending transaction which spends this output as only input (and"],
+["correct prevout hash), using the given scriptSig. All nLockTimes are 0, all"],
+["nSequences are max."],
+
+["", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK", "Test the test: we should have an empty stack after scriptSig evaluation"],
+[" ", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK", "and multiple spaces should not change that."],
+[" ", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+[" ", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["1 2", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC", "OK", "Similarly whitespace around and between symbols"],
+["1 2", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC", "OK"],
+[" 1 2", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC", "OK"],
+["1 2 ", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC", "OK"],
+[" 1 2 ", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["1", "", "P2SH,STRICTENC", "OK"],
+["0x02 0x01 0x00", "", "P2SH,STRICTENC", "OK", "all bytes are significant, not only the last one"],
+["0x09 0x00000000 0x00000000 0x10", "", "P2SH,STRICTENC", "OK", "equals zero when cast to Int64"],
+
+["0x01 0x0b", "11 EQUAL", "P2SH,STRICTENC", "OK", "push 1 byte"],
+["0x02 0x417a", "'Az' EQUAL", "P2SH,STRICTENC", "OK"],
+["0x4b 0x417a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a",
+ "'Azzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' EQUAL", "P2SH,STRICTENC", "OK", "push 75 bytes"],
+
+["0x4c 0x01 0x07","7 EQUAL", "P2SH,STRICTENC", "OK", "0x4c is OP_PUSHDATA1"],
+["0x4d 0x0100 0x08","8 EQUAL", "P2SH,STRICTENC", "OK", "0x4d is OP_PUSHDATA2"],
+["0x4e 0x01000000 0x09","9 EQUAL", "P2SH,STRICTENC", "OK", "0x4e is OP_PUSHDATA4"],
+
+["0x4c 0x00","0 EQUAL", "P2SH,STRICTENC", "OK"],
+["0x4d 0x0000","0 EQUAL", "P2SH,STRICTENC", "OK"],
+["0x4e 0x00000000","0 EQUAL", "P2SH,STRICTENC", "OK"],
+["0x4f 1000 ADD","999 EQUAL", "P2SH,STRICTENC", "OK"],
+["0", "IF 0x50 ENDIF 1", "P2SH,STRICTENC", "OK", "0x50 is reserved (ok if not executed)"],
+["0x51", "0x5f ADD 0x60 EQUAL", "P2SH,STRICTENC", "OK", "0x51 through 0x60 push 1 through 16 onto stack"],
+["1","NOP", "P2SH,STRICTENC", "OK"],
+["0", "IF VER ELSE 1 ENDIF", "P2SH,STRICTENC", "OK", "VER non-functional (ok if not executed)"],
+["0", "IF RESERVED RESERVED1 RESERVED2 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK", "RESERVED ok in un-executed IF"],
+
+["1", "DUP IF ENDIF", "P2SH,STRICTENC", "OK"],
+["1", "IF 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["1", "DUP IF ELSE ENDIF", "P2SH,STRICTENC", "OK"],
+["1", "IF 1 ELSE ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+
+["1 1", "IF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC", "OK"],
+["1 0", "IF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC", "OK"],
+["1 1", "IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC", "OK"],
+["0 0", "IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC", "OK"],
+
+["1 0", "NOTIF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC", "OK"],
+["1 1", "NOTIF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC", "OK"],
+["1 0", "NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC", "OK"],
+["0 1", "NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC", "OK"],
+
+["0", "IF 0 ELSE 1 ELSE 0 ENDIF", "P2SH,STRICTENC", "OK", "Multiple ELSE's are valid and executed inverts on each ELSE encountered"],
+["1", "IF 1 ELSE 0 ELSE ENDIF", "P2SH,STRICTENC", "OK"],
+["1", "IF ELSE 0 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["1", "IF 1 ELSE 0 ELSE 1 ENDIF ADD 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["'' 1", "IF SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ENDIF 0x14 0x68ca4fec736264c13b859bac43d5173df6871682 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["1", "NOTIF 0 ELSE 1 ELSE 0 ENDIF", "P2SH,STRICTENC", "OK", "Multiple ELSE's are valid and execution inverts on each ELSE encountered"],
+["0", "NOTIF 1 ELSE 0 ELSE ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "NOTIF ELSE 0 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "NOTIF 1 ELSE 0 ELSE 1 ENDIF ADD 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["'' 0", "NOTIF SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ENDIF 0x14 0x68ca4fec736264c13b859bac43d5173df6871682 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["0", "IF 1 IF RETURN ELSE RETURN ELSE RETURN ENDIF ELSE 1 IF 1 ELSE RETURN ELSE 1 ENDIF ELSE RETURN ENDIF ADD 2 EQUAL", "P2SH,STRICTENC", "OK", "Nested ELSE ELSE"],
+["1", "NOTIF 0 NOTIF RETURN ELSE RETURN ELSE RETURN ENDIF ELSE 0 NOTIF 1 ELSE RETURN ELSE 1 ENDIF ELSE RETURN ENDIF ADD 2 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["0", "IF RETURN ENDIF 1", "P2SH,STRICTENC", "OK", "RETURN only works if executed"],
+
+["1 1", "VERIFY", "P2SH,STRICTENC", "OK"],
+["1 0x05 0x01 0x00 0x00 0x00 0x00", "VERIFY", "P2SH,STRICTENC", "OK", "values >4 bytes can be cast to boolean"],
+["1 0x01 0x80", "IF 0 ENDIF", "P2SH,STRICTENC", "OK", "negative 0 is false"],
+
+["10 0 11 TOALTSTACK DROP FROMALTSTACK", "ADD 21 EQUAL", "P2SH,STRICTENC", "OK"],
+["'gavin_was_here' TOALTSTACK 11 FROMALTSTACK", "'gavin_was_here' EQUALVERIFY 11 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["0 IFDUP", "DEPTH 1 EQUALVERIFY 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["1 IFDUP", "DEPTH 2 EQUALVERIFY 1 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC", "OK"],
+["0x05 0x0100000000 IFDUP", "DEPTH 2 EQUALVERIFY 0x05 0x0100000000 EQUAL", "P2SH,STRICTENC", "OK", "IFDUP dups non ints"],
+["0 DROP", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["0", "DUP 1 ADD 1 EQUALVERIFY 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["0 1", "NIP", "P2SH,STRICTENC", "OK"],
+["1 0", "OVER DEPTH 3 EQUALVERIFY", "P2SH,STRICTENC", "OK"],
+["22 21 20", "0 PICK 20 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "1 PICK 21 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "2 PICK 22 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "0 ROLL 20 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "1 ROLL 21 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "2 ROLL 22 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "ROT 22 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "ROT DROP 20 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "ROT DROP DROP 21 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "ROT ROT 21 EQUAL", "P2SH,STRICTENC", "OK"],
+["22 21 20", "ROT ROT ROT 20 EQUAL", "P2SH,STRICTENC", "OK"],
+["25 24 23 22 21 20", "2ROT 24 EQUAL", "P2SH,STRICTENC", "OK"],
+["25 24 23 22 21 20", "2ROT DROP 25 EQUAL", "P2SH,STRICTENC", "OK"],
+["25 24 23 22 21 20", "2ROT 2DROP 20 EQUAL", "P2SH,STRICTENC", "OK"],
+["25 24 23 22 21 20", "2ROT 2DROP DROP 21 EQUAL", "P2SH,STRICTENC", "OK"],
+["25 24 23 22 21 20", "2ROT 2DROP 2DROP 22 EQUAL", "P2SH,STRICTENC", "OK"],
+["25 24 23 22 21 20", "2ROT 2DROP 2DROP DROP 23 EQUAL", "P2SH,STRICTENC", "OK"],
+["25 24 23 22 21 20", "2ROT 2ROT 22 EQUAL", "P2SH,STRICTENC", "OK"],
+["25 24 23 22 21 20", "2ROT 2ROT 2ROT 20 EQUAL", "P2SH,STRICTENC", "OK"],
+["1 0", "SWAP 1 EQUALVERIFY 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["0 1", "TUCK DEPTH 3 EQUALVERIFY SWAP 2DROP", "P2SH,STRICTENC", "OK"],
+["13 14", "2DUP ROT EQUALVERIFY EQUAL", "P2SH,STRICTENC", "OK"],
+["-1 0 1 2", "3DUP DEPTH 7 EQUALVERIFY ADD ADD 3 EQUALVERIFY 2DROP 0 EQUALVERIFY", "P2SH,STRICTENC", "OK"],
+["1 2 3 5", "2OVER ADD ADD 8 EQUALVERIFY ADD ADD 6 EQUAL", "P2SH,STRICTENC", "OK"],
+["1 3 5 7", "2SWAP ADD 4 EQUALVERIFY ADD 12 EQUAL", "P2SH,STRICTENC", "OK"],
+["0", "SIZE 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["1", "SIZE 1 EQUAL", "P2SH,STRICTENC", "OK"],
+["127", "SIZE 1 EQUAL", "P2SH,STRICTENC", "OK"],
+["128", "SIZE 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["32767", "SIZE 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["32768", "SIZE 3 EQUAL", "P2SH,STRICTENC", "OK"],
+["8388607", "SIZE 3 EQUAL", "P2SH,STRICTENC", "OK"],
+["8388608", "SIZE 4 EQUAL", "P2SH,STRICTENC", "OK"],
+["2147483647", "SIZE 4 EQUAL", "P2SH,STRICTENC", "OK"],
+["2147483648", "SIZE 5 EQUAL", "P2SH,STRICTENC", "OK"],
+["549755813887", "SIZE 5 EQUAL", "P2SH,STRICTENC", "OK"],
+["549755813888", "SIZE 6 EQUAL", "P2SH,STRICTENC", "OK"],
+["9223372036854775807", "SIZE 8 EQUAL", "P2SH,STRICTENC", "OK"],
+["-1", "SIZE 1 EQUAL", "P2SH,STRICTENC", "OK"],
+["-127", "SIZE 1 EQUAL", "P2SH,STRICTENC", "OK"],
+["-128", "SIZE 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["-32767", "SIZE 2 EQUAL", "P2SH,STRICTENC", "OK"],
+["-32768", "SIZE 3 EQUAL", "P2SH,STRICTENC", "OK"],
+["-8388607", "SIZE 3 EQUAL", "P2SH,STRICTENC", "OK"],
+["-8388608", "SIZE 4 EQUAL", "P2SH,STRICTENC", "OK"],
+["-2147483647", "SIZE 4 EQUAL", "P2SH,STRICTENC", "OK"],
+["-2147483648", "SIZE 5 EQUAL", "P2SH,STRICTENC", "OK"],
+["-549755813887", "SIZE 5 EQUAL", "P2SH,STRICTENC", "OK"],
+["-549755813888", "SIZE 6 EQUAL", "P2SH,STRICTENC", "OK"],
+["-9223372036854775807", "SIZE 8 EQUAL", "P2SH,STRICTENC", "OK"],
+["'abcdefghijklmnopqrstuvwxyz'", "SIZE 26 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["42", "SIZE 1 EQUALVERIFY 42 EQUAL", "P2SH,STRICTENC", "OK", "SIZE does not consume argument"],
+
+["2 -2 ADD", "0 EQUAL", "P2SH,STRICTENC", "OK"],
+["2147483647 -2147483647 ADD", "0 EQUAL", "P2SH,STRICTENC", "OK"],
+["-1 -1 ADD", "-2 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["0 0","EQUAL", "P2SH,STRICTENC", "OK"],
+["1 1 ADD", "2 EQUAL", "P2SH,STRICTENC", "OK"],
+["1 1ADD", "2 EQUAL", "P2SH,STRICTENC", "OK"],
+["111 1SUB", "110 EQUAL", "P2SH,STRICTENC", "OK"],
+["111 1 ADD 12 SUB", "100 EQUAL", "P2SH,STRICTENC", "OK"],
+["0 ABS", "0 EQUAL", "P2SH,STRICTENC", "OK"],
+["16 ABS", "16 EQUAL", "P2SH,STRICTENC", "OK"],
+["-16 ABS", "-16 NEGATE EQUAL", "P2SH,STRICTENC", "OK"],
+["0 NOT", "NOP", "P2SH,STRICTENC", "OK"],
+["1 NOT", "0 EQUAL", "P2SH,STRICTENC", "OK"],
+["11 NOT", "0 EQUAL", "P2SH,STRICTENC", "OK"],
+["0 0NOTEQUAL", "0 EQUAL", "P2SH,STRICTENC", "OK"],
+["1 0NOTEQUAL", "1 EQUAL", "P2SH,STRICTENC", "OK"],
+["111 0NOTEQUAL", "1 EQUAL", "P2SH,STRICTENC", "OK"],
+["-111 0NOTEQUAL", "1 EQUAL", "P2SH,STRICTENC", "OK"],
+["1 1 BOOLAND", "NOP", "P2SH,STRICTENC", "OK"],
+["1 0 BOOLAND", "NOT", "P2SH,STRICTENC", "OK"],
+["0 1 BOOLAND", "NOT", "P2SH,STRICTENC", "OK"],
+["0 0 BOOLAND", "NOT", "P2SH,STRICTENC", "OK"],
+["16 17 BOOLAND", "NOP", "P2SH,STRICTENC", "OK"],
+["1 1 BOOLOR", "NOP", "P2SH,STRICTENC", "OK"],
+["1 0 BOOLOR", "NOP", "P2SH,STRICTENC", "OK"],
+["0 1 BOOLOR", "NOP", "P2SH,STRICTENC", "OK"],
+["0 0 BOOLOR", "NOT", "P2SH,STRICTENC", "OK"],
+["16 17 BOOLOR", "NOP", "P2SH,STRICTENC", "OK"],
+["11 10 1 ADD", "NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["11 10 1 ADD", "NUMEQUALVERIFY 1", "P2SH,STRICTENC", "OK"],
+["11 10 1 ADD", "NUMNOTEQUAL NOT", "P2SH,STRICTENC", "OK"],
+["111 10 1 ADD", "NUMNOTEQUAL", "P2SH,STRICTENC", "OK"],
+["11 10", "LESSTHAN NOT", "P2SH,STRICTENC", "OK"],
+["4 4", "LESSTHAN NOT", "P2SH,STRICTENC", "OK"],
+["10 11", "LESSTHAN", "P2SH,STRICTENC", "OK"],
+["-11 11", "LESSTHAN", "P2SH,STRICTENC", "OK"],
+["-11 -10", "LESSTHAN", "P2SH,STRICTENC", "OK"],
+["11 10", "GREATERTHAN", "P2SH,STRICTENC", "OK"],
+["4 4", "GREATERTHAN NOT", "P2SH,STRICTENC", "OK"],
+["10 11", "GREATERTHAN NOT", "P2SH,STRICTENC", "OK"],
+["-11 11", "GREATERTHAN NOT", "P2SH,STRICTENC", "OK"],
+["-11 -10", "GREATERTHAN NOT", "P2SH,STRICTENC", "OK"],
+["11 10", "LESSTHANOREQUAL NOT", "P2SH,STRICTENC", "OK"],
+["4 4", "LESSTHANOREQUAL", "P2SH,STRICTENC", "OK"],
+["10 11", "LESSTHANOREQUAL", "P2SH,STRICTENC", "OK"],
+["-11 11", "LESSTHANOREQUAL", "P2SH,STRICTENC", "OK"],
+["-11 -10", "LESSTHANOREQUAL", "P2SH,STRICTENC", "OK"],
+["11 10", "GREATERTHANOREQUAL", "P2SH,STRICTENC", "OK"],
+["4 4", "GREATERTHANOREQUAL", "P2SH,STRICTENC", "OK"],
+["10 11", "GREATERTHANOREQUAL NOT", "P2SH,STRICTENC", "OK"],
+["-11 11", "GREATERTHANOREQUAL NOT", "P2SH,STRICTENC", "OK"],
+["-11 -10", "GREATERTHANOREQUAL NOT", "P2SH,STRICTENC", "OK"],
+["1 0 MIN", "0 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0 1 MIN", "0 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["-1 0 MIN", "-1 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0 -2147483647 MIN", "-2147483647 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["2147483647 0 MAX", "2147483647 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0 100 MAX", "100 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["-100 0 MAX", "0 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0 -2147483647 MAX", "0 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0 0 1", "WITHIN", "P2SH,STRICTENC", "OK"],
+["1 0 1", "WITHIN NOT", "P2SH,STRICTENC", "OK"],
+["0 -2147483647 2147483647", "WITHIN", "P2SH,STRICTENC", "OK"],
+["-1 -100 100", "WITHIN", "P2SH,STRICTENC", "OK"],
+["11 -100 100", "WITHIN", "P2SH,STRICTENC", "OK"],
+["-2147483647 -100 100", "WITHIN NOT", "P2SH,STRICTENC", "OK"],
+["2147483647 -100 100", "WITHIN NOT", "P2SH,STRICTENC", "OK"],
+
+["2147483647 2147483647 SUB", "0 EQUAL", "P2SH,STRICTENC", "OK"],
+["2147483647 DUP ADD", "4294967294 EQUAL", "P2SH,STRICTENC", "OK", ">32 bit EQUAL is valid"],
+["2147483647 NEGATE DUP ADD", "-4294967294 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["''", "RIPEMD160 0x14 0x9c1185a5c5e9fc54612808977ee8f548b2258d31 EQUAL", "P2SH,STRICTENC", "OK"],
+["'a'", "RIPEMD160 0x14 0x0bdc9d2d256b3ee9daae347be6f4dc835a467ffe EQUAL", "P2SH,STRICTENC", "OK"],
+["'abcdefghijklmnopqrstuvwxyz'", "RIPEMD160 0x14 0xf71c27109c692c1b56bbdceb5b9d2865b3708dbc EQUAL", "P2SH,STRICTENC", "OK"],
+["''", "SHA1 0x14 0xda39a3ee5e6b4b0d3255bfef95601890afd80709 EQUAL", "P2SH,STRICTENC", "OK"],
+["'a'", "SHA1 0x14 0x86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 EQUAL", "P2SH,STRICTENC", "OK"],
+["'abcdefghijklmnopqrstuvwxyz'", "SHA1 0x14 0x32d10c7b8cf96570ca04ce37f2a19d84240d3a89 EQUAL", "P2SH,STRICTENC", "OK"],
+["''", "SHA256 0x20 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 EQUAL", "P2SH,STRICTENC", "OK"],
+["'a'", "SHA256 0x20 0xca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb EQUAL", "P2SH,STRICTENC", "OK"],
+["'abcdefghijklmnopqrstuvwxyz'", "SHA256 0x20 0x71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73 EQUAL", "P2SH,STRICTENC", "OK"],
+["''", "DUP HASH160 SWAP SHA256 RIPEMD160 EQUAL", "P2SH,STRICTENC", "OK"],
+["''", "DUP HASH256 SWAP SHA256 SHA256 EQUAL", "P2SH,STRICTENC", "OK"],
+["''", "NOP HASH160 0x14 0xb472a266d0bd89c13706a4132ccfb16f7c3b9fcb EQUAL", "P2SH,STRICTENC", "OK"],
+["'a'", "HASH160 NOP 0x14 0x994355199e516ff76c4fa4aab39337b9d84cf12b EQUAL", "P2SH,STRICTENC", "OK"],
+["'abcdefghijklmnopqrstuvwxyz'", "HASH160 0x4c 0x14 0xc286a1af0947f58d1ad787385b1c2c4a976f9e71 EQUAL", "P2SH,STRICTENC", "OK"],
+["''", "HASH256 0x20 0x5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456 EQUAL", "P2SH,STRICTENC", "OK"],
+["'a'", "HASH256 0x20 0xbf5d3affb73efd2ec6c36ad3112dd933efed63c4e1cbffcfa88e2759c144f2d8 EQUAL", "P2SH,STRICTENC", "OK"],
+["'abcdefghijklmnopqrstuvwxyz'", "HASH256 0x4c 0x20 0xca139bc10c2f660da42666f72e89a225936fc60f193c161124a672050c434671 EQUAL", "P2SH,STRICTENC", "OK"],
+
+
+["1","NOP1 CHECKLOCKTIMEVERIFY CHECKSEQUENCEVERIFY NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", "P2SH,STRICTENC", "OK"],
+["'NOP_1_to_10' NOP1 CHECKLOCKTIMEVERIFY CHECKSEQUENCEVERIFY NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_10' EQUAL", "P2SH,STRICTENC", "OK"],
+
+["1", "NOP", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "OK", "Discourage NOPx flag allows OP_NOP"],
+
+["0", "IF NOP10 ENDIF 1", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "OK",
+ "Discouraged NOPs are allowed if not executed"],
+
+["0", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "OK", "opcodes above NOP10 invalid if executed"],
+["0", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xbd ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xbe ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xbf ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc0 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc1 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc2 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc3 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc4 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc5 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc6 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc7 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc8 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xc9 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xca ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xcb ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xcc ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xcd ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xce ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xcf ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd0 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd1 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd2 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd3 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd4 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd5 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd6 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd7 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd8 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xd9 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xda ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xdb ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xdc ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xdd ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xde ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xdf ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe0 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe1 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe2 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe3 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe4 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe5 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe6 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe7 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe8 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xe9 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xea ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xeb ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xec ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xed ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xee ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xef ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf0 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf1 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf2 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf3 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf4 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf5 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf6 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf7 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf8 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xf9 ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xfa ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xfb ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xfc ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xfd ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xfe ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+["0", "IF 0xff ELSE 1 ENDIF", "P2SH,STRICTENC", "OK"],
+
+["NOP",
+"'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'",
+"P2SH,STRICTENC", "OK",
+"520 byte push"],
+["1",
+"0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
+"P2SH,STRICTENC", "OK",
+"201 opcodes executed. 0x61 is NOP"],
+["1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"P2SH,STRICTENC", "OK",
+"1,000 stack size (0x6f is 3DUP)"],
+["1 TOALTSTACK 2 TOALTSTACK 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"1 2 3 4 5 6 7 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"P2SH,STRICTENC", "OK",
+"1,000 stack size (altstack cleared between scriptSig/scriptPubKey)"],
+["'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f 2DUP 0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
+"P2SH,STRICTENC", "OK",
+"Max-size (10,000-byte), max-push(520 bytes), max-opcodes(201), max stack size(1,000 items). 0x6f is 3DUP, 0x61 is NOP"],
+
+["0",
+"IF 0x5050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050 ENDIF 1",
+"P2SH,STRICTENC", "OK",
+">201 opcodes, but RESERVED (0x50) doesn't count towards opcode limit."],
+
+["NOP","1", "P2SH,STRICTENC", "OK"],
+
+["1", "0x01 0x01 EQUAL", "P2SH,STRICTENC", "OK", "The following is useful for checking implementations of BN_bn2mpi"],
+["127", "0x01 0x7F EQUAL", "P2SH,STRICTENC", "OK"],
+["128", "0x02 0x8000 EQUAL", "P2SH,STRICTENC", "OK", "Leave room for the sign bit"],
+["32767", "0x02 0xFF7F EQUAL", "P2SH,STRICTENC", "OK"],
+["32768", "0x03 0x008000 EQUAL", "P2SH,STRICTENC", "OK"],
+["8388607", "0x03 0xFFFF7F EQUAL", "P2SH,STRICTENC", "OK"],
+["8388608", "0x04 0x00008000 EQUAL", "P2SH,STRICTENC", "OK"],
+["2147483647", "0x04 0xFFFFFF7F EQUAL", "P2SH,STRICTENC", "OK"],
+["2147483648", "0x05 0x0000008000 EQUAL", "P2SH,STRICTENC", "OK"],
+["549755813887", "0x05 0xFFFFFFFF7F EQUAL", "P2SH,STRICTENC", "OK"],
+["549755813888", "0x06 0xFFFFFFFF7F EQUAL", "P2SH,STRICTENC", "OK"],
+["9223372036854775807", "0x08 0xFFFFFFFFFFFFFF7F EQUAL", "P2SH,STRICTENC", "OK"],
+["-1", "0x01 0x81 EQUAL", "P2SH,STRICTENC", "OK", "Numbers are little-endian with the MSB being a sign bit"],
+["-127", "0x01 0xFF EQUAL", "P2SH,STRICTENC", "OK"],
+["-128", "0x02 0x8080 EQUAL", "P2SH,STRICTENC", "OK"],
+["-32767", "0x02 0xFFFF EQUAL", "P2SH,STRICTENC", "OK"],
+["-32768", "0x03 0x008080 EQUAL", "P2SH,STRICTENC", "OK"],
+["-8388607", "0x03 0xFFFFFF EQUAL", "P2SH,STRICTENC", "OK"],
+["-8388608", "0x04 0x00008080 EQUAL", "P2SH,STRICTENC", "OK"],
+["-2147483647", "0x04 0xFFFFFFFF EQUAL", "P2SH,STRICTENC", "OK"],
+["-2147483648", "0x05 0x0000008080 EQUAL", "P2SH,STRICTENC", "OK"],
+["-4294967295", "0x05 0xFFFFFFFF80 EQUAL", "P2SH,STRICTENC", "OK"],
+["-549755813887", "0x05 0xFFFFFFFFFF EQUAL", "P2SH,STRICTENC", "OK"],
+["-549755813888", "0x06 0x000000008080 EQUAL", "P2SH,STRICTENC", "OK"],
+["-9223372036854775807", "0x08 0xFFFFFFFFFFFFFFFF EQUAL", "P2SH,STRICTENC", "OK"],
+
+["2147483647", "1ADD 2147483648 EQUAL", "P2SH,STRICTENC", "OK", "We can do math on 4-byte integers, and compare 5-byte ones"],
+["2147483647", "1ADD 1", "P2SH,STRICTENC", "OK"],
+["-2147483647", "1ADD 1", "P2SH,STRICTENC", "OK"],
+
+["1", "0x02 0x0100 EQUAL NOT", "P2SH,STRICTENC", "OK", "Not the same byte array..."],
+["1", "0x02 0x0100 NUMEQUAL", "P2SH,STRICTENC", "OK", "... but they are numerically equal"],
+["11", "0x4c 0x03 0x0b0000 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0", "0x01 0x80 EQUAL NOT", "P2SH,STRICTENC", "OK"],
+["0", "0x01 0x80 NUMEQUAL", "P2SH,STRICTENC", "OK", "Zero numerically equals negative zero"],
+["0", "0x02 0x0080 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0x03 0x000080", "0x04 0x00000080 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0x03 0x100080", "0x04 0x10000080 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0x03 0x100000", "0x04 0x10000000 NUMEQUAL", "P2SH,STRICTENC", "OK"],
+
+["NOP", "NOP 1", "P2SH,STRICTENC", "OK", "The following tests check the if(stack.size() < N) tests in each opcode"],
+["1", "IF 1 ENDIF", "P2SH,STRICTENC", "OK", "They are here to catch copy-and-paste errors"],
+["0", "NOTIF 1 ENDIF", "P2SH,STRICTENC", "OK", "Most of them are duplicated elsewhere,"],
+["1", "VERIFY 1", "P2SH,STRICTENC", "OK", "but, hey, more is always better, right?"],
+
+["0", "TOALTSTACK 1", "P2SH,STRICTENC", "OK"],
+["1", "TOALTSTACK FROMALTSTACK", "P2SH,STRICTENC", "OK"],
+["0 0", "2DROP 1", "P2SH,STRICTENC", "OK"],
+["0 1", "2DUP", "P2SH,STRICTENC", "OK"],
+["0 0 1", "3DUP", "P2SH,STRICTENC", "OK"],
+["0 1 0 0", "2OVER", "P2SH,STRICTENC", "OK"],
+["0 1 0 0 0 0", "2ROT", "P2SH,STRICTENC", "OK"],
+["0 1 0 0", "2SWAP", "P2SH,STRICTENC", "OK"],
+["1", "IFDUP", "P2SH,STRICTENC", "OK"],
+["NOP", "DEPTH 1", "P2SH,STRICTENC", "OK"],
+["0", "DROP 1", "P2SH,STRICTENC", "OK"],
+["1", "DUP", "P2SH,STRICTENC", "OK"],
+["0 1", "NIP", "P2SH,STRICTENC", "OK"],
+["1 0", "OVER", "P2SH,STRICTENC", "OK"],
+["1 0 0 0 3", "PICK", "P2SH,STRICTENC", "OK"],
+["1 0", "PICK", "P2SH,STRICTENC", "OK"],
+["1 0 0 0 3", "ROLL", "P2SH,STRICTENC", "OK"],
+["1 0", "ROLL", "P2SH,STRICTENC", "OK"],
+["1 0 0", "ROT", "P2SH,STRICTENC", "OK"],
+["1 0", "SWAP", "P2SH,STRICTENC", "OK"],
+["0 1", "TUCK", "P2SH,STRICTENC", "OK"],
+
+["1", "SIZE", "P2SH,STRICTENC", "OK"],
+
+["0 0", "EQUAL", "P2SH,STRICTENC", "OK"],
+["0 0", "EQUALVERIFY 1", "P2SH,STRICTENC", "OK"],
+["0 0 1", "EQUAL EQUAL", "P2SH,STRICTENC", "OK", "OP_0 and bools must have identical byte representations"],
+
+["0", "1ADD", "P2SH,STRICTENC", "OK"],
+["2", "1SUB", "P2SH,STRICTENC", "OK"],
+["-1", "NEGATE", "P2SH,STRICTENC", "OK"],
+["-1", "ABS", "P2SH,STRICTENC", "OK"],
+["0", "NOT", "P2SH,STRICTENC", "OK"],
+["-1", "0NOTEQUAL", "P2SH,STRICTENC", "OK"],
+
+["1 0", "ADD", "P2SH,STRICTENC", "OK"],
+["1 0", "SUB", "P2SH,STRICTENC", "OK"],
+["-1 -1", "BOOLAND", "P2SH,STRICTENC", "OK"],
+["-1 0", "BOOLOR", "P2SH,STRICTENC", "OK"],
+["0 0", "NUMEQUAL", "P2SH,STRICTENC", "OK"],
+["0 0", "NUMEQUALVERIFY 1", "P2SH,STRICTENC", "OK"],
+["-1 0", "NUMNOTEQUAL", "P2SH,STRICTENC", "OK"],
+["-1 0", "LESSTHAN", "P2SH,STRICTENC", "OK"],
+["1 0", "GREATERTHAN", "P2SH,STRICTENC", "OK"],
+["0 0", "LESSTHANOREQUAL", "P2SH,STRICTENC", "OK"],
+["0 0", "GREATERTHANOREQUAL", "P2SH,STRICTENC", "OK"],
+["-1 0", "MIN", "P2SH,STRICTENC", "OK"],
+["1 0", "MAX", "P2SH,STRICTENC", "OK"],
+["-1 -1 0", "WITHIN", "P2SH,STRICTENC", "OK"],
+
+["0", "RIPEMD160", "P2SH,STRICTENC", "OK"],
+["0", "SHA1", "P2SH,STRICTENC", "OK"],
+["0", "SHA256", "P2SH,STRICTENC", "OK"],
+["0", "HASH160", "P2SH,STRICTENC", "OK"],
+["0", "HASH256", "P2SH,STRICTENC", "OK"],
+["NOP", "CODESEPARATOR 1", "P2SH,STRICTENC", "OK"],
+
+["NOP", "NOP1 1", "P2SH,STRICTENC", "OK"],
+["NOP", "CHECKLOCKTIMEVERIFY 1", "P2SH,STRICTENC", "OK"],
+["NOP", "CHECKSEQUENCEVERIFY 1", "P2SH,STRICTENC", "OK"],
+["NOP", "NOP4 1", "P2SH,STRICTENC", "OK"],
+["NOP", "NOP5 1", "P2SH,STRICTENC", "OK"],
+["NOP", "NOP6 1", "P2SH,STRICTENC", "OK"],
+["NOP", "NOP7 1", "P2SH,STRICTENC", "OK"],
+["NOP", "NOP8 1", "P2SH,STRICTENC", "OK"],
+["NOP", "NOP9 1", "P2SH,STRICTENC", "OK"],
+["NOP", "NOP10 1", "P2SH,STRICTENC", "OK"],
+
+["", "0 0 0 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK", "CHECKMULTISIG is allowed to have zero keys and/or sigs"],
+["", "0 0 0 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 0 1 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK", "Zero sigs means no sigs are checked"],
+["", "0 0 0 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["", "0 0 0 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK", "CHECKMULTISIG is allowed to have zero keys and/or sigs"],
+["", "0 0 0 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 0 1 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK", "Zero sigs means no sigs are checked"],
+["", "0 0 0 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["", "0 0 'a' 'b' 2 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK", "Test from up to 20 pubkeys, all not checked"],
+["", "0 0 'a' 'b' 'c' 3 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 4 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 5 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 6 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 7 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 8 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 9 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 10 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 11 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 12 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 13 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 14 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 15 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 16 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 17 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 18 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 19 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 2 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 3 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 4 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 5 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 6 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 7 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 8 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 9 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 10 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 11 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 12 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 13 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 14 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 15 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 16 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 17 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 18 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 19 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "OK"],
+
+["",
+"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",
+"P2SH,STRICTENC", "OK",
+"nOpCount is incremented by the number of keys evaluated in addition to the usual one op per op. In this case we have zero keys, so we can execute 201 CHECKMULTISIGS"],
+
+["1",
+"0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY",
+"P2SH,STRICTENC", "OK"],
+
+["",
+"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG",
+"P2SH,STRICTENC", "OK",
+"Even though there are no signatures being checked nOpCount is incremented by the number of keys."],
+
+["1",
+"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY",
+"P2SH,STRICTENC", "OK"],
+
+["0 0x01 1", "HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL", "P2SH,STRICTENC", "OK", "Very basic P2SH"],
+["0x4c 0 0x01 1", "HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL", "P2SH,STRICTENC", "OK"],
+
+["0x40 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242",
+"0x4d 0x4000 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242 EQUAL",
+"P2SH,STRICTENC", "OK",
+"Basic PUSH signedness check"],
+
+["0x4c 0x40 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242",
+"0x4d 0x4000 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242 EQUAL",
+"P2SH,STRICTENC", "OK",
+"Basic PUSHDATA1 signedness check"],
+
+["all PUSHDATA forms are equivalent"],
+
+["0x4c 0x4b 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "0x4b 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 EQUAL", "", "OK", "PUSHDATA1 of 75 bytes equals direct push of it"],
+["0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "0x4c 0xFF 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 EQUAL", "", "OK", "PUSHDATA2 of 255 bytes equals PUSHDATA1 of it"],
+
+["0x00", "SIZE 0 EQUAL", "P2SH,STRICTENC", "OK", "Basic OP_0 execution"],
+
+["Numeric pushes"],
+
+["0x01 0x81", "0x4f EQUAL", "", "OK", "OP1_NEGATE pushes 0x81"],
+["0x01 0x01", "0x51 EQUAL", "", "OK", "OP_1 pushes 0x01"],
+["0x01 0x02", "0x52 EQUAL", "", "OK", "OP_2 pushes 0x02"],
+["0x01 0x03", "0x53 EQUAL", "", "OK", "OP_3 pushes 0x03"],
+["0x01 0x04", "0x54 EQUAL", "", "OK", "OP_4 pushes 0x04"],
+["0x01 0x05", "0x55 EQUAL", "", "OK", "OP_5 pushes 0x05"],
+["0x01 0x06", "0x56 EQUAL", "", "OK", "OP_6 pushes 0x06"],
+["0x01 0x07", "0x57 EQUAL", "", "OK", "OP_7 pushes 0x07"],
+["0x01 0x08", "0x58 EQUAL", "", "OK", "OP_8 pushes 0x08"],
+["0x01 0x09", "0x59 EQUAL", "", "OK", "OP_9 pushes 0x09"],
+["0x01 0x0a", "0x5a EQUAL", "", "OK", "OP_10 pushes 0x0a"],
+["0x01 0x0b", "0x5b EQUAL", "", "OK", "OP_11 pushes 0x0b"],
+["0x01 0x0c", "0x5c EQUAL", "", "OK", "OP_12 pushes 0x0c"],
+["0x01 0x0d", "0x5d EQUAL", "", "OK", "OP_13 pushes 0x0d"],
+["0x01 0x0e", "0x5e EQUAL", "", "OK", "OP_14 pushes 0x0e"],
+["0x01 0x0f", "0x5f EQUAL", "", "OK", "OP_15 pushes 0x0f"],
+["0x01 0x10", "0x60 EQUAL", "", "OK", "OP_16 pushes 0x10"],
+
+["Equivalency of different numeric encodings"],
+
+["0x02 0x8000", "128 NUMEQUAL", "", "OK", "0x8000 equals 128"],
+["0x01 0x00", "0 NUMEQUAL", "", "OK", "0x00 numequals 0"],
+["0x01 0x80", "0 NUMEQUAL", "", "OK", "0x80 (negative zero) numequals 0"],
+["0x02 0x0080", "0 NUMEQUAL", "", "OK", "0x0080 numequals 0"],
+["0x02 0x0500", "5 NUMEQUAL", "", "OK", "0x0500 numequals 5"],
+["0x03 0xff7f80", "0x02 0xffff NUMEQUAL", "", "OK", ""],
+["0x03 0xff7f00", "0x02 0xff7f NUMEQUAL", "", "OK", ""],
+["0x04 0xffff7f80", "0x03 0xffffff NUMEQUAL", "", "OK", ""],
+["0x04 0xffff7f00", "0x03 0xffff7f NUMEQUAL", "", "OK", ""],
+
+["Unevaluated non-minimal pushes are ignored"],
+
+["0 IF 0x4c 0x00 ENDIF 1", "", "MINIMALDATA", "OK", "non-minimal PUSHDATA1 ignored"],
+["0 IF 0x4d 0x0000 ENDIF 1", "", "MINIMALDATA", "OK", "non-minimal PUSHDATA2 ignored"],
+["0 IF 0x4c 0x00000000 ENDIF 1", "", "MINIMALDATA", "OK", "non-minimal PUSHDATA4 ignored"],
+["0 IF 0x01 0x81 ENDIF 1", "", "MINIMALDATA", "OK", "1NEGATE equiv"],
+["0 IF 0x01 0x01 ENDIF 1", "", "MINIMALDATA", "OK", "OP_1 equiv"],
+["0 IF 0x01 0x02 ENDIF 1", "", "MINIMALDATA", "OK", "OP_2 equiv"],
+["0 IF 0x01 0x03 ENDIF 1", "", "MINIMALDATA", "OK", "OP_3 equiv"],
+["0 IF 0x01 0x04 ENDIF 1", "", "MINIMALDATA", "OK", "OP_4 equiv"],
+["0 IF 0x01 0x05 ENDIF 1", "", "MINIMALDATA", "OK", "OP_5 equiv"],
+["0 IF 0x01 0x06 ENDIF 1", "", "MINIMALDATA", "OK", "OP_6 equiv"],
+["0 IF 0x01 0x07 ENDIF 1", "", "MINIMALDATA", "OK", "OP_7 equiv"],
+["0 IF 0x01 0x08 ENDIF 1", "", "MINIMALDATA", "OK", "OP_8 equiv"],
+["0 IF 0x01 0x09 ENDIF 1", "", "MINIMALDATA", "OK", "OP_9 equiv"],
+["0 IF 0x01 0x0a ENDIF 1", "", "MINIMALDATA", "OK", "OP_10 equiv"],
+["0 IF 0x01 0x0b ENDIF 1", "", "MINIMALDATA", "OK", "OP_11 equiv"],
+["0 IF 0x01 0x0c ENDIF 1", "", "MINIMALDATA", "OK", "OP_12 equiv"],
+["0 IF 0x01 0x0d ENDIF 1", "", "MINIMALDATA", "OK", "OP_13 equiv"],
+["0 IF 0x01 0x0e ENDIF 1", "", "MINIMALDATA", "OK", "OP_14 equiv"],
+["0 IF 0x01 0x0f ENDIF 1", "", "MINIMALDATA", "OK", "OP_15 equiv"],
+["0 IF 0x01 0x10 ENDIF 1", "", "MINIMALDATA", "OK", "OP_16 equiv"],
+
+["Numeric minimaldata rules are only applied when a stack item is numerically evaluated; the push itself is allowed"],
+
+["0x01 0x00", "1", "MINIMALDATA", "OK"],
+["0x01 0x80", "1", "MINIMALDATA", "OK"],
+["0x02 0x0180", "1", "MINIMALDATA", "OK"],
+["0x02 0x0100", "1", "MINIMALDATA", "OK"],
+["0x02 0x0200", "1", "MINIMALDATA", "OK"],
+["0x02 0x0300", "1", "MINIMALDATA", "OK"],
+["0x02 0x0400", "1", "MINIMALDATA", "OK"],
+["0x02 0x0500", "1", "MINIMALDATA", "OK"],
+["0x02 0x0600", "1", "MINIMALDATA", "OK"],
+["0x02 0x0700", "1", "MINIMALDATA", "OK"],
+["0x02 0x0800", "1", "MINIMALDATA", "OK"],
+["0x02 0x0900", "1", "MINIMALDATA", "OK"],
+["0x02 0x0a00", "1", "MINIMALDATA", "OK"],
+["0x02 0x0b00", "1", "MINIMALDATA", "OK"],
+["0x02 0x0c00", "1", "MINIMALDATA", "OK"],
+["0x02 0x0d00", "1", "MINIMALDATA", "OK"],
+["0x02 0x0e00", "1", "MINIMALDATA", "OK"],
+["0x02 0x0f00", "1", "MINIMALDATA", "OK"],
+["0x02 0x1000", "1", "MINIMALDATA", "OK"],
+
+["Valid version of the 'Test every numeric-accepting opcode for correct handling of the numeric minimal encoding rule' script_invalid test"],
+
+["1 0x02 0x0000", "PICK DROP", "", "OK"],
+["1 0x02 0x0000", "ROLL DROP 1", "", "OK"],
+["0x02 0x0000", "1ADD DROP 1", "", "OK"],
+["0x02 0x0000", "1SUB DROP 1", "", "OK"],
+["0x02 0x0000", "NEGATE DROP 1", "", "OK"],
+["0x02 0x0000", "ABS DROP 1", "", "OK"],
+["0x02 0x0000", "NOT DROP 1", "", "OK"],
+["0x02 0x0000", "0NOTEQUAL DROP 1", "", "OK"],
+
+["0 0x02 0x0000", "ADD DROP 1", "", "OK"],
+["0x02 0x0000 0", "ADD DROP 1", "", "OK"],
+["0 0x02 0x0000", "SUB DROP 1", "", "OK"],
+["0x02 0x0000 0", "SUB DROP 1", "", "OK"],
+["0 0x02 0x0000", "BOOLAND DROP 1", "", "OK"],
+["0x02 0x0000 0", "BOOLAND DROP 1", "", "OK"],
+["0 0x02 0x0000", "BOOLOR DROP 1", "", "OK"],
+["0x02 0x0000 0", "BOOLOR DROP 1", "", "OK"],
+["0 0x02 0x0000", "NUMEQUAL DROP 1", "", "OK"],
+["0x02 0x0000 1", "NUMEQUAL DROP 1", "", "OK"],
+["0 0x02 0x0000", "NUMEQUALVERIFY 1", "", "OK"],
+["0x02 0x0000 0", "NUMEQUALVERIFY 1", "", "OK"],
+["0 0x02 0x0000", "NUMNOTEQUAL DROP 1", "", "OK"],
+["0x02 0x0000 0", "NUMNOTEQUAL DROP 1", "", "OK"],
+["0 0x02 0x0000", "LESSTHAN DROP 1", "", "OK"],
+["0x02 0x0000 0", "LESSTHAN DROP 1", "", "OK"],
+["0 0x02 0x0000", "GREATERTHAN DROP 1", "", "OK"],
+["0x02 0x0000 0", "GREATERTHAN DROP 1", "", "OK"],
+["0 0x02 0x0000", "LESSTHANOREQUAL DROP 1", "", "OK"],
+["0x02 0x0000 0", "LESSTHANOREQUAL DROP 1", "", "OK"],
+["0 0x02 0x0000", "GREATERTHANOREQUAL DROP 1", "", "OK"],
+["0x02 0x0000 0", "GREATERTHANOREQUAL DROP 1", "", "OK"],
+["0 0x02 0x0000", "MIN DROP 1", "", "OK"],
+["0x02 0x0000 0", "MIN DROP 1", "", "OK"],
+["0 0x02 0x0000", "MAX DROP 1", "", "OK"],
+["0x02 0x0000 0", "MAX DROP 1", "", "OK"],
+
+["0x02 0x0000 0 0", "WITHIN DROP 1", "", "OK"],
+["0 0x02 0x0000 0", "WITHIN DROP 1", "", "OK"],
+["0 0 0x02 0x0000", "WITHIN DROP 1", "", "OK"],
+
+["0 0 0x02 0x0000", "CHECKMULTISIG DROP 1", "", "OK"],
+["0 0x02 0x0000 0", "CHECKMULTISIG DROP 1", "", "OK"],
+["0 0x02 0x0000 0 1", "CHECKMULTISIG DROP 1", "", "OK"],
+["0 0 0x02 0x0000", "CHECKMULTISIGVERIFY 1", "", "OK"],
+["0 0x02 0x0000 0", "CHECKMULTISIGVERIFY 1", "", "OK"],
+
+["While not really correctly DER encoded, the empty signature is allowed by"],
+["STRICTENC to provide a compact way to provide a delibrately invalid signature."],
+["0", "0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 CHECKSIG NOT", "STRICTENC", "OK"],
+["0 0", "1 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 1 CHECKMULTISIG NOT", "STRICTENC", "OK"],
+
+["CHECKMULTISIG evaluation order tests. CHECKMULTISIG evaluates signatures and"],
+["pubkeys in a specific order, and will exit early if the number of signatures"],
+["left to check is greater than the number of keys left. As STRICTENC fails the"],
+["script when it reaches an invalidly encoded signature or pubkey, we can use it"],
+["to test the exact order in which signatures and pubkeys are evaluated by"],
+["distinguishing CHECKMULTISIG returning false on the stack and the script as a"],
+["whole failing."],
+["See also the corresponding inverted versions of these tests in script_invalid.json"],
+[
+ "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
+ "2 0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
+ "STRICTENC", "OK",
+ "2-of-2 CHECKMULTISIG NOT with the second pubkey invalid, and both signatures validly encoded. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid pubkey."
+],
+[
+ "0 0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
+ "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
+ "STRICTENC", "OK",
+ "2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature."
+],
+
+["Increase test coverage for DERSIG"],
+["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "OK", "Overly long signature is correctly encoded"],
+["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "OK", "Missing S is correctly encoded"],
+["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "", "OK", "S with invalid S length is correctly encoded"],
+["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "OK", "Non-integer R is correctly encoded"],
+["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "OK", "Non-integer S is correctly encoded"],
+["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "OK", "Zero-length R is correctly encoded"],
+["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "", "OK", "Zero-length S is correctly encoded for DERSIG"],
+["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "", "OK", "Negative S is correctly encoded"],
+
+["2147483648", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "OK", "CSV passes if stack top bit 1 << 31 is set"],
+
+["", "DEPTH", "P2SH,STRICTENC", "EVAL_FALSE", "Test the test: we should have an empty stack after scriptSig evaluation"],
+[" ", "DEPTH", "P2SH,STRICTENC", "EVAL_FALSE", "and multiple spaces should not change that."],
+[" ", "DEPTH", "P2SH,STRICTENC", "EVAL_FALSE"],
+[" ", "DEPTH", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["", "", "P2SH,STRICTENC","EVAL_FALSE"],
+["", "NOP", "P2SH,STRICTENC","EVAL_FALSE"],
+["", "NOP DEPTH", "P2SH,STRICTENC", "EVAL_FALSE"],
+["NOP", "", "P2SH,STRICTENC", "EVAL_FALSE"],
+["NOP", "DEPTH", "P2SH,STRICTENC", "EVAL_FALSE"],
+["NOP","NOP", "P2SH,STRICTENC", "EVAL_FALSE"],
+["NOP","NOP DEPTH", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["DEPTH", "", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["0x4c01","0x01 NOP", "P2SH,STRICTENC","BAD_OPCODE", "PUSHDATA1 with not enough bytes"],
+["0x4d0200ff","0x01 NOP", "P2SH,STRICTENC","BAD_OPCODE", "PUSHDATA2 with not enough bytes"],
+["0x4e03000000ffff","0x01 NOP", "P2SH,STRICTENC","BAD_OPCODE", "PUSHDATA4 with not enough bytes"],
+
+["1", "IF 0x50 ENDIF 1", "P2SH,STRICTENC","BAD_OPCODE", "0x50 is reserved"],
+["0x52", "0x5f ADD 0x60 EQUAL", "P2SH,STRICTENC","EVAL_FALSE", "0x51 through 0x60 push 1 through 16 onto stack"],
+["0","NOP", "P2SH,STRICTENC","EVAL_FALSE",""],
+["1", "IF VER ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE", "VER non-functional"],
+["0", "IF VERIF ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE", "VERIF illegal everywhere"],
+["0", "IF ELSE 1 ELSE VERIF ENDIF", "P2SH,STRICTENC", "BAD_OPCODE", "VERIF illegal everywhere"],
+["0", "IF VERNOTIF ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE", "VERNOTIF illegal everywhere"],
+["0", "IF ELSE 1 ELSE VERNOTIF ENDIF", "P2SH,STRICTENC", "BAD_OPCODE", "VERNOTIF illegal everywhere"],
+
+["1 IF", "1 ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "IF/ENDIF can't span scriptSig/scriptPubKey"],
+["1 IF 0 ENDIF", "1 ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+["1 ELSE 0 ENDIF", "1", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+["0 NOTIF", "123", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+
+["0", "DUP IF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["0", "IF 1 ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["0", "DUP IF ELSE ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["0", "IF 1 ELSE ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["0", "NOTIF ELSE 1 ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["0 1", "IF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["0 0", "IF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["1 0", "IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["0 1", "IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["0 0", "NOTIF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["0 1", "NOTIF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["1 1", "NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+["0 0", "NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["1", "IF RETURN ELSE ELSE 1 ENDIF", "P2SH,STRICTENC", "OP_RETURN", "Multiple ELSEs"],
+["1", "IF 1 ELSE ELSE RETURN ENDIF", "P2SH,STRICTENC", "OP_RETURN"],
+
+["1", "ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "Malformed IF/ELSE/ENDIF sequence"],
+["1", "ELSE ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+["1", "ENDIF ELSE", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+["1", "ENDIF ELSE IF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+["1", "IF ELSE ENDIF ELSE", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+["1", "IF ELSE ENDIF ELSE ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+["1", "IF ENDIF ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+["1", "IF ELSE ELSE ENDIF ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL"],
+
+["1", "RETURN", "P2SH,STRICTENC", "OP_RETURN"],
+["1", "DUP IF RETURN ENDIF", "P2SH,STRICTENC", "OP_RETURN"],
+
+["1", "RETURN 'data'", "P2SH,STRICTENC", "OP_RETURN", "canonical prunable txout format"],
+["0 IF", "RETURN ENDIF 1", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "still prunable because IF/ENDIF can't span scriptSig/scriptPubKey"],
+
+["0", "VERIFY 1", "P2SH,STRICTENC", "VERIFY"],
+["1", "VERIFY", "P2SH,STRICTENC", "EVAL_FALSE"],
+["1", "VERIFY 0", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["1 TOALTSTACK", "FROMALTSTACK 1", "P2SH,STRICTENC", "INVALID_ALTSTACK_OPERATION", "alt stack not shared between sig/pubkey"],
+
+["IFDUP", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["DROP", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["DUP", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "DUP 1 ADD 2 EQUALVERIFY 0 EQUAL", "P2SH,STRICTENC", "EVAL_FALSE"],
+["NOP", "NIP", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "1 NIP", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "1 0 NIP", "P2SH,STRICTENC", "EVAL_FALSE"],
+["NOP", "OVER 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "OVER", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["0 1", "OVER DEPTH 3 EQUALVERIFY", "P2SH,STRICTENC", "EVAL_FALSE"],
+["19 20 21", "PICK 19 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "0 PICK", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "-1 PICK", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["19 20 21", "0 PICK 20 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC", "EQUALVERIFY"],
+["19 20 21", "1 PICK 21 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC", "EQUALVERIFY"],
+["19 20 21", "2 PICK 22 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC", "EQUALVERIFY"],
+["NOP", "0 ROLL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "-1 ROLL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["19 20 21", "0 ROLL 20 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC", "EQUALVERIFY"],
+["19 20 21", "1 ROLL 21 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC", "EQUALVERIFY"],
+["19 20 21", "2 ROLL 22 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC", "EQUALVERIFY"],
+["NOP", "ROT 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "1 ROT 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "1 2 ROT 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "0 1 2 ROT", "P2SH,STRICTENC", "EVAL_FALSE"],
+["NOP", "SWAP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "SWAP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["0 1", "SWAP 1 EQUALVERIFY", "P2SH,STRICTENC", "EQUALVERIFY"],
+["NOP", "TUCK 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "TUCK 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 0", "TUCK DEPTH 3 EQUALVERIFY SWAP 2DROP", "P2SH,STRICTENC", "EVAL_FALSE"],
+["NOP", "2DUP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "2DUP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "3DUP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "3DUP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 2", "3DUP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "2OVER 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "2 3 2OVER 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "2SWAP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "2 3 2SWAP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["'a' 'b'", "CAT", "P2SH,STRICTENC", "DISABLED_OPCODE", "CAT disabled"],
+["'a' 'b' 0", "IF CAT ELSE 1 ENDIF", "P2SH,STRICTENC", "DISABLED_OPCODE", "CAT disabled"],
+["'abc' 1 1", "SUBSTR", "P2SH,STRICTENC", "DISABLED_OPCODE", "SUBSTR disabled"],
+["'abc' 1 1 0", "IF SUBSTR ELSE 1 ENDIF", "P2SH,STRICTENC", "DISABLED_OPCODE", "SUBSTR disabled"],
+["'abc' 2 0", "IF LEFT ELSE 1 ENDIF", "P2SH,STRICTENC", "DISABLED_OPCODE", "LEFT disabled"],
+["'abc' 2 0", "IF RIGHT ELSE 1 ENDIF", "P2SH,STRICTENC", "DISABLED_OPCODE", "RIGHT disabled"],
+
+["NOP", "SIZE 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["'abc'", "IF INVERT ELSE 1 ENDIF", "P2SH,STRICTENC", "DISABLED_OPCODE", "INVERT disabled"],
+["1 2 0 IF AND ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "AND disabled"],
+["1 2 0 IF OR ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "OR disabled"],
+["1 2 0 IF XOR ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "XOR disabled"],
+["2 0 IF 2MUL ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "2MUL disabled"],
+["2 0 IF 2DIV ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "2DIV disabled"],
+["2 2 0 IF MUL ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "MUL disabled"],
+["2 2 0 IF DIV ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "DIV disabled"],
+["2 2 0 IF MOD ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "MOD disabled"],
+["2 2 0 IF LSHIFT ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "LSHIFT disabled"],
+["2 2 0 IF RSHIFT ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "DISABLED_OPCODE", "RSHIFT disabled"],
+
+["", "EQUAL NOT", "P2SH,STRICTENC", "INVALID_STACK_OPERATION", "EQUAL must error when there are no stack items"],
+["0", "EQUAL NOT", "P2SH,STRICTENC", "INVALID_STACK_OPERATION", "EQUAL must error when there are not 2 stack items"],
+["0 1","EQUAL", "P2SH,STRICTENC", "EVAL_FALSE"],
+["1 1 ADD", "0 EQUAL", "P2SH,STRICTENC", "EVAL_FALSE"],
+["11 1 ADD 12 SUB", "11 EQUAL", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["2147483648 0 ADD", "NOP", "P2SH,STRICTENC", "UNKNOWN_ERROR", "arithmetic operands must be in range [-2^31...2^31] "],
+["-2147483648 0 ADD", "NOP", "P2SH,STRICTENC", "UNKNOWN_ERROR", "arithmetic operands must be in range [-2^31...2^31] "],
+["2147483647 DUP ADD", "4294967294 NUMEQUAL", "P2SH,STRICTENC", "UNKNOWN_ERROR", "NUMEQUAL must be in numeric range"],
+["'abcdef' NOT", "0 EQUAL", "P2SH,STRICTENC", "UNKNOWN_ERROR", "NOT is an arithmetic operand"],
+
+["2 DUP MUL", "4 EQUAL", "P2SH,STRICTENC", "DISABLED_OPCODE", "disabled"],
+["2 DUP DIV", "1 EQUAL", "P2SH,STRICTENC", "DISABLED_OPCODE", "disabled"],
+["2 2MUL", "4 EQUAL", "P2SH,STRICTENC", "DISABLED_OPCODE", "disabled"],
+["2 2DIV", "1 EQUAL", "P2SH,STRICTENC", "DISABLED_OPCODE", "disabled"],
+["7 3 MOD", "1 EQUAL", "P2SH,STRICTENC", "DISABLED_OPCODE", "disabled"],
+["2 2 LSHIFT", "8 EQUAL", "P2SH,STRICTENC", "DISABLED_OPCODE", "disabled"],
+["2 1 RSHIFT", "1 EQUAL", "P2SH,STRICTENC", "DISABLED_OPCODE", "disabled"],
+
+["1", "NOP1 CHECKLOCKTIMEVERIFY CHECKSEQUENCEVERIFY NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 2 EQUAL", "P2SH,STRICTENC", "EVAL_FALSE"],
+["'NOP_1_to_10' NOP1 CHECKLOCKTIMEVERIFY CHECKSEQUENCEVERIFY NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_11' EQUAL", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["Ensure 100% coverage of discouraged NOPS"],
+["1", "NOP1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "CHECKLOCKTIMEVERIFY", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "CHECKSEQUENCEVERIFY", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "NOP4", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "NOP5", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "NOP6", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "NOP7", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "NOP8", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "NOP9", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+["1", "NOP10", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS"],
+
+["NOP10", "1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in scriptSig"],
+
+["1 0x01 0xb9", "HASH160 0x14 0x15727299b05b45fdaf9ac9ecf7565cfe27c3e567 EQUAL",
+ "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"],
+
+["0x50","1", "P2SH,STRICTENC", "BAD_OPCODE", "opcode 0x50 is reserved"],
+["1", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE", "opcodes above NOP10 invalid if executed"],
+["1", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xbd ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xbe ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xbf ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc0 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc1 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc2 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc3 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc4 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc5 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc6 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc7 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc8 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xc9 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xca ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xcb ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xcc ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xcd ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xce ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xcf ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd0 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd1 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd2 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd3 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd4 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd5 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd6 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd7 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd8 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xd9 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xda ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xdb ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xdc ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xdd ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xde ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xdf ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe0 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe1 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe2 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe3 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe4 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe5 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe6 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe7 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe8 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xe9 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xea ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xeb ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xec ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xed ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xee ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xef ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf0 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf1 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf2 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf3 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf4 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf5 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf6 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf7 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf8 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xf9 ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xfa ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xfb ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xfc ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xfd ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xfe ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+["1", "IF 0xff ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"],
+
+["1 IF 1 ELSE", "0xff ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "invalid because scriptSig and scriptPubKey are processed separately"],
+
+["NOP", "RIPEMD160", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "SHA1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "SHA256", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "HASH160", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "HASH256", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["NOP",
+"'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'",
+"P2SH,STRICTENC",
+"PUSH_SIZE",
+">520 byte push"],
+["0",
+"IF 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' ENDIF 1",
+"P2SH,STRICTENC",
+"PUSH_SIZE",
+">520 byte push in non-executed IF branch"],
+["1",
+"0x61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
+"P2SH,STRICTENC",
+"OP_COUNT",
+">201 opcodes executed. 0x61 is NOP"],
+["0",
+"IF 0x6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161 ENDIF 1",
+"P2SH,STRICTENC",
+"OP_COUNT",
+">201 opcodes including non-executed IF branch. 0x61 is NOP"],
+["1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"1 2 3 4 5 6 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"P2SH,STRICTENC",
+"STACK_SIZE",
+">1,000 stack size (0x6f is 3DUP)"],
+["1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"1 TOALTSTACK 2 TOALTSTACK 3 4 5 6 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
+"P2SH,STRICTENC",
+"STACK_SIZE",
+">1,000 stack+altstack size"],
+["NOP",
+"0 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f 2DUP 0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
+"P2SH,STRICTENC",
+"SCRIPT_SIZE",
+"10,001-byte scriptPubKey"],
+
+["NOP1","NOP10", "P2SH,STRICTENC", "EVAL_FALSE"],
+
+["1","VER", "P2SH,STRICTENC", "BAD_OPCODE", "OP_VER is reserved"],
+["1","VERIF", "P2SH,STRICTENC", "BAD_OPCODE", "OP_VERIF is reserved"],
+["1","VERNOTIF", "P2SH,STRICTENC", "BAD_OPCODE", "OP_VERNOTIF is reserved"],
+["1","RESERVED", "P2SH,STRICTENC", "BAD_OPCODE", "OP_RESERVED is reserved"],
+["1","RESERVED1", "P2SH,STRICTENC", "BAD_OPCODE", "OP_RESERVED1 is reserved"],
+["1","RESERVED2", "P2SH,STRICTENC", "BAD_OPCODE", "OP_RESERVED2 is reserved"],
+["1","0xba", "P2SH,STRICTENC", "BAD_OPCODE", "0xba == OP_NOP10 + 1"],
+
+["2147483648", "1ADD 1", "P2SH,STRICTENC", "UNKNOWN_ERROR", "We cannot do math on 5-byte integers"],
+["2147483648", "NEGATE 1", "P2SH,STRICTENC", "UNKNOWN_ERROR", "We cannot do math on 5-byte integers"],
+["-2147483648", "1ADD 1", "P2SH,STRICTENC", "UNKNOWN_ERROR", "Because we use a sign bit, -2147483648 is also 5 bytes"],
+["2147483647", "1ADD 1SUB 1", "P2SH,STRICTENC", "UNKNOWN_ERROR", "We cannot do math on 5-byte integers, even if the result is 4-bytes"],
+["2147483648", "1SUB 1", "P2SH,STRICTENC", "UNKNOWN_ERROR", "We cannot do math on 5-byte integers, even if the result is 4-bytes"],
+
+["2147483648 1", "BOOLOR 1", "P2SH,STRICTENC", "UNKNOWN_ERROR", "We cannot do BOOLOR on 5-byte integers (but we can still do IF etc)"],
+["2147483648 1", "BOOLAND 1", "P2SH,STRICTENC", "UNKNOWN_ERROR", "We cannot do BOOLAND on 5-byte integers"],
+
+["1", "1 ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "ENDIF without IF"],
+["1", "IF 1", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "IF without ENDIF"],
+["1 IF 1", "ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "IFs don't carry over"],
+
+["NOP", "IF 1 ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "The following tests check the if(stack.size() < N) tests in each opcode"],
+["NOP", "NOTIF 1 ENDIF", "P2SH,STRICTENC", "UNBALANCED_CONDITIONAL", "They are here to catch copy-and-paste errors"],
+["NOP", "VERIFY 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION", "Most of them are duplicated elsewhere,"],
+
+["NOP", "TOALTSTACK 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION", "but, hey, more is always better, right?"],
+["1", "FROMALTSTACK", "P2SH,STRICTENC", "INVALID_ALTSTACK_OPERATION"],
+["1", "2DROP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "2DUP", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 1", "3DUP", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 1 1", "2OVER", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 1 1 1 1", "2ROT", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 1 1", "2SWAP", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "IFDUP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "DROP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "DUP 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "NIP", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "OVER", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 1 1 3", "PICK", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["0", "PICK 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 1 1 3", "ROLL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["0", "ROLL 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 1", "ROT", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "SWAP", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "TUCK", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["NOP", "SIZE 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["1", "EQUAL 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "EQUALVERIFY 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["NOP", "1ADD 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "1SUB 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "NEGATE 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "ABS 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "NOT 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "0NOTEQUAL 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["1", "ADD", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "SUB", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "BOOLAND", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "BOOLOR", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "NUMEQUAL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "NUMEQUALVERIFY 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "NUMNOTEQUAL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "LESSTHAN", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "GREATERTHAN", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "LESSTHANOREQUAL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "GREATERTHANOREQUAL", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "MIN", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1", "MAX", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["1 1", "WITHIN", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["NOP", "RIPEMD160 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "SHA1 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "SHA256 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "HASH160 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+["NOP", "HASH256 1", "P2SH,STRICTENC", "INVALID_STACK_OPERATION"],
+
+["Increase CHECKSIG and CHECKMULTISIG negative test coverage"],
+["", "CHECKSIG NOT", "STRICTENC", "INVALID_STACK_OPERATION", "CHECKSIG must error when there are no stack items"],
+["0", "CHECKSIG NOT", "STRICTENC", "INVALID_STACK_OPERATION", "CHECKSIG must error when there are not 2 stack items"],
+["", "CHECKMULTISIG NOT", "STRICTENC", "INVALID_STACK_OPERATION", "CHECKMULTISIG must error when there are no stack items"],
+["", "-1 CHECKMULTISIG NOT", "STRICTENC", "PUBKEY_COUNT", "CHECKMULTISIG must error when the specified number of pubkeys is negative"],
+["", "1 CHECKMULTISIG NOT", "STRICTENC", "INVALID_STACK_OPERATION", "CHECKMULTISIG must error when there are not enough pubkeys on the stack"],
+["", "-1 0 CHECKMULTISIG NOT", "STRICTENC", "SIG_COUNT", "CHECKMULTISIG must error when the specified number of signatures is negative"],
+["", "1 'pk1' 1 CHECKMULTISIG NOT", "STRICTENC", "INVALID_STACK_OPERATION", "CHECKMULTISIG must error when there are not enough signatures on the stack"],
+["", "'dummy' 'sig1' 1 'pk1' 1 CHECKMULTISIG IF 1 ENDIF", "", "EVAL_FALSE", "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",
+"OP_COUNT",
+"202 CHECKMULTISIGS, fails due to 201 op limit"],
+
+["1",
+"0 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY",
+"P2SH,STRICTENC",
+"INVALID_STACK_OPERATION",
+""],
+
+["",
+"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG",
+"P2SH,STRICTENC",
+"OP_COUNT",
+"Fails due to 201 script operation limit"],
+
+["1",
+"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY",
+"P2SH,STRICTENC",
+"OP_COUNT",
+""],
+
+
+["0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21", "21 CHECKMULTISIG 1", "P2SH,STRICTENC", "PUBKEY_COUNT", "nPubKeys > 20"],
+["0 'sig' 1 0", "CHECKMULTISIG 1", "P2SH,STRICTENC", "SIG_COUNT", "nSigs > nPubKeys"],
+
+
+["NOP 0x01 1", "HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL", "P2SH,STRICTENC", "SIG_PUSHONLY", "Tests for Script.IsPushOnly()"],
+["NOP1 0x01 1", "HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL", "P2SH,STRICTENC", "SIG_PUSHONLY"],
+
+["0 0x01 0x50", "HASH160 0x14 0xece424a6bb6ddf4db592c0faed60685047a361b1 EQUAL", "P2SH,STRICTENC", "BAD_OPCODE", "OP_RESERVED in P2SH should fail"],
+["0 0x01 VER", "HASH160 0x14 0x0f4d7845db968f2a81b530b6f3c1d6246d4c7e01 EQUAL", "P2SH,STRICTENC", "BAD_OPCODE", "OP_VER in P2SH should fail"],
+
+["0x00", "'00' EQUAL", "P2SH,STRICTENC", "EVAL_FALSE", "Basic OP_0 execution"],
+
+["MINIMALDATA enforcement for PUSHDATAs"],
+
+["0x4c 0x00", "DROP 1", "MINIMALDATA", "MINIMALDATA", "Empty vector minimally represented by OP_0"],
+["0x01 0x81", "DROP 1", "MINIMALDATA", "MINIMALDATA", "-1 minimally represented by OP_1NEGATE"],
+["0x01 0x01", "DROP 1", "MINIMALDATA", "MINIMALDATA", "1 to 16 minimally represented by OP_1 to OP_16"],
+["0x01 0x02", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x03", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x04", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x05", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x06", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x07", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x08", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x09", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x0a", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x0b", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x0c", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x0d", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x0e", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x0f", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+["0x01 0x10", "DROP 1", "MINIMALDATA", "MINIMALDATA"],
+
+["0x4c 0x48 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
+ "MINIMALDATA",
+ "PUSHDATA1 of 72 bytes minimally represented by direct push"],
+
+["0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
+ "MINIMALDATA",
+ "PUSHDATA2 of 255 bytes minimally represented by PUSHDATA1"],
+
+["0x4e 0x00010000 0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
+ "MINIMALDATA",
+ "PUSHDATA4 of 256 bytes minimally represented by PUSHDATA2"],
+
+["MINIMALDATA enforcement for numeric arguments"],
+
+["0x01 0x00", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "numequals 0"],
+["0x02 0x0000", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "numequals 0"],
+["0x01 0x80", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "0x80 (negative zero) numequals 0"],
+["0x02 0x0080", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "numequals 0"],
+["0x02 0x0500", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "numequals 5"],
+["0x03 0x050000", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "numequals 5"],
+["0x02 0x0580", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "numequals -5"],
+["0x03 0x050080", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "numequals -5"],
+["0x03 0xff7f80", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "Minimal encoding is 0xffff"],
+["0x03 0xff7f00", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "Minimal encoding is 0xff7f"],
+["0x04 0xffff7f80", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "Minimal encoding is 0xffffff"],
+["0x04 0xffff7f00", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR", "Minimal encoding is 0xffff7f"],
+
+["Test every numeric-accepting opcode for correct handling of the numeric minimal encoding rule"],
+
+["1 0x02 0x0000", "PICK DROP", "MINIMALDATA", "UNKNOWN_ERROR"],
+["1 0x02 0x0000", "ROLL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000", "1ADD DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000", "1SUB DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000", "NEGATE DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000", "ABS DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000", "NOT DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000", "0NOTEQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+
+["0 0x02 0x0000", "ADD DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "ADD DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "SUB DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "SUB DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "BOOLAND DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "BOOLAND DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "BOOLOR DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "BOOLOR DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "NUMEQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 1", "NUMEQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "NUMEQUALVERIFY 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "NUMEQUALVERIFY 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "NUMNOTEQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "NUMNOTEQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "LESSTHAN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "LESSTHAN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "GREATERTHAN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "GREATERTHAN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "LESSTHANOREQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "LESSTHANOREQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "GREATERTHANOREQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "GREATERTHANOREQUAL DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "MIN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "MIN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000", "MAX DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0x02 0x0000 0", "MAX DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+
+["0x02 0x0000 0 0", "WITHIN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000 0", "WITHIN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0 0x02 0x0000", "WITHIN DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+
+["0 0 0x02 0x0000", "CHECKMULTISIG DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000 0", "CHECKMULTISIG DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000 0 1", "CHECKMULTISIG DROP 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0 0x02 0x0000", "CHECKMULTISIGVERIFY 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+["0 0x02 0x0000 0", "CHECKMULTISIGVERIFY 1", "MINIMALDATA", "UNKNOWN_ERROR"],
+
+
+["Order of CHECKMULTISIG evaluation tests, inverted by swapping the order of"],
+["pubkeys/signatures so they fail due to the STRICTENC rules on validly encoded"],
+["signatures and pubkeys."],
+[
+ "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
+ "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0 2 CHECKMULTISIG NOT",
+ "STRICTENC",
+ "PUBKEYTYPE",
+ "2-of-2 CHECKMULTISIG NOT with the first pubkey invalid, and both signatures validly encoded."
+],
+[
+ "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 1",
+ "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
+ "STRICTENC",
+ "SIG_DER",
+ "2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but first signature invalid."
+],
+[
+ "0 0x47 0x304402205451ce65ad844dbb978b8bdedf5082e33b43cae8279c30f2c74d9e9ee49a94f802203fe95a7ccf74da7a232ee523ef4a53cb4d14bdd16289680cdb97a63819b8f42f01 0x46 0x304402205451ce65ad844dbb978b8bdedf5082e33b43cae8279c30f2c74d9e9ee49a94f802203fe95a7ccf74da7a232ee523ef4a53cb4d14bdd16289680cdb97a63819b8f42f",
+ "2 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 3 CHECKMULTISIG",
+ "P2SH,STRICTENC",
+ "SIG_DER",
+ "2-of-3 with one valid and one invalid signature due to parse error, nSigs > validSigs"
+],
+
+["Increase DERSIG test coverage"],
+["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "SIG_DER", "Overly long signature is incorrectly encoded for DERSIG"],
+["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "SIG_DER", "Missing S is incorrectly encoded for DERSIG"],
+["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "SIG_DER", "S with invalid S length is incorrectly encoded for DERSIG"],
+["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "SIG_DER", "Non-integer R is incorrectly encoded for DERSIG"],
+["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "SIG_DER", "Non-integer S is incorrectly encoded for DERSIG"],
+["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "SIG_DER", "Zero-length R is incorrectly encoded for DERSIG"],
+["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "DERSIG", "SIG_DER", "Zero-length S is incorrectly encoded for DERSIG"],
+["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "SIG_DER", "Negative S is incorrectly encoded for DERSIG"],
+
+["Some basic segwit checks"],
+[["00", 0.00000000 ], "", "0 0x206e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d", "P2SH,WITNESS", "EVAL_FALSE", "Invalid witness script"],
+[["51", 0.00000000 ], "", "0 0x206e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d", "P2SH,WITNESS", "WITNESS_PROGRAM_MISMATCH", "Witness script hash mismatch"],
+[["00", 0.00000000 ], "", "0 0x206e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d", "", "OK", "Invalid witness script without WITNESS"],
+[["51", 0.00000000 ], "", "0 0x206e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d", "", "OK", "Witness script hash mismatch without WITNESS"],
+
+["Automatically generated test cases"],
+[
+ "0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
+ "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
+ "",
+ "OK",
+ "P2PK"
+],
+[
+ "0x47 0x304402200a5c6163f07b8c3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
+ "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
+ "",
+ "EVAL_FALSE",
+ "P2PK, bad sig"
+],
+[
+ "0x47 0x304402206e05a6fe23c59196ffe176c9ddc31e73a9885638f9d1328d47c0c703863b8876022076feb53811aa5b04e0e79f938eb19906cc5e67548bc555a8e8b8b0fc603d840c01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
+ "DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG",
+ "",
+ "OK",
+ "P2PKH"
+],
+[
+ "0x47 0x3044022034bb0494b50b8ef130e2185bb220265b9284ef5b4b8a8da4d8415df489c83b5102206259a26d9cc0a125ac26af6153b17c02956855ebe1467412f066e402f5f05d1201 0x21 0x03363d90d446b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
+ "DUP HASH160 0x14 0xc0834c0c158f53be706d234c38fd52de7eece656 EQUALVERIFY CHECKSIG",
+ "",
+ "EQUALVERIFY",
+ "P2PKH, bad pubkey"
+],
+[
+ "0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790281",
+ "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
+ "",
+ "OK",
+ "P2PK anyonecanpay"
+],
+[
+ "0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790201",
+ "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
+ "",
+ "EVAL_FALSE",
+ "P2PK anyonecanpay marked with normal hashtype"
+],
+[
+ "0x47 0x3044022003fef42ed6c7be8917441218f525a60e2431be978e28b7aca4d7a532cc413ae8022067a1f82c74e8d69291b90d148778405c6257bbcfc2353cc38a3e1f22bf44254601 0x23 0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
+ "HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
+ "P2SH",
+ "OK",
+ "P2SH(P2PK)"
+],
+[
+ "0x47 0x3044022003fef42ed6c7be8917441218f525a60e2431be978e28b7aca4d7a532cc413ae8022067a1f82c74e8d69291b90d148778405c6257bbcfc2353cc38a3e1f22bf44254601 0x23 0x210279be667ef9dcbbac54a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
+ "HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
+ "P2SH",
+ "EVAL_FALSE",
+ "P2SH(P2PK), bad redeemscript"
+],
+[
+ "0x47 0x30440220781ba4f59a7b207a10db87628bc2168df4d59b844b397d2dbc9a5835fb2f2b7602206ed8fbcc1072fe2dfc5bb25909269e5dc42ffcae7ec2bc81d59692210ff30c2b01 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x19 0x76a91491b24bf9f5288532960ac687abb035127b1d28a588ac",
+ "HASH160 0x14 0x7f67f0521934a57d3039f77f9f32cf313f3ac74b EQUAL",
+ "P2SH",
+ "OK",
+ "P2SH(P2PKH)"
+],
+[
+ "0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
+ "HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
+ "",
+ "OK",
+ "P2SH(P2PKH), bad sig but no VERIFY_P2SH"
+],
+[
+ "0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
+ "HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
+ "P2SH",
+ "EQUALVERIFY",
+ "P2SH(P2PKH), bad sig"
+],
+[
+ "0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
+ "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
+ "",
+ "OK",
+ "3-of-3"
+],
+[
+ "0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0",
+ "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
+ "",
+ "EVAL_FALSE",
+ "3-of-3, 2 sigs"
+],
+[
+ "0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0x47 0x30440220563e5b3b1fc11662a84bc5ea2a32cc3819703254060ba30d639a1aaf2d5068ad0220601c1f47ddc76d93284dd9ed68f7c9974c4a0ea7cbe8a247d6bc3878567a5fca01 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
+ "HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
+ "P2SH",
+ "OK",
+ "P2SH(2-of-3)"
+],
+[
+ "0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
+ "HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
+ "P2SH",
+ "EVAL_FALSE",
+ "P2SH(2-of-3), 1 sig"
+],
+[
+ "0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "",
+ "OK",
+ "P2PK with too much R padding but no DERSIG"
+],
+[
+ "0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "DERSIG",
+ "SIG_DER",
+ "P2PK with too much R padding"
+],
+[
+ "0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "",
+ "OK",
+ "P2PK with too much S padding but no DERSIG"
+],
+[
+ "0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "DERSIG",
+ "SIG_DER",
+ "P2PK with too much S padding"
+],
+[
+ "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "",
+ "OK",
+ "P2PK with too little R padding but no DERSIG"
+],
+[
+ "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "DERSIG",
+ "SIG_DER",
+ "P2PK with too little R padding"
+],
+[
+ "0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
+ "",
+ "OK",
+ "P2PK NOT with bad sig with too much R padding but no DERSIG"
+],
+[
+ "0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
+ "DERSIG",
+ "SIG_DER",
+ "P2PK NOT with bad sig with too much R padding"
+],
+[
+ "0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
+ "",
+ "EVAL_FALSE",
+ "P2PK NOT with too much R padding but no DERSIG"
+],
+[
+ "0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
+ "DERSIG",
+ "SIG_DER",
+ "P2PK NOT with too much R padding"
+],
+[
+ "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "",
+ "OK",
+ "BIP66 example 1, without DERSIG"
+],
+[
+ "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "DERSIG",
+ "SIG_DER",
+ "BIP66 example 1, with DERSIG"
+],
+[
+ "0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "",
+ "EVAL_FALSE",
+ "BIP66 example 2, without DERSIG"
+],
+[
+ "0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "DERSIG",
+ "SIG_DER",
+ "BIP66 example 2, with DERSIG"
+],
+[
+ "0",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "",
+ "EVAL_FALSE",
+ "BIP66 example 3, without DERSIG"
+],
+[
+ "0",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "DERSIG",
+ "EVAL_FALSE",
+ "BIP66 example 3, with DERSIG"
+],
+[
+ "0",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "",
+ "OK",
+ "BIP66 example 4, without DERSIG"
+],
+[
+ "0",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "DERSIG",
+ "OK",
+ "BIP66 example 4, with DERSIG"
+],
+[
+ "0x09 0x300602010102010101",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "DERSIG",
+ "OK",
+ "BIP66 example 4, with DERSIG, non-null DER-compliant signature"
+],
+[
+ "0",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "DERSIG,NULLFAIL",
+ "OK",
+ "BIP66 example 4, with DERSIG and NULLFAIL"
+],
+[
+ "0x09 0x300602010102010101",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "DERSIG,NULLFAIL",
+ "NULLFAIL",
+ "BIP66 example 4, with DERSIG and NULLFAIL, non-null DER-compliant signature"
+],
+[
+ "1",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "",
+ "EVAL_FALSE",
+ "BIP66 example 5, without DERSIG"
+],
+[
+ "1",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
+ "DERSIG",
+ "SIG_DER",
+ "BIP66 example 5, with DERSIG"
+],
+[
+ "1",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "",
+ "OK",
+ "BIP66 example 6, without DERSIG"
+],
+[
+ "1",
+ "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
+ "DERSIG",
+ "SIG_DER",
+ "BIP66 example 6, with DERSIG"
+],
+[
+ "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
+ "",
+ "OK",
+ "BIP66 example 7, without DERSIG"
+],
+[
+ "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
+ "DERSIG",
+ "SIG_DER",
+ "BIP66 example 7, with DERSIG"
+],
+[
+ "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
+ "",
+ "EVAL_FALSE",
+ "BIP66 example 8, without DERSIG"
+],
+[
+ "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
+ "DERSIG",
+ "SIG_DER",
+ "BIP66 example 8, with DERSIG"
+],
+[
+ "0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
+ "",
+ "EVAL_FALSE",
+ "BIP66 example 9, without DERSIG"
+],
+[
+ "0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
+ "DERSIG",
+ "SIG_DER",
+ "BIP66 example 9, with DERSIG"
+],
+[
+ "0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
+ "",
+ "OK",
+ "BIP66 example 10, without DERSIG"
+],
+[
+ "0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
+ "DERSIG",
+ "SIG_DER",
+ "BIP66 example 10, with DERSIG"
+],
+[
+ "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
+ "",
+ "EVAL_FALSE",
+ "BIP66 example 11, without DERSIG"
+],
+[
+ "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
+ "DERSIG",
+ "EVAL_FALSE",
+ "BIP66 example 11, with DERSIG"
+],
+[
+ "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
+ "",
+ "OK",
+ "BIP66 example 12, without DERSIG"
+],
+[
+ "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
+ "DERSIG",
+ "OK",
+ "BIP66 example 12, with DERSIG"
+],
+[
+ "0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
+ "",
+ "OK",
+ "P2PK with multi-byte hashtype, without DERSIG"
+],
+[
+ "0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
+ "DERSIG",
+ "SIG_DER",
+ "P2PK with multi-byte hashtype, with DERSIG"
+],
+[
+ "0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
+ "",
+ "OK",
+ "P2PK with high S but no LOW_S"
+],
+[
+ "0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
+ "LOW_S",
+ "SIG_HIGH_S",
+ "P2PK with high S"
+],
+[
+ "0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01",
+ "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
+ "",
+ "OK",
+ "P2PK with hybrid pubkey but no STRICTENC"
+],
+[
+ "0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01",
+ "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
+ "STRICTENC",
+ "PUBKEYTYPE",
+ "P2PK with hybrid pubkey"
+],
+[
+ "0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
+ "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
+ "",
+ "EVAL_FALSE",
+ "P2PK NOT with hybrid pubkey but no STRICTENC"
+],
+[
+ "0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
+ "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
+ "STRICTENC",
+ "PUBKEYTYPE",
+ "P2PK NOT with hybrid pubkey"
+],
+[
+ "0x47 0x30440220035d554e3153c04950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
+ "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
+ "",
+ "OK",
+ "P2PK NOT with invalid hybrid pubkey but no STRICTENC"
+],
+[
+ "0x47 0x30440220035d554e3153c04950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
+ "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
+ "STRICTENC",
+ "PUBKEYTYPE",
+ "P2PK NOT with invalid hybrid pubkey"
+],
+[
+ "0 0x47 0x304402202e79441ad1baf5a07fb86bae3753184f6717d9692680947ea8b6e8b777c69af1022079a262e13d868bb5a0964fefe3ba26942e1b0669af1afb55ef3344bc9d4fc4c401",
+ "1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
+ "",
+ "OK",
+ "1-of-2 with the second 1 hybrid pubkey and no STRICTENC"
+],
+[
+ "0 0x47 0x304402202e79441ad1baf5a07fb86bae3753184f6717d9692680947ea8b6e8b777c69af1022079a262e13d868bb5a0964fefe3ba26942e1b0669af1afb55ef3344bc9d4fc4c401",
+ "1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
+ "STRICTENC",
+ "OK",
+ "1-of-2 with the second 1 hybrid pubkey"
+],
+[
+ "0 0x47 0x3044022079c7824d6c868e0e1a273484e28c2654a27d043c8a27f49f52cb72efed0759090220452bbbf7089574fa082095a4fc1b3a16bafcf97a3a34d745fafc922cce66b27201",
+ "1 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 2 CHECKMULTISIG",
+ "STRICTENC",
+ "PUBKEYTYPE",
+ "1-of-2 with the first 1 hybrid pubkey"
+],
+[
+ "0x47 0x304402206177d513ec2cda444c021a1f4f656fc4c72ba108ae063e157eb86dc3575784940220666fc66702815d0e5413bb9b1df22aed44f5f1efb8b99d41dd5dc9a5be6d205205",
+ "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
+ "",
+ "OK",
+ "P2PK with undefined hashtype but no STRICTENC"
+],
+[
+ "0x47 0x304402206177d513ec2cda444c021a1f4f656fc4c72ba108ae063e157eb86dc3575784940220666fc66702815d0e5413bb9b1df22aed44f5f1efb8b99d41dd5dc9a5be6d205205",
+ "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
+ "STRICTENC",
+ "SIG_HASHTYPE",
+ "P2PK with undefined hashtype"
+],
+[
+ "0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05",
+ "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
+ "",
+ "OK",
+ "P2PK NOT with invalid sig and undefined hashtype but no STRICTENC"
+],
+[
+ "0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05",
+ "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
+ "STRICTENC",
+ "SIG_HASHTYPE",
+ "P2PK NOT with invalid sig and undefined hashtype"
+],
+[
+ "1 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
+ "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
+ "",
+ "OK",
+ "3-of-3 with nonzero dummy but no NULLDUMMY"
+],
+[
+ "1 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
+ "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
+ "NULLDUMMY",
+ "SIG_NULLDUMMY",
+ "3-of-3 with nonzero dummy"
+],
+[
+ "1 0x47 0x304402201bb2edab700a5d020236df174fefed78087697143731f659bea59642c759c16d022061f42cdbae5bcd3e8790f20bf76687443436e94a634321c16a72aa54cbc7c2ea01 0x47 0x304402204bb4a64f2a6e5c7fb2f07fef85ee56fde5e6da234c6a984262307a20e99842d702206f8303aaba5e625d223897e2ffd3f88ef1bcffef55f38dc3768e5f2e94c923f901 0x47 0x3044022040c2809b71fffb155ec8b82fe7a27f666bd97f941207be4e14ade85a1249dd4d02204d56c85ec525dd18e29a0533d5ddf61b6b1bb32980c2f63edf951aebf7a27bfe01",
+ "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT",
+ "",
+ "OK",
+ "3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY"
+],
+[
+ "1 0x47 0x304402201bb2edab700a5d020236df174fefed78087697143731f659bea59642c759c16d022061f42cdbae5bcd3e8790f20bf76687443436e94a634321c16a72aa54cbc7c2ea01 0x47 0x304402204bb4a64f2a6e5c7fb2f07fef85ee56fde5e6da234c6a984262307a20e99842d702206f8303aaba5e625d223897e2ffd3f88ef1bcffef55f38dc3768e5f2e94c923f901 0x47 0x3044022040c2809b71fffb155ec8b82fe7a27f666bd97f941207be4e14ade85a1249dd4d02204d56c85ec525dd18e29a0533d5ddf61b6b1bb32980c2f63edf951aebf7a27bfe01",
+ "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT",
+ "NULLDUMMY",
+ "SIG_NULLDUMMY",
+ "3-of-3 NOT with invalid sig with nonzero dummy"
+],
+[
+ "0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 DUP",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
+ "",
+ "OK",
+ "2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY"
+],
+[
+ "0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 DUP",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
+ "SIGPUSHONLY",
+ "SIG_PUSHONLY",
+ "2-of-2 with two identical keys and sigs pushed using OP_DUP"
+],
+[
+ "0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
+ "HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL",
+ "",
+ "OK",
+ "P2SH(P2PK) with non-push scriptSig but no P2SH or SIGPUSHONLY"
+],
+[
+ "0x47 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb125101 NOP8",
+ "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
+ "",
+ "OK",
+ "P2PK with non-push scriptSig but with P2SH validation"
+],
+[
+ "0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
+ "HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL",
+ "P2SH",
+ "SIG_PUSHONLY",
+ "P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY"
+],
+[
+ "0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
+ "HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL",
+ "SIGPUSHONLY",
+ "SIG_PUSHONLY",
+ "P2SH(P2PK) with non-push scriptSig but not P2SH"
+],
+[
+ "0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901",
+ "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
+ "SIGPUSHONLY",
+ "OK",
+ "2-of-2 with two identical keys and sigs pushed"
+],
+[
+ "11 0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
+ "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
+ "P2SH",
+ "OK",
+ "P2PK with unnecessary input but no CLEANSTACK"
+],
+[
+ "11 0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
+ "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
+ "CLEANSTACK,P2SH",
+ "CLEANSTACK",
+ "P2PK with unnecessary input"
+],
+[
+ "11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
+ "P2SH",
+ "OK",
+ "P2SH with unnecessary input but no CLEANSTACK"
+],
+[
+ "11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
+ "CLEANSTACK,P2SH",
+ "CLEANSTACK",
+ "P2SH with unnecessary input"
+],
+[
+ "0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
+ "CLEANSTACK,P2SH",
+ "OK",
+ "P2SH with CLEANSTACK"
+],
+
+["Testing with uncompressed keys in witness v0 without WITNESS_PUBKEYTYPE"],
+[
+ [
+ "304402200d461c140cfdfcf36b94961db57ae8c18d1cb80e9d95a9e47ac22470c1bf125502201c8dc1cbfef6a3ef90acbbb992ca22fe9466ee6f9d4898eda277a7ac3ab4b25101",
+ "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
+ "P2SH,WITNESS",
+ "OK",
+ "Basic P2WSH"
+],
+[
+ [
+ "304402201e7216e5ccb3b61d46946ec6cc7e8c4e0117d13ac2fd4b152197e4805191c74202203e9903e33e84d9ee1dd13fb057afb7ccfb47006c23f6a067185efbc9dd780fc501",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000001
+ ],
+ "",
+ "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
+ "P2SH,WITNESS",
+ "OK",
+ "Basic P2WPKH"
+],
+[
+ [
+ "3044022066e02c19a513049d49349cf5311a1b012b7c4fae023795a18ab1d91c23496c22022025e216342c8e07ce8ef51e8daee88f84306a9de66236cab230bb63067ded1ad301",
+ "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ 0.00000001
+ ],
+ "0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
+ "HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL",
+ "P2SH,WITNESS",
+ "OK",
+ "Basic P2SH(P2WSH)"
+],
+[
+ [
+ "304402200929d11561cd958460371200f82e9cae64c727a495715a31828e27a7ad57b36d0220361732ced04a6f97351ecca21a56d0b8cd4932c1da1f8f569a2b68e5e48aed7801",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000001
+ ],
+ "0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5",
+ "HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL",
+ "P2SH,WITNESS",
+ "OK",
+ "Basic P2SH(P2WPKH)"
+],
+[
+ [
+ "304402202589f0512cb2408fb08ed9bd24f85eb3059744d9e4f2262d0b7f1338cff6e8b902206c0978f449693e0578c71bc543b11079fd0baae700ee5e9a6bee94db490af9fc01",
+ "41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac",
+ 0.00000000
+ ],
+ "",
+ "0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
+ "P2SH,WITNESS",
+ "EVAL_FALSE",
+ "Basic P2WSH with the wrong key"
+],
+[
+ [
+ "304402206ef7fdb2986325d37c6eb1a8bb24aeb46dede112ed8fc76c7d7500b9b83c0d3d02201edc2322c794fe2d6b0bd73ed319e714aa9b86d8891961530d5c9b7156b60d4e01",
+ "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf",
+ 0.00000000
+ ],
+ "",
+ "0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b",
+ "P2SH,WITNESS",
+ "EVAL_FALSE",
+ "Basic P2WPKH with the wrong key"
+],
+[
+ [
+ "30440220069ea3581afaf8187f63feee1fd2bd1f9c0dc71ea7d6e8a8b07ee2ebcf824bf402201a4fdef4c532eae59223be1eda6a397fc835142d4ddc6c74f4aa85b766a5c16f01",
+ "41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac",
+ 0.00000000
+ ],
+ "0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
+ "HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL",
+ "P2SH,WITNESS",
+ "EVAL_FALSE",
+ "Basic P2SH(P2WSH) with the wrong key"
+],
+[
+ [
+ "304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001",
+ "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf",
+ 0.00000000
+ ],
+ "0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b",
+ "HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL",
+ "P2SH,WITNESS",
+ "EVAL_FALSE",
+ "Basic P2SH(P2WPKH) with the wrong key"
+],
+[
+ [
+ "304402202589f0512cb2408fb08ed9bd24f85eb3059744d9e4f2262d0b7f1338cff6e8b902206c0978f449693e0578c71bc543b11079fd0baae700ee5e9a6bee94db490af9fc01",
+ "41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac",
+ 0.00000000
+ ],
+ "",
+ "0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
+ "P2SH",
+ "OK",
+ "Basic P2WSH with the wrong key but no WITNESS"
+],
+[
+ [
+ "304402206ef7fdb2986325d37c6eb1a8bb24aeb46dede112ed8fc76c7d7500b9b83c0d3d02201edc2322c794fe2d6b0bd73ed319e714aa9b86d8891961530d5c9b7156b60d4e01",
+ "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf",
+ 0.00000000
+ ],
+ "",
+ "0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b",
+ "P2SH",
+ "OK",
+ "Basic P2WPKH with the wrong key but no WITNESS"
+],
+[
+ [
+ "30440220069ea3581afaf8187f63feee1fd2bd1f9c0dc71ea7d6e8a8b07ee2ebcf824bf402201a4fdef4c532eae59223be1eda6a397fc835142d4ddc6c74f4aa85b766a5c16f01",
+ "41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac",
+ 0.00000000
+ ],
+ "0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610",
+ "HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL",
+ "P2SH",
+ "OK",
+ "Basic P2SH(P2WSH) with the wrong key but no WITNESS"
+],
+[
+ [
+ "304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001",
+ "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf",
+ 0.00000000
+ ],
+ "0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b",
+ "HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL",
+ "P2SH",
+ "OK",
+ "Basic P2SH(P2WPKH) with the wrong key but no WITNESS"
+],
+[
+ [
+ "3044022066faa86e74e8b30e82691b985b373de4f9e26dc144ec399c4f066aa59308e7c202204712b86f28c32503faa051dbeabff2c238ece861abc36c5e0b40b1139ca222f001",
+ "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ 0.00000000
+ ],
+ "",
+ "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
+ "P2SH,WITNESS",
+ "EVAL_FALSE",
+ "Basic P2WSH with wrong value"
+],
+[
+ [
+ "304402203b3389b87448d7dfdb5e82fb854fcf92d7925f9938ea5444e36abef02c3d6a9602202410bc3265049abb07fd2e252c65ab7034d95c9d5acccabe9fadbdc63a52712601",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000000
+ ],
+ "",
+ "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
+ "P2SH,WITNESS",
+ "EVAL_FALSE",
+ "Basic P2WPKH with wrong value"
+],
+[
+ [
+ "3044022000a30c4cfc10e4387be528613575434826ad3c15587475e0df8ce3b1746aa210022008149265e4f8e9dafe1f3ea50d90cb425e9e40ea7ebdd383069a7cfa2b77004701",
+ "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ 0.00000000
+ ],
+ "0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
+ "HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL",
+ "P2SH,WITNESS",
+ "EVAL_FALSE",
+ "Basic P2SH(P2WSH) with wrong value"
+],
+[
+ [
+ "304402204fc3a2cd61a47913f2a5f9107d0ad4a504c7b31ee2d6b3b2f38c2b10ee031e940220055d58b7c3c281aaa381d8f486ac0f3e361939acfd568046cb6a311cdfa974cf01",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000000
+ ],
+ "0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5",
+ "HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL",
+ "P2SH,WITNESS",
+ "EVAL_FALSE",
+ "Basic P2SH(P2WPKH) with wrong value"
+],
+[
+ [
+ "304402205ae57ae0534c05ca9981c8a6cdf353b505eaacb7375f96681a2d1a4ba6f02f84022056248e68643b7d8ce7c7d128c9f1f348bcab8be15d094ad5cadd24251a28df8001",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000000
+ ],
+ "",
+ "1 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
+ "DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,P2SH,WITNESS",
+ "DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM",
+ "P2WPKH with future witness version"
+],
+[
+ [
+ "3044022064100ca0e2a33332136775a86cd83d0230e58b9aebb889c5ac952abff79a46ef02205f1bf900e022039ad3091bdaf27ac2aef3eae9ed9f190d821d3e508405b9513101",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000000
+ ],
+ "",
+ "0 0x1f 0xb34b78da162751647974d5cb7410aa428ad339dbf7d1e16e833f68a0cbf1c3",
+ "P2SH,WITNESS",
+ "WITNESS_PROGRAM_WRONG_LENGTH",
+ "P2WPKH with wrong witness program length"
+],
+[
+ "",
+ "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
+ "P2SH,WITNESS",
+ "WITNESS_PROGRAM_WITNESS_EMPTY",
+ "P2WSH with empty witness"
+],
+[
+ [
+ "3044022039105b995a5f448639a997a5c90fda06f50b49df30c3bdb6663217bf79323db002206fecd54269dec569fcc517178880eb58bb40f381a282bb75766ff3637d5f4b4301",
+ "400479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ 0.00000000
+ ],
+ "",
+ "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
+ "P2SH,WITNESS",
+ "WITNESS_PROGRAM_MISMATCH",
+ "P2WSH with witness program mismatch"
+],
+[
+ [
+ "304402201a96950593cb0af32d080b0f193517f4559241a8ebd1e95e414533ad64a3f423022047f4f6d3095c23235bdff3aeff480d0529c027a3f093cb265b7cbf148553b85101",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ "",
+ 0.00000000
+ ],
+ "",
+ "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
+ "P2SH,WITNESS",
+ "WITNESS_PROGRAM_MISMATCH",
+ "P2WPKH with witness program mismatch"
+],
+[
+ [
+ "304402201a96950593cb0af32d080b0f193517f4559241a8ebd1e95e414533ad64a3f423022047f4f6d3095c23235bdff3aeff480d0529c027a3f093cb265b7cbf148553b85101",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000000
+ ],
+ "11",
+ "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
+ "P2SH,WITNESS",
+ "WITNESS_MALLEATED",
+ "P2WPKH with non-empty scriptSig"
+],
+[
+ [
+ "304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001",
+ "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf",
+ 0.00000000
+ ],
+ "11 0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b",
+ "HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL",
+ "P2SH,WITNESS",
+ "WITNESS_MALLEATED_P2SH",
+ "P2SH(P2WPKH) with superfluous push in scriptSig"
+],
+[
+ [
+ "",
+ 0.00000000
+ ],
+ "0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
+ "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
+ "P2SH,WITNESS",
+ "WITNESS_UNEXPECTED",
+ "P2PK with witness"
+],
+
+["Testing with compressed keys in witness v0 with WITNESS_PUBKEYTYPE"],
+[
+ [
+ "304402204256146fcf8e73b0fd817ffa2a4e408ff0418ff987dd08a4f485b62546f6c43c02203f3c8c3e2febc051e1222867f5f9d0eaf039d6792911c10940aa3cc74123378e01",
+ "210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x1863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "Basic P2WSH with compressed key"
+],
+[
+ [
+ "304402204edf27486f11432466b744df533e1acac727e0c83e5f912eb289a3df5bf8035f022075809fdd876ede40ad21667eba8b7e96394938f9c9c50f11b6a1280cce2cea8601",
+ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+ 0.00000001
+ ],
+ "",
+ "0 0x14 0x751e76e8199196d454941c45d1b3a323f1433bd6",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "Basic P2WPKH with compressed key"
+],
+[
+ [
+ "304402203a549090cc46bce1e5e95c4922ea2c12747988e0207b04c42f81cdbe87bb1539022050f57a245b875fd5119c419aaf050bcdf41384f0765f04b809e5bced1fe7093d01",
+ "210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
+ 0.00000001
+ ],
+ "0x22 0x00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
+ "HASH160 0x14 0xe4300531190587e3880d4c3004f5355d88ff928d EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "Basic P2SH(P2WSH) with compressed key"
+],
+[
+ [
+ "304402201bc0d53046827f4a35a3166e33e3b3366c4085540dc383b95d21ed2ab11e368a0220333e78c6231214f5f8e59621e15d7eeab0d4e4d0796437e00bfbd2680c5f9c1701",
+ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+ 0.00000001
+ ],
+ "0x16 0x0014751e76e8199196d454941c45d1b3a323f1433bd6",
+ "HASH160 0x14 0xbcfeb728b584253d5f3f70bcb780e9ef218a68f4 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "Basic P2SH(P2WPKH) with compressed key"
+],
+
+["Testing with uncompressed keys in witness v0 with WITNESS_PUBKEYTYPE"],
+[
+ [
+ "304402200d461c140cfdfcf36b94961db57ae8c18d1cb80e9d95a9e47ac22470c1bf125502201c8dc1cbfef6a3ef90acbbb992ca22fe9466ee6f9d4898eda277a7ac3ab4b25101",
+ "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "Basic P2WSH"
+],
+[
+ [
+ "304402201e7216e5ccb3b61d46946ec6cc7e8c4e0117d13ac2fd4b152197e4805191c74202203e9903e33e84d9ee1dd13fb057afb7ccfb47006c23f6a067185efbc9dd780fc501",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000001
+ ],
+ "",
+ "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "Basic P2WPKH"
+],
+[
+ [
+ "3044022066e02c19a513049d49349cf5311a1b012b7c4fae023795a18ab1d91c23496c22022025e216342c8e07ce8ef51e8daee88f84306a9de66236cab230bb63067ded1ad301",
+ "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
+ 0.00000001
+ ],
+ "0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
+ "HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "Basic P2SH(P2WSH)"
+],
+[
+ [
+ "304402200929d11561cd958460371200f82e9cae64c727a495715a31828e27a7ad57b36d0220361732ced04a6f97351ecca21a56d0b8cd4932c1da1f8f569a2b68e5e48aed7801",
+ "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ 0.00000001
+ ],
+ "0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5",
+ "HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "Basic P2SH(P2WPKH)"
+],
+
+["Testing P2WSH multisig with compressed keys"],
+[
+ [
+ "",
+ "304402207eb8a59b5c65fc3f6aeef77066556ed5c541948a53a3ba7f7c375b8eed76ee7502201e036a7a9a98ff919ff94dc905d67a1ec006f79ef7cff0708485c8bb79dce38e01",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x06c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "P2WSH CHECKMULTISIG with compressed keys"
+],
+[
+ [
+ "",
+ "3044022033706aed33b8155d5486df3b9bca8cdd3bd4bdb5436dce46d72cdaba51d22b4002203626e94fe53a178af46624f17315c6931f20a30b103f5e044e1eda0c3fe185c601",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "0x22 0x002006c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460",
+ "HASH160 0x14 0x26282aad7c29369d15fed062a778b6100d31a340 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "P2SH(P2WSH) CHECKMULTISIG with compressed keys"
+],
+[
+ [
+ "",
+ "304402204048b7371ab1c544362efb89af0c80154747d665aa4fcfb2edfd2d161e57b42e02207e043748e96637080ffc3acbd4dcc6fee1e58d30f6d1269535f32188e5ddae7301",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x06c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "P2WSH CHECKMULTISIG with compressed keys"
+],
+[
+ [
+ "",
+ "3044022073902ef0b8a554c36c44cc03c1b64df96ce2914ebcf946f5bb36078fd5245cdf02205b148f1ba127065fb8c83a5a9576f2dcd111739788ed4bb3ee08b2bd3860c91c01",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "0x22 0x002006c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460",
+ "HASH160 0x14 0x26282aad7c29369d15fed062a778b6100d31a340 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "P2SH(P2WSH) CHECKMULTISIG with compressed keys"
+],
+
+["Testing P2WSH multisig with compressed and uncompressed keys (first key being the key closer to the top of stack)"],
+[
+ [
+ "",
+ "304402202d092ededd1f060609dbf8cb76950634ff42b3e62cf4adb69ab92397b07d742302204ff886f8d0817491a96d1daccdcc820f6feb122ee6230143303100db37dfa79f01",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
+ "P2SH,WITNESS",
+ "OK",
+ "P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key"
+],
+[
+ [
+ "",
+ "304402202dd7e91243f2235481ffb626c3b7baf2c859ae3a5a77fb750ef97b99a8125dc002204960de3d3c3ab9496e218ec57e5240e0e10a6f9546316fe240c216d45116d29301",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
+ 0.00000001
+ ],
+ "0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
+ "HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL",
+ "P2SH,WITNESS",
+ "OK",
+ "P2SH(P2WSH) CHECKMULTISIG first key uncompressed and signing with the first key"
+],
+[
+ [
+ "",
+ "304402202d092ededd1f060609dbf8cb76950634ff42b3e62cf4adb69ab92397b07d742302204ff886f8d0817491a96d1daccdcc820f6feb122ee6230143303100db37dfa79f01",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key"
+],
+[
+ [
+ "",
+ "304402202dd7e91243f2235481ffb626c3b7baf2c859ae3a5a77fb750ef97b99a8125dc002204960de3d3c3ab9496e218ec57e5240e0e10a6f9546316fe240c216d45116d29301",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
+ 0.00000001
+ ],
+ "0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
+ "HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the first key"
+],
+[
+ [
+ "",
+ "304402201e9e6f7deef5b2f21d8223c5189b7d5e82d237c10e97165dd08f547c4e5ce6ed02206796372eb1cc6acb52e13ee2d7f45807780bf96b132cb6697f69434be74b1af901",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
+ "P2SH,WITNESS",
+ "OK",
+ "P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key"
+],
+[
+ [
+ "",
+ "3044022045e667f3f0f3147b95597a24babe9afecea1f649fd23637dfa7ed7e9f3ac18440220295748e81005231135289fe3a88338dabba55afa1bdb4478691337009d82b68d01",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
+ 0.00000001
+ ],
+ "0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
+ "HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL",
+ "P2SH,WITNESS",
+ "OK",
+ "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key"
+],
+[
+ [
+ "",
+ "304402201e9e6f7deef5b2f21d8223c5189b7d5e82d237c10e97165dd08f547c4e5ce6ed02206796372eb1cc6acb52e13ee2d7f45807780bf96b132cb6697f69434be74b1af901",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key"
+],
+[
+ [
+ "",
+ "3044022045e667f3f0f3147b95597a24babe9afecea1f649fd23637dfa7ed7e9f3ac18440220295748e81005231135289fe3a88338dabba55afa1bdb4478691337009d82b68d01",
+ "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
+ 0.00000001
+ ],
+ "0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
+ "HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key"
+],
+[
+ [
+ "",
+ "3044022046f5367a261fd8f8d7de6eb390491344f8ec2501638fb9a1095a0599a21d3f4c02205c1b3b51d20091c5f1020841bbca87b44ebe25405c64e4acf758f2eae8665f8401",
+ "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
+ "P2SH,WITNESS",
+ "OK",
+ "P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key"
+],
+[
+ [
+ "",
+ "3044022053e210e4fb1881e6092fd75c3efc5163105599e246ded661c0ee2b5682cc2d6c02203a26b7ada8682a095b84c6d1b881637000b47d761fc837c4cee33555296d63f101",
+ "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
+ "HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL",
+ "P2SH,WITNESS",
+ "OK",
+ "P2SH(P2WSH) CHECKMULTISIG second key uncompressed and signing with the first key"
+],
+[
+ [
+ "",
+ "3044022046f5367a261fd8f8d7de6eb390491344f8ec2501638fb9a1095a0599a21d3f4c02205c1b3b51d20091c5f1020841bbca87b44ebe25405c64e4acf758f2eae8665f8401",
+ "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used"
+],
+[
+ [
+ "",
+ "3044022053e210e4fb1881e6092fd75c3efc5163105599e246ded661c0ee2b5682cc2d6c02203a26b7ada8682a095b84c6d1b881637000b47d761fc837c4cee33555296d63f101",
+ "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
+ "HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "OK",
+ "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used"
+],
+[
+ [
+ "",
+ "304402206c6d9f5daf85b54af2a93ec38b15ab27f205dbf5c735365ff12451e43613d1f40220736a44be63423ed5ebf53491618b7cc3d8a5093861908da853739c73717938b701",
+ "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
+ "P2SH,WITNESS",
+ "OK",
+ "P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key"
+],
+[
+ [
+ "",
+ "30440220687871bc6144012d75baf585bb26ce13997f7d8c626f4d8825b069c3b2d064470220108936fe1c57327764782253e99090b09c203ec400ed35ce9e026ce2ecf842a001",
+ "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
+ "HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL",
+ "P2SH,WITNESS",
+ "OK",
+ "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key"
+],
+[
+ [
+ "",
+ "304402206c6d9f5daf85b54af2a93ec38b15ab27f205dbf5c735365ff12451e43613d1f40220736a44be63423ed5ebf53491618b7cc3d8a5093861908da853739c73717938b701",
+ "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "",
+ "0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key"
+],
+[
+ [
+ "",
+ "30440220687871bc6144012d75baf585bb26ce13997f7d8c626f4d8825b069c3b2d064470220108936fe1c57327764782253e99090b09c203ec400ed35ce9e026ce2ecf842a001",
+ "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
+ 0.00000001
+ ],
+ "0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
+ "HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL",
+ "P2SH,WITNESS,WITNESS_PUBKEYTYPE",
+ "WITNESS_PUBKEYTYPE",
+ "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key"
+],
+
+["CHECKSEQUENCEVERIFY tests"],
+["", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "INVALID_STACK_OPERATION", "CSV automatically fails on a empty stack"],
+["-1", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "NEGATIVE_LOCKTIME", "CSV automatically fails if stack top is negative"],
+["0x0100", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY,MINIMALDATA", "UNKNOWN_ERROR", "CSV fails if stack top is not minimally encoded"],
+["0", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "UNSATISFIED_LOCKTIME", "CSV fails if stack top bit 1 << 31 is set and the tx version < 2"],
+["4294967296", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "UNSATISFIED_LOCKTIME",
+ "CSV fails if stack top bit 1 << 31 is not set, and tx version < 2"],
+
+["MINIMALIF tests"],
+["MINIMALIF is not applied to non-segwit scripts"],
+["1", "IF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "OK"],
+["2", "IF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "OK"],
+["0x02 0x0100", "IF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "OK"],
+["0", "IF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["0x01 0x00", "IF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["1", "NOTIF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["2", "NOTIF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["0x02 0x0100", "NOTIF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["0", "NOTIF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "OK"],
+["0x01 0x00", "NOTIF 1 ENDIF", "P2SH,WITNESS,MINIMALIF", "OK"],
+["Normal P2SH IF 1 ENDIF"],
+["1 0x03 0x635168", "HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL", "P2SH,WITNESS,MINIMALIF", "OK"],
+["2 0x03 0x635168", "HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL", "P2SH,WITNESS,MINIMALIF", "OK"],
+["0x02 0x0100 0x03 0x635168", "HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL", "P2SH,WITNESS,MINIMALIF", "OK"],
+["0 0x03 0x635168", "HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["0x01 0x00 0x03 0x635168", "HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["0x03 0x635168", "HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL", "P2SH,WITNESS,MINIMALIF", "UNBALANCED_CONDITIONAL"],
+["Normal P2SH NOTIF 1 ENDIF"],
+["1 0x03 0x645168", "HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["2 0x03 0x645168", "HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["0x02 0x0100 0x03 0x645168", "HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+["0 0x03 0x645168", "HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL", "P2SH,WITNESS,MINIMALIF", "OK"],
+["0x01 0x00 0x03 0x645168", "HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL", "P2SH,WITNESS,MINIMALIF", "OK"],
+["0x03 0x645168", "HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL", "P2SH,WITNESS,MINIMALIF", "UNBALANCED_CONDITIONAL"],
+["P2WSH IF 1 ENDIF"],
+[["01", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS", "OK"],
+[["02", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS", "OK"],
+[["0100", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS", "OK"],
+[["", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS", "EVAL_FALSE"],
+[["00", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS", "EVAL_FALSE"],
+[["01", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS,MINIMALIF", "OK"],
+[["02", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["0100", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+[["00", "635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS", "UNBALANCED_CONDITIONAL"],
+[["635168", 0.00000001], "", "0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "P2SH,WITNESS,MINIMALIF", "UNBALANCED_CONDITIONAL"],
+["P2WSH NOTIF 1 ENDIF"],
+[["01", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS", "EVAL_FALSE"],
+[["02", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS", "EVAL_FALSE"],
+[["0100", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS", "EVAL_FALSE"],
+[["", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS", "OK"],
+[["00", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS", "OK"],
+[["01", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+[["02", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["0100", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS,MINIMALIF", "OK"],
+[["00", "645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS", "UNBALANCED_CONDITIONAL"],
+[["645168", 0.00000001], "", "0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "P2SH,WITNESS,MINIMALIF", "UNBALANCED_CONDITIONAL"],
+
+
+
+["P2SH-P2WSH IF 1 ENDIF"],
+[["01", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS", "OK"],
+[["02", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS", "OK"],
+[["0100", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS", "OK"],
+[["", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS", "EVAL_FALSE"],
+[["00", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS", "EVAL_FALSE"],
+[["01", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS,MINIMALIF", "OK"],
+[["02", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["0100", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+[["00", "635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS", "UNBALANCED_CONDITIONAL"],
+[["635168", 0.00000001], "0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d", "HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL", "P2SH,WITNESS,MINIMALIF", "UNBALANCED_CONDITIONAL"],
+["P2SH-P2WSH NOTIF 1 ENDIF"],
+[["01", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS", "EVAL_FALSE"],
+[["02", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS", "EVAL_FALSE"],
+[["0100", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS", "EVAL_FALSE"],
+[["", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS", "OK"],
+[["00", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS", "OK"],
+[["01", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS,MINIMALIF", "EVAL_FALSE"],
+[["02", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["0100", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS,MINIMALIF", "OK"],
+[["00", "645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS,MINIMALIF", "MINIMALIF"],
+[["645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS", "UNBALANCED_CONDITIONAL"],
+[["645168", 0.00000001], "0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8", "HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL", "P2SH,WITNESS,MINIMALIF", "UNBALANCED_CONDITIONAL"],
+
+["NULLFAIL should cover all signatures and signatures only"],
+["0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT", "DERSIG", "OK", "BIP66 and NULLFAIL-compliant"],
+["0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT", "DERSIG,NULLFAIL", "OK", "BIP66 and NULLFAIL-compliant"],
+["1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT", "DERSIG,NULLFAIL", "OK", "BIP66 and NULLFAIL-compliant, not NULLDUMMY-compliant"],
+["1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT", "DERSIG,NULLFAIL,NULLDUMMY", "SIG_NULLDUMMY", "BIP66 and NULLFAIL-compliant, not NULLDUMMY-compliant"],
+["0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x09 0x300602010102010101", "0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT", "DERSIG", "OK", "BIP66-compliant but not NULLFAIL-compliant"],
+["0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x09 0x300602010102010101", "0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT", "DERSIG,NULLFAIL", "NULLFAIL", "BIP66-compliant but not NULLFAIL-compliant"],
+["0 0x09 0x300602010102010101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT", "DERSIG", "OK", "BIP66-compliant but not NULLFAIL-compliant"],
+["0 0x09 0x300602010102010101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT", "DERSIG,NULLFAIL", "NULLFAIL", "BIP66-compliant but not NULLFAIL-compliant"],
+
+["The End"]
+]
diff --git a/src/test/data/script_valid.json b/src/test/data/script_valid.json
deleted file mode 100644
index a4e15faeaf..0000000000
--- a/src/test/data/script_valid.json
+++ /dev/null
@@ -1,911 +0,0 @@
-[
-["Format is: [scriptSig, scriptPubKey, flags, ... comments]"],
-["It is evaluated as if there was a crediting coinbase transaction with two 0"],
-["pushes as scriptSig, and one output of 0 satoshi and given scriptPubKey,"],
-["followed by a spending transaction which spends this output as only input (and"],
-["correct prevout hash), using the given scriptSig. All nLockTimes are 0, all"],
-["nSequences are max."],
-
-["", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "Test the test: we should have an empty stack after scriptSig evaluation"],
-[" ", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "and multiple spaces should not change that."],
-[" ", "DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-[" ", "DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["1 2", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC", "Similarly whitespace around and between symbols"],
-["1 2", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC"],
-[" 1 2", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC"],
-["1 2 ", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC"],
-[" 1 2 ", "2 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC"],
-
-["1", "", "P2SH,STRICTENC"],
-["0x02 0x01 0x00", "", "P2SH,STRICTENC", "all bytes are significant, not only the last one"],
-["0x09 0x00000000 0x00000000 0x10", "", "P2SH,STRICTENC", "equals zero when cast to Int64"],
-
-["0x01 0x0b", "11 EQUAL", "P2SH,STRICTENC", "push 1 byte"],
-["0x02 0x417a", "'Az' EQUAL", "P2SH,STRICTENC"],
-["0x4b 0x417a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a",
- "'Azzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' EQUAL", "P2SH,STRICTENC", "push 75 bytes"],
-
-["0x4c 0x01 0x07","7 EQUAL", "P2SH,STRICTENC", "0x4c is OP_PUSHDATA1"],
-["0x4d 0x0100 0x08","8 EQUAL", "P2SH,STRICTENC", "0x4d is OP_PUSHDATA2"],
-["0x4e 0x01000000 0x09","9 EQUAL", "P2SH,STRICTENC", "0x4e is OP_PUSHDATA4"],
-
-["0x4c 0x00","0 EQUAL", "P2SH,STRICTENC"],
-["0x4d 0x0000","0 EQUAL", "P2SH,STRICTENC"],
-["0x4e 0x00000000","0 EQUAL", "P2SH,STRICTENC"],
-["0x4f 1000 ADD","999 EQUAL", "P2SH,STRICTENC"],
-["0", "IF 0x50 ENDIF 1", "P2SH,STRICTENC", "0x50 is reserved (ok if not executed)"],
-["0x51", "0x5f ADD 0x60 EQUAL", "P2SH,STRICTENC", "0x51 through 0x60 push 1 through 16 onto stack"],
-["1","NOP", "P2SH,STRICTENC"],
-["0", "IF VER ELSE 1 ENDIF", "P2SH,STRICTENC", "VER non-functional (ok if not executed)"],
-["0", "IF RESERVED RESERVED1 RESERVED2 ELSE 1 ENDIF", "P2SH,STRICTENC", "RESERVED ok in un-executed IF"],
-
-["1", "DUP IF ENDIF", "P2SH,STRICTENC"],
-["1", "IF 1 ENDIF", "P2SH,STRICTENC"],
-["1", "DUP IF ELSE ENDIF", "P2SH,STRICTENC"],
-["1", "IF 1 ELSE ENDIF", "P2SH,STRICTENC"],
-["0", "IF ELSE 1 ENDIF", "P2SH,STRICTENC"],
-
-["1 1", "IF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC"],
-["1 0", "IF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC"],
-["1 1", "IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC"],
-["0 0", "IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC"],
-
-["1 0", "NOTIF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC"],
-["1 1", "NOTIF IF 1 ELSE 0 ENDIF ENDIF", "P2SH,STRICTENC"],
-["1 0", "NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC"],
-["0 1", "NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF", "P2SH,STRICTENC"],
-
-["0", "IF 0 ELSE 1 ELSE 0 ENDIF", "P2SH,STRICTENC", "Multiple ELSE's are valid and executed inverts on each ELSE encountered"],
-["1", "IF 1 ELSE 0 ELSE ENDIF", "P2SH,STRICTENC"],
-["1", "IF ELSE 0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["1", "IF 1 ELSE 0 ELSE 1 ENDIF ADD 2 EQUAL", "P2SH,STRICTENC"],
-["'' 1", "IF SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ENDIF 0x14 0x68ca4fec736264c13b859bac43d5173df6871682 EQUAL", "P2SH,STRICTENC"],
-
-["1", "NOTIF 0 ELSE 1 ELSE 0 ENDIF", "P2SH,STRICTENC", "Multiple ELSE's are valid and execution inverts on each ELSE encountered"],
-["0", "NOTIF 1 ELSE 0 ELSE ENDIF", "P2SH,STRICTENC"],
-["0", "NOTIF ELSE 0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "NOTIF 1 ELSE 0 ELSE 1 ENDIF ADD 2 EQUAL", "P2SH,STRICTENC"],
-["'' 0", "NOTIF SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ENDIF 0x14 0x68ca4fec736264c13b859bac43d5173df6871682 EQUAL", "P2SH,STRICTENC"],
-
-["0", "IF 1 IF RETURN ELSE RETURN ELSE RETURN ENDIF ELSE 1 IF 1 ELSE RETURN ELSE 1 ENDIF ELSE RETURN ENDIF ADD 2 EQUAL", "P2SH,STRICTENC", "Nested ELSE ELSE"],
-["1", "NOTIF 0 NOTIF RETURN ELSE RETURN ELSE RETURN ENDIF ELSE 0 NOTIF 1 ELSE RETURN ELSE 1 ENDIF ELSE RETURN ENDIF ADD 2 EQUAL", "P2SH,STRICTENC"],
-
-["0", "IF RETURN ENDIF 1", "P2SH,STRICTENC", "RETURN only works if executed"],
-
-["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"],
-["1 0", "OVER DEPTH 3 EQUALVERIFY", "P2SH,STRICTENC"],
-["22 21 20", "0 PICK 20 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "1 PICK 21 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "2 PICK 22 EQUALVERIFY DEPTH 3 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "0 ROLL 20 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "1 ROLL 21 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "2 ROLL 22 EQUALVERIFY DEPTH 2 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "ROT 22 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "ROT DROP 20 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "ROT DROP DROP 21 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "ROT ROT 21 EQUAL", "P2SH,STRICTENC"],
-["22 21 20", "ROT ROT ROT 20 EQUAL", "P2SH,STRICTENC"],
-["25 24 23 22 21 20", "2ROT 24 EQUAL", "P2SH,STRICTENC"],
-["25 24 23 22 21 20", "2ROT DROP 25 EQUAL", "P2SH,STRICTENC"],
-["25 24 23 22 21 20", "2ROT 2DROP 20 EQUAL", "P2SH,STRICTENC"],
-["25 24 23 22 21 20", "2ROT 2DROP DROP 21 EQUAL", "P2SH,STRICTENC"],
-["25 24 23 22 21 20", "2ROT 2DROP 2DROP 22 EQUAL", "P2SH,STRICTENC"],
-["25 24 23 22 21 20", "2ROT 2DROP 2DROP DROP 23 EQUAL", "P2SH,STRICTENC"],
-["25 24 23 22 21 20", "2ROT 2ROT 22 EQUAL", "P2SH,STRICTENC"],
-["25 24 23 22 21 20", "2ROT 2ROT 2ROT 20 EQUAL", "P2SH,STRICTENC"],
-["1 0", "SWAP 1 EQUALVERIFY 0 EQUAL", "P2SH,STRICTENC"],
-["0 1", "TUCK DEPTH 3 EQUALVERIFY SWAP 2DROP", "P2SH,STRICTENC"],
-["13 14", "2DUP ROT EQUALVERIFY EQUAL", "P2SH,STRICTENC"],
-["-1 0 1 2", "3DUP DEPTH 7 EQUALVERIFY ADD ADD 3 EQUALVERIFY 2DROP 0 EQUALVERIFY", "P2SH,STRICTENC"],
-["1 2 3 5", "2OVER ADD ADD 8 EQUALVERIFY ADD ADD 6 EQUAL", "P2SH,STRICTENC"],
-["1 3 5 7", "2SWAP ADD 4 EQUALVERIFY ADD 12 EQUAL", "P2SH,STRICTENC"],
-["0", "SIZE 0 EQUAL", "P2SH,STRICTENC"],
-["1", "SIZE 1 EQUAL", "P2SH,STRICTENC"],
-["127", "SIZE 1 EQUAL", "P2SH,STRICTENC"],
-["128", "SIZE 2 EQUAL", "P2SH,STRICTENC"],
-["32767", "SIZE 2 EQUAL", "P2SH,STRICTENC"],
-["32768", "SIZE 3 EQUAL", "P2SH,STRICTENC"],
-["8388607", "SIZE 3 EQUAL", "P2SH,STRICTENC"],
-["8388608", "SIZE 4 EQUAL", "P2SH,STRICTENC"],
-["2147483647", "SIZE 4 EQUAL", "P2SH,STRICTENC"],
-["2147483648", "SIZE 5 EQUAL", "P2SH,STRICTENC"],
-["549755813887", "SIZE 5 EQUAL", "P2SH,STRICTENC"],
-["549755813888", "SIZE 6 EQUAL", "P2SH,STRICTENC"],
-["9223372036854775807", "SIZE 8 EQUAL", "P2SH,STRICTENC"],
-["-1", "SIZE 1 EQUAL", "P2SH,STRICTENC"],
-["-127", "SIZE 1 EQUAL", "P2SH,STRICTENC"],
-["-128", "SIZE 2 EQUAL", "P2SH,STRICTENC"],
-["-32767", "SIZE 2 EQUAL", "P2SH,STRICTENC"],
-["-32768", "SIZE 3 EQUAL", "P2SH,STRICTENC"],
-["-8388607", "SIZE 3 EQUAL", "P2SH,STRICTENC"],
-["-8388608", "SIZE 4 EQUAL", "P2SH,STRICTENC"],
-["-2147483647", "SIZE 4 EQUAL", "P2SH,STRICTENC"],
-["-2147483648", "SIZE 5 EQUAL", "P2SH,STRICTENC"],
-["-549755813887", "SIZE 5 EQUAL", "P2SH,STRICTENC"],
-["-549755813888", "SIZE 6 EQUAL", "P2SH,STRICTENC"],
-["-9223372036854775807", "SIZE 8 EQUAL", "P2SH,STRICTENC"],
-["'abcdefghijklmnopqrstuvwxyz'", "SIZE 26 EQUAL", "P2SH,STRICTENC"],
-
-["42", "SIZE 1 EQUALVERIFY 42 EQUAL", "P2SH,STRICTENC", "SIZE does not consume argument"],
-
-["2 -2 ADD", "0 EQUAL", "P2SH,STRICTENC"],
-["2147483647 -2147483647 ADD", "0 EQUAL", "P2SH,STRICTENC"],
-["-1 -1 ADD", "-2 EQUAL", "P2SH,STRICTENC"],
-
-["0 0","EQUAL", "P2SH,STRICTENC"],
-["1 1 ADD", "2 EQUAL", "P2SH,STRICTENC"],
-["1 1ADD", "2 EQUAL", "P2SH,STRICTENC"],
-["111 1SUB", "110 EQUAL", "P2SH,STRICTENC"],
-["111 1 ADD 12 SUB", "100 EQUAL", "P2SH,STRICTENC"],
-["0 ABS", "0 EQUAL", "P2SH,STRICTENC"],
-["16 ABS", "16 EQUAL", "P2SH,STRICTENC"],
-["-16 ABS", "-16 NEGATE EQUAL", "P2SH,STRICTENC"],
-["0 NOT", "NOP", "P2SH,STRICTENC"],
-["1 NOT", "0 EQUAL", "P2SH,STRICTENC"],
-["11 NOT", "0 EQUAL", "P2SH,STRICTENC"],
-["0 0NOTEQUAL", "0 EQUAL", "P2SH,STRICTENC"],
-["1 0NOTEQUAL", "1 EQUAL", "P2SH,STRICTENC"],
-["111 0NOTEQUAL", "1 EQUAL", "P2SH,STRICTENC"],
-["-111 0NOTEQUAL", "1 EQUAL", "P2SH,STRICTENC"],
-["1 1 BOOLAND", "NOP", "P2SH,STRICTENC"],
-["1 0 BOOLAND", "NOT", "P2SH,STRICTENC"],
-["0 1 BOOLAND", "NOT", "P2SH,STRICTENC"],
-["0 0 BOOLAND", "NOT", "P2SH,STRICTENC"],
-["16 17 BOOLAND", "NOP", "P2SH,STRICTENC"],
-["1 1 BOOLOR", "NOP", "P2SH,STRICTENC"],
-["1 0 BOOLOR", "NOP", "P2SH,STRICTENC"],
-["0 1 BOOLOR", "NOP", "P2SH,STRICTENC"],
-["0 0 BOOLOR", "NOT", "P2SH,STRICTENC"],
-["16 17 BOOLOR", "NOP", "P2SH,STRICTENC"],
-["11 10 1 ADD", "NUMEQUAL", "P2SH,STRICTENC"],
-["11 10 1 ADD", "NUMEQUALVERIFY 1", "P2SH,STRICTENC"],
-["11 10 1 ADD", "NUMNOTEQUAL NOT", "P2SH,STRICTENC"],
-["111 10 1 ADD", "NUMNOTEQUAL", "P2SH,STRICTENC"],
-["11 10", "LESSTHAN NOT", "P2SH,STRICTENC"],
-["4 4", "LESSTHAN NOT", "P2SH,STRICTENC"],
-["10 11", "LESSTHAN", "P2SH,STRICTENC"],
-["-11 11", "LESSTHAN", "P2SH,STRICTENC"],
-["-11 -10", "LESSTHAN", "P2SH,STRICTENC"],
-["11 10", "GREATERTHAN", "P2SH,STRICTENC"],
-["4 4", "GREATERTHAN NOT", "P2SH,STRICTENC"],
-["10 11", "GREATERTHAN NOT", "P2SH,STRICTENC"],
-["-11 11", "GREATERTHAN NOT", "P2SH,STRICTENC"],
-["-11 -10", "GREATERTHAN NOT", "P2SH,STRICTENC"],
-["11 10", "LESSTHANOREQUAL NOT", "P2SH,STRICTENC"],
-["4 4", "LESSTHANOREQUAL", "P2SH,STRICTENC"],
-["10 11", "LESSTHANOREQUAL", "P2SH,STRICTENC"],
-["-11 11", "LESSTHANOREQUAL", "P2SH,STRICTENC"],
-["-11 -10", "LESSTHANOREQUAL", "P2SH,STRICTENC"],
-["11 10", "GREATERTHANOREQUAL", "P2SH,STRICTENC"],
-["4 4", "GREATERTHANOREQUAL", "P2SH,STRICTENC"],
-["10 11", "GREATERTHANOREQUAL NOT", "P2SH,STRICTENC"],
-["-11 11", "GREATERTHANOREQUAL NOT", "P2SH,STRICTENC"],
-["-11 -10", "GREATERTHANOREQUAL NOT", "P2SH,STRICTENC"],
-["1 0 MIN", "0 NUMEQUAL", "P2SH,STRICTENC"],
-["0 1 MIN", "0 NUMEQUAL", "P2SH,STRICTENC"],
-["-1 0 MIN", "-1 NUMEQUAL", "P2SH,STRICTENC"],
-["0 -2147483647 MIN", "-2147483647 NUMEQUAL", "P2SH,STRICTENC"],
-["2147483647 0 MAX", "2147483647 NUMEQUAL", "P2SH,STRICTENC"],
-["0 100 MAX", "100 NUMEQUAL", "P2SH,STRICTENC"],
-["-100 0 MAX", "0 NUMEQUAL", "P2SH,STRICTENC"],
-["0 -2147483647 MAX", "0 NUMEQUAL", "P2SH,STRICTENC"],
-["0 0 1", "WITHIN", "P2SH,STRICTENC"],
-["1 0 1", "WITHIN NOT", "P2SH,STRICTENC"],
-["0 -2147483647 2147483647", "WITHIN", "P2SH,STRICTENC"],
-["-1 -100 100", "WITHIN", "P2SH,STRICTENC"],
-["11 -100 100", "WITHIN", "P2SH,STRICTENC"],
-["-2147483647 -100 100", "WITHIN NOT", "P2SH,STRICTENC"],
-["2147483647 -100 100", "WITHIN NOT", "P2SH,STRICTENC"],
-
-["2147483647 2147483647 SUB", "0 EQUAL", "P2SH,STRICTENC"],
-["2147483647 DUP ADD", "4294967294 EQUAL", "P2SH,STRICTENC", ">32 bit EQUAL is valid"],
-["2147483647 NEGATE DUP ADD", "-4294967294 EQUAL", "P2SH,STRICTENC"],
-
-["''", "RIPEMD160 0x14 0x9c1185a5c5e9fc54612808977ee8f548b2258d31 EQUAL", "P2SH,STRICTENC"],
-["'a'", "RIPEMD160 0x14 0x0bdc9d2d256b3ee9daae347be6f4dc835a467ffe EQUAL", "P2SH,STRICTENC"],
-["'abcdefghijklmnopqrstuvwxyz'", "RIPEMD160 0x14 0xf71c27109c692c1b56bbdceb5b9d2865b3708dbc EQUAL", "P2SH,STRICTENC"],
-["''", "SHA1 0x14 0xda39a3ee5e6b4b0d3255bfef95601890afd80709 EQUAL", "P2SH,STRICTENC"],
-["'a'", "SHA1 0x14 0x86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 EQUAL", "P2SH,STRICTENC"],
-["'abcdefghijklmnopqrstuvwxyz'", "SHA1 0x14 0x32d10c7b8cf96570ca04ce37f2a19d84240d3a89 EQUAL", "P2SH,STRICTENC"],
-["''", "SHA256 0x20 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 EQUAL", "P2SH,STRICTENC"],
-["'a'", "SHA256 0x20 0xca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb EQUAL", "P2SH,STRICTENC"],
-["'abcdefghijklmnopqrstuvwxyz'", "SHA256 0x20 0x71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73 EQUAL", "P2SH,STRICTENC"],
-["''", "DUP HASH160 SWAP SHA256 RIPEMD160 EQUAL", "P2SH,STRICTENC"],
-["''", "DUP HASH256 SWAP SHA256 SHA256 EQUAL", "P2SH,STRICTENC"],
-["''", "NOP HASH160 0x14 0xb472a266d0bd89c13706a4132ccfb16f7c3b9fcb EQUAL", "P2SH,STRICTENC"],
-["'a'", "HASH160 NOP 0x14 0x994355199e516ff76c4fa4aab39337b9d84cf12b EQUAL", "P2SH,STRICTENC"],
-["'abcdefghijklmnopqrstuvwxyz'", "HASH160 0x4c 0x14 0xc286a1af0947f58d1ad787385b1c2c4a976f9e71 EQUAL", "P2SH,STRICTENC"],
-["''", "HASH256 0x20 0x5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456 EQUAL", "P2SH,STRICTENC"],
-["'a'", "HASH256 0x20 0xbf5d3affb73efd2ec6c36ad3112dd933efed63c4e1cbffcfa88e2759c144f2d8 EQUAL", "P2SH,STRICTENC"],
-["'abcdefghijklmnopqrstuvwxyz'", "HASH256 0x4c 0x20 0xca139bc10c2f660da42666f72e89a225936fc60f193c161124a672050c434671 EQUAL", "P2SH,STRICTENC"],
-
-
-["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", "P2SH,STRICTENC"],
-["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_10' EQUAL", "P2SH,STRICTENC"],
-
-["1", "NOP", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "Discourage NOPx flag allows OP_NOP"],
-
-["0", "IF NOP10 ENDIF 1", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS",
- "Discouraged NOPs are allowed if not executed"],
-
-["0", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
-["0", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xbd ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xbe ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xbf ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc1 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc2 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc3 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc4 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc5 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc6 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc7 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc8 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xc9 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xca ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xcb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xcc ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xcd ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xce ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xcf ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd1 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd2 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd3 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd4 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd5 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd6 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd7 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd8 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xd9 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xda ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xdb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xdc ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xdd ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xde ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xdf ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe1 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe2 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe3 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe4 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe5 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe6 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe7 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe8 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xe9 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xea ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xeb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xec ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xed ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xee ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xef ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf0 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf1 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf2 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf3 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf4 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf5 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf6 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf7 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf8 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xf9 ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xfa ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xfb ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xfc ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xfd ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xfe ELSE 1 ENDIF", "P2SH,STRICTENC"],
-["0", "IF 0xff ELSE 1 ENDIF", "P2SH,STRICTENC"],
-
-["NOP",
-"'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'",
-"P2SH,STRICTENC",
-"520 byte push"],
-["1",
-"0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
-"P2SH,STRICTENC",
-"201 opcodes executed. 0x61 is NOP"],
-["1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"P2SH,STRICTENC",
-"1,000 stack size (0x6f is 3DUP)"],
-["1 TOALTSTACK 2 TOALTSTACK 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"1 2 3 4 5 6 7 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"P2SH,STRICTENC",
-"1,000 stack size (altstack cleared between scriptSig/scriptPubKey)"],
-["'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f",
-"'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f 2DUP 0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
-"P2SH,STRICTENC",
-"Max-size (10,000-byte), max-push(520 bytes), max-opcodes(201), max stack size(1,000 items). 0x6f is 3DUP, 0x61 is NOP"],
-
-["0",
-"IF 0x5050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050 ENDIF 1",
-"P2SH,STRICTENC",
-">201 opcodes, but RESERVED (0x50) doesn't count towards opcode limit."],
-
-["NOP","1", "P2SH,STRICTENC"],
-
-["1", "0x01 0x01 EQUAL", "P2SH,STRICTENC", "The following is useful for checking implementations of BN_bn2mpi"],
-["127", "0x01 0x7F EQUAL", "P2SH,STRICTENC"],
-["128", "0x02 0x8000 EQUAL", "P2SH,STRICTENC", "Leave room for the sign bit"],
-["32767", "0x02 0xFF7F EQUAL", "P2SH,STRICTENC"],
-["32768", "0x03 0x008000 EQUAL", "P2SH,STRICTENC"],
-["8388607", "0x03 0xFFFF7F EQUAL", "P2SH,STRICTENC"],
-["8388608", "0x04 0x00008000 EQUAL", "P2SH,STRICTENC"],
-["2147483647", "0x04 0xFFFFFF7F EQUAL", "P2SH,STRICTENC"],
-["2147483648", "0x05 0x0000008000 EQUAL", "P2SH,STRICTENC"],
-["549755813887", "0x05 0xFFFFFFFF7F EQUAL", "P2SH,STRICTENC"],
-["549755813888", "0x06 0xFFFFFFFF7F EQUAL", "P2SH,STRICTENC"],
-["9223372036854775807", "0x08 0xFFFFFFFFFFFFFF7F EQUAL", "P2SH,STRICTENC"],
-["-1", "0x01 0x81 EQUAL", "P2SH,STRICTENC", "Numbers are little-endian with the MSB being a sign bit"],
-["-127", "0x01 0xFF EQUAL", "P2SH,STRICTENC"],
-["-128", "0x02 0x8080 EQUAL", "P2SH,STRICTENC"],
-["-32767", "0x02 0xFFFF EQUAL", "P2SH,STRICTENC"],
-["-32768", "0x03 0x008080 EQUAL", "P2SH,STRICTENC"],
-["-8388607", "0x03 0xFFFFFF EQUAL", "P2SH,STRICTENC"],
-["-8388608", "0x04 0x00008080 EQUAL", "P2SH,STRICTENC"],
-["-2147483647", "0x04 0xFFFFFFFF EQUAL", "P2SH,STRICTENC"],
-["-2147483648", "0x05 0x0000008080 EQUAL", "P2SH,STRICTENC"],
-["-4294967295", "0x05 0xFFFFFFFF80 EQUAL", "P2SH,STRICTENC"],
-["-549755813887", "0x05 0xFFFFFFFFFF EQUAL", "P2SH,STRICTENC"],
-["-549755813888", "0x06 0x000000008080 EQUAL", "P2SH,STRICTENC"],
-["-9223372036854775807", "0x08 0xFFFFFFFFFFFFFFFF EQUAL", "P2SH,STRICTENC"],
-
-["2147483647", "1ADD 2147483648 EQUAL", "P2SH,STRICTENC", "We can do math on 4-byte integers, and compare 5-byte ones"],
-["2147483647", "1ADD 1", "P2SH,STRICTENC"],
-["-2147483647", "1ADD 1", "P2SH,STRICTENC"],
-
-["1", "0x02 0x0100 EQUAL NOT", "P2SH,STRICTENC", "Not the same byte array..."],
-["1", "0x02 0x0100 NUMEQUAL", "P2SH,STRICTENC", "... but they are numerically equal"],
-["11", "0x4c 0x03 0x0b0000 NUMEQUAL", "P2SH,STRICTENC"],
-["0", "0x01 0x80 EQUAL NOT", "P2SH,STRICTENC"],
-["0", "0x01 0x80 NUMEQUAL", "P2SH,STRICTENC", "Zero numerically equals negative zero"],
-["0", "0x02 0x0080 NUMEQUAL", "P2SH,STRICTENC"],
-["0x03 0x000080", "0x04 0x00000080 NUMEQUAL", "P2SH,STRICTENC"],
-["0x03 0x100080", "0x04 0x10000080 NUMEQUAL", "P2SH,STRICTENC"],
-["0x03 0x100000", "0x04 0x10000000 NUMEQUAL", "P2SH,STRICTENC"],
-
-["NOP", "NOP 1", "P2SH,STRICTENC", "The following tests check the if(stack.size() < N) tests in each opcode"],
-["1", "IF 1 ENDIF", "P2SH,STRICTENC", "They are here to catch copy-and-paste errors"],
-["0", "NOTIF 1 ENDIF", "P2SH,STRICTENC", "Most of them are duplicated elsewhere,"],
-["1", "VERIFY 1", "P2SH,STRICTENC", "but, hey, more is always better, right?"],
-
-["0", "TOALTSTACK 1", "P2SH,STRICTENC"],
-["1", "TOALTSTACK FROMALTSTACK", "P2SH,STRICTENC"],
-["0 0", "2DROP 1", "P2SH,STRICTENC"],
-["0 1", "2DUP", "P2SH,STRICTENC"],
-["0 0 1", "3DUP", "P2SH,STRICTENC"],
-["0 1 0 0", "2OVER", "P2SH,STRICTENC"],
-["0 1 0 0 0 0", "2ROT", "P2SH,STRICTENC"],
-["0 1 0 0", "2SWAP", "P2SH,STRICTENC"],
-["1", "IFDUP", "P2SH,STRICTENC"],
-["NOP", "DEPTH 1", "P2SH,STRICTENC"],
-["0", "DROP 1", "P2SH,STRICTENC"],
-["1", "DUP", "P2SH,STRICTENC"],
-["0 1", "NIP", "P2SH,STRICTENC"],
-["1 0", "OVER", "P2SH,STRICTENC"],
-["1 0 0 0 3", "PICK", "P2SH,STRICTENC"],
-["1 0", "PICK", "P2SH,STRICTENC"],
-["1 0 0 0 3", "ROLL", "P2SH,STRICTENC"],
-["1 0", "ROLL", "P2SH,STRICTENC"],
-["1 0 0", "ROT", "P2SH,STRICTENC"],
-["1 0", "SWAP", "P2SH,STRICTENC"],
-["0 1", "TUCK", "P2SH,STRICTENC"],
-
-["1", "SIZE", "P2SH,STRICTENC"],
-
-["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"],
-["-1", "NEGATE", "P2SH,STRICTENC"],
-["-1", "ABS", "P2SH,STRICTENC"],
-["0", "NOT", "P2SH,STRICTENC"],
-["-1", "0NOTEQUAL", "P2SH,STRICTENC"],
-
-["1 0", "ADD", "P2SH,STRICTENC"],
-["1 0", "SUB", "P2SH,STRICTENC"],
-["-1 -1", "BOOLAND", "P2SH,STRICTENC"],
-["-1 0", "BOOLOR", "P2SH,STRICTENC"],
-["0 0", "NUMEQUAL", "P2SH,STRICTENC"],
-["0 0", "NUMEQUALVERIFY 1", "P2SH,STRICTENC"],
-["-1 0", "NUMNOTEQUAL", "P2SH,STRICTENC"],
-["-1 0", "LESSTHAN", "P2SH,STRICTENC"],
-["1 0", "GREATERTHAN", "P2SH,STRICTENC"],
-["0 0", "LESSTHANOREQUAL", "P2SH,STRICTENC"],
-["0 0", "GREATERTHANOREQUAL", "P2SH,STRICTENC"],
-["-1 0", "MIN", "P2SH,STRICTENC"],
-["1 0", "MAX", "P2SH,STRICTENC"],
-["-1 -1 0", "WITHIN", "P2SH,STRICTENC"],
-
-["0", "RIPEMD160", "P2SH,STRICTENC"],
-["0", "SHA1", "P2SH,STRICTENC"],
-["0", "SHA256", "P2SH,STRICTENC"],
-["0", "HASH160", "P2SH,STRICTENC"],
-["0", "HASH256", "P2SH,STRICTENC"],
-["NOP", "CODESEPARATOR 1", "P2SH,STRICTENC"],
-
-["NOP", "NOP1 1", "P2SH,STRICTENC"],
-["NOP", "NOP2 1", "P2SH,STRICTENC"],
-["NOP", "NOP3 1", "P2SH,STRICTENC"],
-["NOP", "NOP4 1", "P2SH,STRICTENC"],
-["NOP", "NOP5 1", "P2SH,STRICTENC"],
-["NOP", "NOP6 1", "P2SH,STRICTENC"],
-["NOP", "NOP7 1", "P2SH,STRICTENC"],
-["NOP", "NOP8 1", "P2SH,STRICTENC"],
-["NOP", "NOP9 1", "P2SH,STRICTENC"],
-["NOP", "NOP10 1", "P2SH,STRICTENC"],
-
-["", "0 0 0 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "CHECKMULTISIG is allowed to have zero keys and/or sigs"],
-["", "0 0 0 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 0 1 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "Zero sigs means no sigs are checked"],
-["", "0 0 0 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-
-["", "0 0 0 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "CHECKMULTISIG is allowed to have zero keys and/or sigs"],
-["", "0 0 0 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 0 1 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "Zero sigs means no sigs are checked"],
-["", "0 0 0 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-
-["", "0 0 'a' 'b' 2 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC", "Test from up to 20 pubkeys, all not checked"],
-["", "0 0 'a' 'b' 'c' 3 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 4 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 5 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 6 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 7 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 8 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 9 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 10 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 11 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 12 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 13 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 14 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 15 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 16 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 17 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 18 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 19 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG VERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 2 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 3 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 4 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 5 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 6 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 7 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 8 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 9 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 10 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 11 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 12 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 13 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 14 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 15 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 16 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 17 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 18 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 19 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-["", "0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY DEPTH 0 EQUAL", "P2SH,STRICTENC"],
-
-["",
-"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",
-"P2SH,STRICTENC",
-"nOpCount is incremented by the number of keys evaluated in addition to the usual one op per op. In this case we have zero keys, so we can execute 201 CHECKMULTISIGS"],
-
-["1",
-"0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY",
-"P2SH,STRICTENC"],
-
-["",
-"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG",
-"P2SH,STRICTENC",
-"Even though there are no signatures being checked nOpCount is incremented by the number of keys."],
-
-["1",
-"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY",
-"P2SH,STRICTENC"],
-
-["0 0x01 1", "HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL", "P2SH,STRICTENC", "Very basic P2SH"],
-["0x4c 0 0x01 1", "HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL", "P2SH,STRICTENC"],
-
-["0x40 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242",
-"0x4d 0x4000 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242 EQUAL",
-"P2SH,STRICTENC",
-"Basic PUSH signedness check"],
-
-["0x4c 0x40 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242",
-"0x4d 0x4000 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242 EQUAL",
-"P2SH,STRICTENC",
-"Basic PUSHDATA1 signedness check"],
-
-["all PUSHDATA forms are equivalent"],
-
-["0x4c 0x4b 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "0x4b 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 EQUAL", "", "PUSHDATA1 of 75 bytes equals direct push of it"],
-["0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "0x4c 0xFF 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 EQUAL", "", "PUSHDATA2 of 255 bytes equals PUSHDATA1 of it"],
-
-["0x00", "SIZE 0 EQUAL", "P2SH,STRICTENC", "Basic OP_0 execution"],
-
-["Numeric pushes"],
-
-["0x01 0x81", "0x4f EQUAL", "", "OP1_NEGATE pushes 0x81"],
-["0x01 0x01", "0x51 EQUAL", "", "OP_1 pushes 0x01"],
-["0x01 0x02", "0x52 EQUAL", "", "OP_2 pushes 0x02"],
-["0x01 0x03", "0x53 EQUAL", "", "OP_3 pushes 0x03"],
-["0x01 0x04", "0x54 EQUAL", "", "OP_4 pushes 0x04"],
-["0x01 0x05", "0x55 EQUAL", "", "OP_5 pushes 0x05"],
-["0x01 0x06", "0x56 EQUAL", "", "OP_6 pushes 0x06"],
-["0x01 0x07", "0x57 EQUAL", "", "OP_7 pushes 0x07"],
-["0x01 0x08", "0x58 EQUAL", "", "OP_8 pushes 0x08"],
-["0x01 0x09", "0x59 EQUAL", "", "OP_9 pushes 0x09"],
-["0x01 0x0a", "0x5a EQUAL", "", "OP_10 pushes 0x0a"],
-["0x01 0x0b", "0x5b EQUAL", "", "OP_11 pushes 0x0b"],
-["0x01 0x0c", "0x5c EQUAL", "", "OP_12 pushes 0x0c"],
-["0x01 0x0d", "0x5d EQUAL", "", "OP_13 pushes 0x0d"],
-["0x01 0x0e", "0x5e EQUAL", "", "OP_14 pushes 0x0e"],
-["0x01 0x0f", "0x5f EQUAL", "", "OP_15 pushes 0x0f"],
-["0x01 0x10", "0x60 EQUAL", "", "OP_16 pushes 0x10"],
-
-["Equivalency of different numeric encodings"],
-
-["0x02 0x8000", "128 NUMEQUAL", "", "0x8000 equals 128"],
-["0x01 0x00", "0 NUMEQUAL", "", "0x00 numequals 0"],
-["0x01 0x80", "0 NUMEQUAL", "", "0x80 (negative zero) numequals 0"],
-["0x02 0x0080", "0 NUMEQUAL", "", "0x0080 numequals 0"],
-["0x02 0x0500", "5 NUMEQUAL", "", "0x0500 numequals 5"],
-["0x03 0xff7f80", "0x02 0xffff NUMEQUAL", "", ""],
-["0x03 0xff7f00", "0x02 0xff7f NUMEQUAL", "", ""],
-["0x04 0xffff7f80", "0x03 0xffffff NUMEQUAL", "", ""],
-["0x04 0xffff7f00", "0x03 0xffff7f NUMEQUAL", "", ""],
-
-["Unevaluated non-minimal pushes are ignored"],
-
-["0 IF 0x4c 0x00 ENDIF 1", "", "MINIMALDATA", "non-minimal PUSHDATA1 ignored"],
-["0 IF 0x4d 0x0000 ENDIF 1", "", "MINIMALDATA", "non-minimal PUSHDATA2 ignored"],
-["0 IF 0x4c 0x00000000 ENDIF 1", "", "MINIMALDATA", "non-minimal PUSHDATA4 ignored"],
-["0 IF 0x01 0x81 ENDIF 1", "", "MINIMALDATA", "1NEGATE equiv"],
-["0 IF 0x01 0x01 ENDIF 1", "", "MINIMALDATA", "OP_1 equiv"],
-["0 IF 0x01 0x02 ENDIF 1", "", "MINIMALDATA", "OP_2 equiv"],
-["0 IF 0x01 0x03 ENDIF 1", "", "MINIMALDATA", "OP_3 equiv"],
-["0 IF 0x01 0x04 ENDIF 1", "", "MINIMALDATA", "OP_4 equiv"],
-["0 IF 0x01 0x05 ENDIF 1", "", "MINIMALDATA", "OP_5 equiv"],
-["0 IF 0x01 0x06 ENDIF 1", "", "MINIMALDATA", "OP_6 equiv"],
-["0 IF 0x01 0x07 ENDIF 1", "", "MINIMALDATA", "OP_7 equiv"],
-["0 IF 0x01 0x08 ENDIF 1", "", "MINIMALDATA", "OP_8 equiv"],
-["0 IF 0x01 0x09 ENDIF 1", "", "MINIMALDATA", "OP_9 equiv"],
-["0 IF 0x01 0x0a ENDIF 1", "", "MINIMALDATA", "OP_10 equiv"],
-["0 IF 0x01 0x0b ENDIF 1", "", "MINIMALDATA", "OP_11 equiv"],
-["0 IF 0x01 0x0c ENDIF 1", "", "MINIMALDATA", "OP_12 equiv"],
-["0 IF 0x01 0x0d ENDIF 1", "", "MINIMALDATA", "OP_13 equiv"],
-["0 IF 0x01 0x0e ENDIF 1", "", "MINIMALDATA", "OP_14 equiv"],
-["0 IF 0x01 0x0f ENDIF 1", "", "MINIMALDATA", "OP_15 equiv"],
-["0 IF 0x01 0x10 ENDIF 1", "", "MINIMALDATA", "OP_16 equiv"],
-
-["Numeric minimaldata rules are only applied when a stack item is numerically evaluated; the push itself is allowed"],
-
-["0x01 0x00", "1", "MINIMALDATA"],
-["0x01 0x80", "1", "MINIMALDATA"],
-["0x02 0x0180", "1", "MINIMALDATA"],
-["0x02 0x0100", "1", "MINIMALDATA"],
-["0x02 0x0200", "1", "MINIMALDATA"],
-["0x02 0x0300", "1", "MINIMALDATA"],
-["0x02 0x0400", "1", "MINIMALDATA"],
-["0x02 0x0500", "1", "MINIMALDATA"],
-["0x02 0x0600", "1", "MINIMALDATA"],
-["0x02 0x0700", "1", "MINIMALDATA"],
-["0x02 0x0800", "1", "MINIMALDATA"],
-["0x02 0x0900", "1", "MINIMALDATA"],
-["0x02 0x0a00", "1", "MINIMALDATA"],
-["0x02 0x0b00", "1", "MINIMALDATA"],
-["0x02 0x0c00", "1", "MINIMALDATA"],
-["0x02 0x0d00", "1", "MINIMALDATA"],
-["0x02 0x0e00", "1", "MINIMALDATA"],
-["0x02 0x0f00", "1", "MINIMALDATA"],
-["0x02 0x1000", "1", "MINIMALDATA"],
-
-["Valid version of the 'Test every numeric-accepting opcode for correct handling of the numeric minimal encoding rule' script_invalid test"],
-
-["1 0x02 0x0000", "PICK DROP", ""],
-["1 0x02 0x0000", "ROLL DROP 1", ""],
-["0x02 0x0000", "1ADD DROP 1", ""],
-["0x02 0x0000", "1SUB DROP 1", ""],
-["0x02 0x0000", "NEGATE DROP 1", ""],
-["0x02 0x0000", "ABS DROP 1", ""],
-["0x02 0x0000", "NOT DROP 1", ""],
-["0x02 0x0000", "0NOTEQUAL DROP 1", ""],
-
-["0 0x02 0x0000", "ADD DROP 1", ""],
-["0x02 0x0000 0", "ADD DROP 1", ""],
-["0 0x02 0x0000", "SUB DROP 1", ""],
-["0x02 0x0000 0", "SUB DROP 1", ""],
-["0 0x02 0x0000", "BOOLAND DROP 1", ""],
-["0x02 0x0000 0", "BOOLAND DROP 1", ""],
-["0 0x02 0x0000", "BOOLOR DROP 1", ""],
-["0x02 0x0000 0", "BOOLOR DROP 1", ""],
-["0 0x02 0x0000", "NUMEQUAL DROP 1", ""],
-["0x02 0x0000 1", "NUMEQUAL DROP 1", ""],
-["0 0x02 0x0000", "NUMEQUALVERIFY 1", ""],
-["0x02 0x0000 0", "NUMEQUALVERIFY 1", ""],
-["0 0x02 0x0000", "NUMNOTEQUAL DROP 1", ""],
-["0x02 0x0000 0", "NUMNOTEQUAL DROP 1", ""],
-["0 0x02 0x0000", "LESSTHAN DROP 1", ""],
-["0x02 0x0000 0", "LESSTHAN DROP 1", ""],
-["0 0x02 0x0000", "GREATERTHAN DROP 1", ""],
-["0x02 0x0000 0", "GREATERTHAN DROP 1", ""],
-["0 0x02 0x0000", "LESSTHANOREQUAL DROP 1", ""],
-["0x02 0x0000 0", "LESSTHANOREQUAL DROP 1", ""],
-["0 0x02 0x0000", "GREATERTHANOREQUAL DROP 1", ""],
-["0x02 0x0000 0", "GREATERTHANOREQUAL DROP 1", ""],
-["0 0x02 0x0000", "MIN DROP 1", ""],
-["0x02 0x0000 0", "MIN DROP 1", ""],
-["0 0x02 0x0000", "MAX DROP 1", ""],
-["0x02 0x0000 0", "MAX DROP 1", ""],
-
-["0x02 0x0000 0 0", "WITHIN DROP 1", ""],
-["0 0x02 0x0000 0", "WITHIN DROP 1", ""],
-["0 0 0x02 0x0000", "WITHIN DROP 1", ""],
-
-["0 0 0x02 0x0000", "CHECKMULTISIG DROP 1", ""],
-["0 0x02 0x0000 0", "CHECKMULTISIG DROP 1", ""],
-["0 0x02 0x0000 0 1", "CHECKMULTISIG DROP 1", ""],
-["0 0 0x02 0x0000", "CHECKMULTISIGVERIFY 1", ""],
-["0 0x02 0x0000 0", "CHECKMULTISIGVERIFY 1", ""],
-
-["While not really correctly DER encoded, the empty signature is allowed by"],
-["STRICTENC to provide a compact way to provide a delibrately invalid signature."],
-["0", "0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 CHECKSIG NOT", "STRICTENC"],
-["0 0", "1 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 1 CHECKMULTISIG NOT", "STRICTENC"],
-
-["CHECKMULTISIG evaluation order tests. CHECKMULTISIG evaluates signatures and"],
-["pubkeys in a specific order, and will exit early if the number of signatures"],
-["left to check is greater than the number of keys left. As STRICTENC fails the"],
-["script when it reaches an invalidly encoded signature or pubkey, we can use it"],
-["to test the exact order in which signatures and pubkeys are evaluated by"],
-["distinguishing CHECKMULTISIG returning false on the stack and the script as a"],
-["whole failing."],
-["See also the corresponding inverted versions of these tests in script_invalid.json"],
-[
- "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
- "2 0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
- "STRICTENC",
- "2-of-2 CHECKMULTISIG NOT with the second pubkey invalid, and both signatures validly encoded. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid pubkey."
-],
-[
- "0 0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
- "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
- "STRICTENC",
- "2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature."
-],
-
-["Increase test coverage for DERSIG"],
-["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Overly long signature is correctly encoded"],
-["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Missing S is correctly encoded"],
-["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "", "S with invalid S length is correctly encoded"],
-["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer R is correctly encoded"],
-["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer S is correctly encoded"],
-["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Zero-length R is correctly encoded"],
-["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "", "Zero-length S is correctly encoded for DERSIG"],
-["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Negative S is correctly encoded"],
-
-["Automatically generated test cases"],
-[
- "0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
- "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
- "",
- "P2PK"
-],
-[
- "0x47 0x304402206e05a6fe23c59196ffe176c9ddc31e73a9885638f9d1328d47c0c703863b8876022076feb53811aa5b04e0e79f938eb19906cc5e67548bc555a8e8b8b0fc603d840c01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
- "DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG",
- "",
- "P2PKH"
-],
-[
- "0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790281",
- "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
- "",
- "P2PK anyonecanpay"
-],
-[
- "0x47 0x3044022003fef42ed6c7be8917441218f525a60e2431be978e28b7aca4d7a532cc413ae8022067a1f82c74e8d69291b90d148778405c6257bbcfc2353cc38a3e1f22bf44254601 0x23 0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
- "HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
- "P2SH",
- "P2SH(P2PK)"
-],
-[
- "0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
- "HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
- "",
- "P2SH(P2PKH), bad sig but no VERIFY_P2SH"
-],
-[
- "0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
- "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
- "",
- "3-of-3"
-],
-[
- "0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0x47 0x30440220563e5b3b1fc11662a84bc5ea2a32cc3819703254060ba30d639a1aaf2d5068ad0220601c1f47ddc76d93284dd9ed68f7c9974c4a0ea7cbe8a247d6bc3878567a5fca01 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
- "HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
- "P2SH",
- "P2SH(2-of-3)"
-],
-[
- "0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "",
- "P2PK with too much R padding but no DERSIG"
-],
-[
- "0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "",
- "P2PK with too much S padding but no DERSIG"
-],
-[
- "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "",
- "P2PK with too little R padding but no DERSIG"
-],
-[
- "0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
- "",
- "P2PK NOT with bad sig with too much R padding but no DERSIG"
-],
-[
- "0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
- "",
- "BIP66 example 1, without DERSIG"
-],
-[
- "0",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
- "",
- "BIP66 example 4, without DERSIG"
-],
-[
- "0",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
- "DERSIG",
- "BIP66 example 4, with DERSIG"
-],
-[
- "1",
- "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
- "",
- "BIP66 example 6, without DERSIG"
-],
-[
- "0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
- "",
- "BIP66 example 7, without DERSIG"
-],
-[
- "0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
- "",
- "BIP66 example 10, without DERSIG"
-],
-[
- "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
- "",
- "BIP66 example 12, without DERSIG"
-],
-[
- "0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
- "DERSIG",
- "BIP66 example 12, with DERSIG"
-],
-[
- "0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
- "",
- "P2PK with multi-byte hashtype, without DERSIG"
-],
-[
- "0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
- "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
- "",
- "P2PK with high S but no LOW_S"
-],
-[
- "0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01",
- "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
- "",
- "P2PK with hybrid pubkey but no STRICTENC"
-],
-[
- "0x47 0x30440220035d554e3153c04950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
- "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
- "",
- "P2PK NOT with invalid hybrid pubkey but no STRICTENC"
-],
-[
- "0 0x47 0x304402202e79441ad1baf5a07fb86bae3753184f6717d9692680947ea8b6e8b777c69af1022079a262e13d868bb5a0964fefe3ba26942e1b0669af1afb55ef3344bc9d4fc4c401",
- "1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
- "",
- "1-of-2 with the second 1 hybrid pubkey and no STRICTENC"
-],
-[
- "0 0x47 0x304402202e79441ad1baf5a07fb86bae3753184f6717d9692680947ea8b6e8b777c69af1022079a262e13d868bb5a0964fefe3ba26942e1b0669af1afb55ef3344bc9d4fc4c401",
- "1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
- "STRICTENC",
- "1-of-2 with the second 1 hybrid pubkey"
-],
-[
- "0x47 0x304402206177d513ec2cda444c021a1f4f656fc4c72ba108ae063e157eb86dc3575784940220666fc66702815d0e5413bb9b1df22aed44f5f1efb8b99d41dd5dc9a5be6d205205",
- "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
- "",
- "P2PK with undefined hashtype but no STRICTENC"
-],
-[
- "0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05",
- "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
- "",
- "P2PK NOT with invalid sig and undefined hashtype but no STRICTENC"
-],
-[
- "1 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
- "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
- "",
- "3-of-3 with nonzero dummy but no NULLDUMMY"
-],
-[
- "1 0x47 0x304402201bb2edab700a5d020236df174fefed78087697143731f659bea59642c759c16d022061f42cdbae5bcd3e8790f20bf76687443436e94a634321c16a72aa54cbc7c2ea01 0x47 0x304402204bb4a64f2a6e5c7fb2f07fef85ee56fde5e6da234c6a984262307a20e99842d702206f8303aaba5e625d223897e2ffd3f88ef1bcffef55f38dc3768e5f2e94c923f901 0x47 0x3044022040c2809b71fffb155ec8b82fe7a27f666bd97f941207be4e14ade85a1249dd4d02204d56c85ec525dd18e29a0533d5ddf61b6b1bb32980c2f63edf951aebf7a27bfe01",
- "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT",
- "",
- "3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY"
-],
-[
- "0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 DUP",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
- "",
- "2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY"
-],
-[
- "0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901",
- "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
- "SIGPUSHONLY",
- "2-of-2 with two identical keys and sigs pushed"
-],
-[
- "11 0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
- "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
- "P2SH",
- "P2PK with unnecessary input but no CLEANSTACK"
-],
-[
- "11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
- "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
- "P2SH",
- "P2SH with unnecessary input but no CLEANSTACK"
-],
-[
- "0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
- "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
- "CLEANSTACK,P2SH",
- "P2SH with CLEANSTACK"
-],
-
-["The End"]
-]
diff --git a/src/test/data/tt-delin1-out.json b/src/test/data/tt-delin1-out.json
new file mode 100644
index 0000000000..712a2c27f8
--- /dev/null
+++ b/src/test/data/tt-delin1-out.json
@@ -0,0 +1,217 @@
+{
+ "txid": "81b2035be1da1abe745c6141174a73d151009ec17b3d5ebffa2e177408c50dfd",
+ "hash": "81b2035be1da1abe745c6141174a73d151009ec17b3d5ebffa2e177408c50dfd",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "27871a1a27d833e99cd392a502a647beaaeda6da535417501c76312d52235cfd",
+ "vout": 332,
+ "scriptSig": {
+ "asm": "3046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba[ALL] 027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34",
+ "hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
+ "vout": 209,
+ "scriptSig": {
+ "asm": "304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "3045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374[ALL] 03a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52",
+ "hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "3045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967[ALL] 03a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52",
+ "hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
+ "vout": 21,
+ "scriptSig": {
+ "asm": "3045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
+ "vout": 9,
+ "scriptSig": {
+ "asm": "304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
+ "vout": 30,
+ "scriptSig": {
+ "asm": "30440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
+ "vout": 114,
+ "scriptSig": {
+ "asm": "304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
+ "vout": 103,
+ "scriptSig": {
+ "asm": "3046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec7669018[ALL] 0234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd",
+ "hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a[ALL] 027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34",
+ "hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
+ "vout": 221,
+ "scriptSig": {
+ "asm": "3045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba9074[ALL] 0234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd",
+ "hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
+ "vout": 27,
+ "scriptSig": {
+ "asm": "304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
+ "vout": 1095,
+ "scriptSig": {
+ "asm": "304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
+ "vout": 37,
+ "scriptSig": {
+ "asm": "3045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
+ "vout": 20,
+ "scriptSig": {
+ "asm": "304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
+ "vout": 242,
+ "scriptSig": {
+ "asm": "3046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ }
+ ],
+ "vout": [
+ {
+ "value": 1.3782,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
+ ]
+ }
+ },
+ {
+ "value": 0.01000001,
+ "n": 1,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 6c772e9cf96371bba3da8cb733da70a2fcf20078 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "1AtWkdmfmYkErU16d3KYykJUbEp9MAj9Sb"
+ ]
+ }
+ }
+ ],
+ "hex": "0100000014fd5c23522d31761c50175453daa6edaabe47a602a592d39ce933d8271a1a87274c0100006c493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffc1b37ae964f605978022f94ce2f3f676d66a46d1aef7c2c17d6315b9697f2f75010000006a473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34ffffffffedd005dc7790ef65c206abd1ab718e75252a40f4b1310e4102cd692eca9cacb0d10000006b48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffdf28d6e26fb7a85a1e6a229b972c1bae0edc1c11cb9ca51e4caf5e59fbea35a1000000006b483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52ffffffffae2a2320a1582faa24469eff3024a6b98bfe00eb4f554d8a0b1421ba53bfd6a5010000006c493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffb3cc5a12548aa1794b4d2bbf076838cfd7fbafb7716da51ee8221a4ff19c291b000000006b483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52ffffffff85145367313888d2cf2747274a32e20b2df074027bafd6f970003fcbcdf11d07150000006b483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff8292c11f6d35abab5bac3ebb627a4ff949e8ecd62d33ed137adf7aeb00e512b0090000006b48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff883dcf9a86063db088ad064d0953258d4b0ff3425857402d2f3f839cee0f84581e0000006a4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff6697dbb3ed98afe481b568459fa67e503f8a4254532465a670e54669d19c9fe6720000006a47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff023ffc2182517e1d3fa0896c5b0bd7b4d2ef8a1e42655abe2ced54f657125d59670000006c493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff16f8c77166b0df3d7cc8b5b2ce825afbea9309ad7acd8e2461a255958f81fc06010000006b483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cdffffffff197b96f3c87a3adfaa17f63fddc2a738a690ca665439f9431dbbd655816c41fb000000006c49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34ffffffff20d9a261ee27aa1bd92e7db2fdca935909a40b648e974cd24a10d63b68b94039dd0000006b483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff50f179d5d16cd872f9a63c26c448464ae9bd95cd9421c0476113b5d314571b71010000006b483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cdffffffff551b865d1568ac0a305e5f9c5dae6c540982334efbe789074318e0efc5b564631b0000006b48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff57503e5a016189d407a721791459280875264f908ca2c5d4862c01386e7fb50b470400006b48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff3f16c1fb9d3e1a26d872933e955df85ee7f3f817711062b00b54a2144827349b250000006b483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff4142a69d85b8498af214f0dd427b6ab29c240a0b8577e2944d37a7d8c05c6bb8140000006b48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff36e2feecc0a4bff7480015d42c12121932db389025ed0ac1d344ecee53230a3df20000006c493046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff0260f73608000000001976a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac41420f00000000001976a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac00000000"
+}
diff --git a/src/test/data/tt-delout1-out.json b/src/test/data/tt-delout1-out.json
new file mode 100644
index 0000000000..afc4e95762
--- /dev/null
+++ b/src/test/data/tt-delout1-out.json
@@ -0,0 +1,213 @@
+{
+ "txid": "c46ccd75b5050e942b2e86a3648f843f525fe6fc000bf0534ba5973063354493",
+ "hash": "c46ccd75b5050e942b2e86a3648f843f525fe6fc000bf0534ba5973063354493",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "27871a1a27d833e99cd392a502a647beaaeda6da535417501c76312d52235cfd",
+ "vout": 332,
+ "scriptSig": {
+ "asm": "3046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "a72ec96bd0d022d1b0c2f9078cdd46b3725b8eecdd001e17b21e3ababad14ecb",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "3046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba[ALL] 03e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505",
+ "hex": "493046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba012103e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba[ALL] 027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34",
+ "hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
+ "vout": 209,
+ "scriptSig": {
+ "asm": "304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "3045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374[ALL] 03a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52",
+ "hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "3045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967[ALL] 03a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52",
+ "hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
+ "vout": 21,
+ "scriptSig": {
+ "asm": "3045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
+ "vout": 9,
+ "scriptSig": {
+ "asm": "304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
+ "vout": 30,
+ "scriptSig": {
+ "asm": "30440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
+ "vout": 114,
+ "scriptSig": {
+ "asm": "304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
+ "vout": 103,
+ "scriptSig": {
+ "asm": "3046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec7669018[ALL] 0234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd",
+ "hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a[ALL] 027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34",
+ "hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
+ "vout": 221,
+ "scriptSig": {
+ "asm": "3045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba9074[ALL] 0234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd",
+ "hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
+ "vout": 27,
+ "scriptSig": {
+ "asm": "304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
+ "vout": 1095,
+ "scriptSig": {
+ "asm": "304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
+ "vout": 37,
+ "scriptSig": {
+ "asm": "3045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
+ "vout": 20,
+ "scriptSig": {
+ "asm": "304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
+ "vout": 242,
+ "scriptSig": {
+ "asm": "3046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ }
+ ],
+ "vout": [
+ {
+ "value": 1.3782,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
+ ]
+ }
+ }
+ ],
+ "hex": "0100000015fd5c23522d31761c50175453daa6edaabe47a602a592d39ce933d8271a1a87274c0100006c493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffcb4ed1baba3a1eb2171e00ddec8e5b72b346dd8c07f9c2b0d122d0d06bc92ea7000000006c493046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba012103e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505ffffffffc1b37ae964f605978022f94ce2f3f676d66a46d1aef7c2c17d6315b9697f2f75010000006a473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34ffffffffedd005dc7790ef65c206abd1ab718e75252a40f4b1310e4102cd692eca9cacb0d10000006b48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffdf28d6e26fb7a85a1e6a229b972c1bae0edc1c11cb9ca51e4caf5e59fbea35a1000000006b483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52ffffffffae2a2320a1582faa24469eff3024a6b98bfe00eb4f554d8a0b1421ba53bfd6a5010000006c493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffb3cc5a12548aa1794b4d2bbf076838cfd7fbafb7716da51ee8221a4ff19c291b000000006b483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52ffffffff85145367313888d2cf2747274a32e20b2df074027bafd6f970003fcbcdf11d07150000006b483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff8292c11f6d35abab5bac3ebb627a4ff949e8ecd62d33ed137adf7aeb00e512b0090000006b48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff883dcf9a86063db088ad064d0953258d4b0ff3425857402d2f3f839cee0f84581e0000006a4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff6697dbb3ed98afe481b568459fa67e503f8a4254532465a670e54669d19c9fe6720000006a47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff023ffc2182517e1d3fa0896c5b0bd7b4d2ef8a1e42655abe2ced54f657125d59670000006c493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff16f8c77166b0df3d7cc8b5b2ce825afbea9309ad7acd8e2461a255958f81fc06010000006b483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cdffffffff197b96f3c87a3adfaa17f63fddc2a738a690ca665439f9431dbbd655816c41fb000000006c49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34ffffffff20d9a261ee27aa1bd92e7db2fdca935909a40b648e974cd24a10d63b68b94039dd0000006b483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff50f179d5d16cd872f9a63c26c448464ae9bd95cd9421c0476113b5d314571b71010000006b483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cdffffffff551b865d1568ac0a305e5f9c5dae6c540982334efbe789074318e0efc5b564631b0000006b48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff57503e5a016189d407a721791459280875264f908ca2c5d4862c01386e7fb50b470400006b48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff3f16c1fb9d3e1a26d872933e955df85ee7f3f817711062b00b54a2144827349b250000006b483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff4142a69d85b8498af214f0dd427b6ab29c240a0b8577e2944d37a7d8c05c6bb8140000006b48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff36e2feecc0a4bff7480015d42c12121932db389025ed0ac1d344ecee53230a3df20000006c493046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff0160f73608000000001976a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac00000000"
+}
diff --git a/src/test/data/tt-locktime317000-out.json b/src/test/data/tt-locktime317000-out.json
new file mode 100644
index 0000000000..2b9075f8ac
--- /dev/null
+++ b/src/test/data/tt-locktime317000-out.json
@@ -0,0 +1,226 @@
+{
+ "txid": "aded538f642c17e15f4d3306b8be7e1a4d1ae0c4616d641ab51ea09ba65e5cb5",
+ "hash": "aded538f642c17e15f4d3306b8be7e1a4d1ae0c4616d641ab51ea09ba65e5cb5",
+ "version": 1,
+ "locktime": 317000,
+ "vin": [
+ {
+ "txid": "27871a1a27d833e99cd392a502a647beaaeda6da535417501c76312d52235cfd",
+ "vout": 332,
+ "scriptSig": {
+ "asm": "3046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "a72ec96bd0d022d1b0c2f9078cdd46b3725b8eecdd001e17b21e3ababad14ecb",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "3046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba[ALL] 03e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505",
+ "hex": "493046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba012103e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "752f7f69b915637dc1c2f7aed1466ad676f6f3e24cf922809705f664e97ab3c1",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba[ALL] 027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34",
+ "hex": "473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b0ac9cca2e69cd02410e31b1f4402a25758e71abd1ab06c265ef9077dc05d0ed",
+ "vout": 209,
+ "scriptSig": {
+ "asm": "304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "a135eafb595eaf4c1ea59ccb111cdc0eae1b2c979b226a1e5aa8b76fe2d628df",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "3045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374[ALL] 03a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52",
+ "hex": "483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "a5d6bf53ba21140b8a4d554feb00fe8bb9a62430ff9e4624aa2f58a120232aae",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "1b299cf14f1a22e81ea56d71b7affbd7cf386807bf2b4d4b79a18a54125accb3",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "3045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967[ALL] 03a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52",
+ "hex": "483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "071df1cdcb3f0070f9d6af7b0274f02d0be2324a274727cfd288383167531485",
+ "vout": 21,
+ "scriptSig": {
+ "asm": "3045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b012e500eb7adf7a13ed332dd6ece849f94f7a62bb3eac5babab356d1fc19282",
+ "vout": 9,
+ "scriptSig": {
+ "asm": "304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "58840fee9c833f2f2d40575842f30f4b8d2553094d06ad88b03d06869acf3d88",
+ "vout": 30,
+ "scriptSig": {
+ "asm": "30440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "e69f9cd16946e570a665245354428a3f507ea69f4568b581e4af98edb3db9766",
+ "vout": 114,
+ "scriptSig": {
+ "asm": "304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "595d1257f654ed2cbe5a65421e8aefd2b4d70b5b6c89a03f1d7e518221fc3f02",
+ "vout": 103,
+ "scriptSig": {
+ "asm": "3046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "06fc818f9555a261248ecd7aad0993eafb5a82ceb2b5c87c3ddfb06671c7f816",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec7669018[ALL] 0234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd",
+ "hex": "483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "fb416c8155d6bb1d43f9395466ca90a638a7c2dd3ff617aadf3a7ac8f3967b19",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a[ALL] 027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34",
+ "hex": "49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "3940b9683bd6104ad24c978e640ba4095993cafdb27d2ed91baa27ee61a2d920",
+ "vout": 221,
+ "scriptSig": {
+ "asm": "3045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "711b5714d3b5136147c02194cd95bde94a4648c4263ca6f972d86cd1d579f150",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "3045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba9074[ALL] 0234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd",
+ "hex": "483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cd"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "6364b5c5efe018430789e7fb4e338209546cae5d9c5f5e300aac68155d861b55",
+ "vout": 27,
+ "scriptSig": {
+ "asm": "304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "0bb57f6e38012c86d4c5a28c904f2675082859147921a707d48961015a3e5057",
+ "vout": 1095,
+ "scriptSig": {
+ "asm": "304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "9b34274814a2540bb062107117f8f3e75ef85d953e9372d8261a3e9dfbc1163f",
+ "vout": 37,
+ "scriptSig": {
+ "asm": "3045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "b86b5cc0d8a7374d94e277850b0a249cb26a7b42ddf014f28a49b8859da64241",
+ "vout": 20,
+ "scriptSig": {
+ "asm": "304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321[ALL] 03f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c",
+ "hex": "48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64c"
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "3d0a2353eeec44d3c10aed259038db321912122cd4150048f7bfa4c0ecfee236",
+ "vout": 242,
+ "scriptSig": {
+ "asm": "3046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68[ALL] 03091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc",
+ "hex": "493046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adc"
+ },
+ "sequence": 4294967295
+ }
+ ],
+ "vout": [
+ {
+ "value": 1.3782,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
+ ]
+ }
+ },
+ {
+ "value": 0.01000001,
+ "n": 1,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 6c772e9cf96371bba3da8cb733da70a2fcf20078 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "1AtWkdmfmYkErU16d3KYykJUbEp9MAj9Sb"
+ ]
+ }
+ }
+ ],
+ "hex": "0100000015fd5c23522d31761c50175453daa6edaabe47a602a592d39ce933d8271a1a87274c0100006c493046022100b4251ecd63778a3dde0155abe4cd162947620ae9ee45a874353551092325b116022100db307baf4ff3781ec520bd18f387948cedd15dc27bafe17c894b0fe6ffffcafa012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffcb4ed1baba3a1eb2171e00ddec8e5b72b346dd8c07f9c2b0d122d0d06bc92ea7000000006c493046022100a9b617843b68c284715d3e02fd120479cd0d96a6c43bf01e697fb0a460a21a3a022100ba0a12fbe8b993d4e7911fa3467615765dbe421ddf5c51b57a9c1ee19dcc00ba012103e633b4fa4ceb705c2da712390767199be8ef2448b3095dc01652e11b2b751505ffffffffc1b37ae964f605978022f94ce2f3f676d66a46d1aef7c2c17d6315b9697f2f75010000006a473044022079bd62ee09621a3be96b760c39e8ef78170101d46313923c6b07ae60a95c90670220238e51ea29fc70b04b65508450523caedbb11cb4dd5aa608c81487de798925ba0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34ffffffffedd005dc7790ef65c206abd1ab718e75252a40f4b1310e4102cd692eca9cacb0d10000006b48304502207722d6f9038673c86a1019b1c4de2d687ae246477cd4ca7002762be0299de385022100e594a11e3a313942595f7666dcf7078bcb14f1330f4206b95c917e7ec0e82fac012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffdf28d6e26fb7a85a1e6a229b972c1bae0edc1c11cb9ca51e4caf5e59fbea35a1000000006b483045022100a63a4788027b79b65c6f9d9e054f68cf3b4eed19efd82a2d53f70dcbe64683390220526f243671425b2bd05745fcf2729361f985cfe84ea80c7cfc817b93d8134374012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52ffffffffae2a2320a1582faa24469eff3024a6b98bfe00eb4f554d8a0b1421ba53bfd6a5010000006c493046022100b200ac6db16842f76dab9abe807ce423c992805879bc50abd46ed8275a59d9cf022100c0d518e85dd345b3c29dd4dc47b9a420d3ce817b18720e94966d2fe23413a408012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffffb3cc5a12548aa1794b4d2bbf076838cfd7fbafb7716da51ee8221a4ff19c291b000000006b483045022100ededc441c3103a6f2bd6cab7639421af0f6ec5e60503bce1e603cf34f00aee1c02205cb75f3f519a13fb348783b21db3085cb5ec7552c59e394fdbc3e1feea43f967012103a621f08be22d1bbdcbe4e527ee4927006aa555fc65e2aafa767d4ea2fe9dfa52ffffffff85145367313888d2cf2747274a32e20b2df074027bafd6f970003fcbcdf11d07150000006b483045022100d9eed5413d2a4b4b98625aa6e3169edc4fb4663e7862316d69224454e70cd8ca022061e506521d5ced51dd0ea36496e75904d756a4c4f9fb111568555075d5f68d9a012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff8292c11f6d35abab5bac3ebb627a4ff949e8ecd62d33ed137adf7aeb00e512b0090000006b48304502207e84b27139c4c19c828cb1e30c349bba88e4d9b59be97286960793b5ddc0a2af0221008cdc7a951e7f31c20953ed5635fbabf228e80b7047f32faaa0313e7693005177012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff883dcf9a86063db088ad064d0953258d4b0ff3425857402d2f3f839cee0f84581e0000006a4730440220426540dfed9c4ab5812e5f06df705b8bcf307dd7d20f7fa6512298b2a6314f420220064055096e3ca62f6c7352c66a5447767c53f946acdf35025ab3807ddb2fa404012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff6697dbb3ed98afe481b568459fa67e503f8a4254532465a670e54669d19c9fe6720000006a47304402200a5e673996f2fc88e21cc8613611f08a650bc0370338803591d85d0ec5663764022040b6664a0d1ec83a7f01975b8fde5232992b8ca58bf48af6725d2f92a936ab2e012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff023ffc2182517e1d3fa0896c5b0bd7b4d2ef8a1e42655abe2ced54f657125d59670000006c493046022100d93b30219c5735f673be5c3b4688366d96f545561c74cb62c6958c00f6960806022100ec8200adcb028f2184fa2a4f6faac7f8bb57cb4503bb7584ac11051fece31b3d012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff16f8c77166b0df3d7cc8b5b2ce825afbea9309ad7acd8e2461a255958f81fc06010000006b483045022100a13934e68d3f5b22b130c4cb33f4da468cffc52323a47fbfbe06b64858162246022047081e0a70ff770e64a2e2d31e5d520d9102268b57a47009a72fe73ec766901801210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cdffffffff197b96f3c87a3adfaa17f63fddc2a738a690ca665439f9431dbbd655816c41fb000000006c49304602210097f1f35d5bdc1a3a60390a1b015b8e7c4f916aa3847aafd969e04975e15bbe70022100a9052eb25517d481f1fda1b129eb1b534da50ea1a51f3ee012dca3601c11b86a0121027a759be8df971a6a04fafcb4f6babf75dc811c5cdaa0734cddbe9b942ce75b34ffffffff20d9a261ee27aa1bd92e7db2fdca935909a40b648e974cd24a10d63b68b94039dd0000006b483045022012b3138c591bf7154b6fef457f2c4a3c7162225003788ac0024a99355865ff13022100b71b125ae1ffb2e1d1571f580cd3ebc8cd049a2d7a8a41f138ba94aeb982106f012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff50f179d5d16cd872f9a63c26c448464ae9bd95cd9421c0476113b5d314571b71010000006b483045022100f834ccc8b22ee72712a3e5e6ef4acb8b2fb791b5385b70e2cd4332674d6667f4022024fbda0a997e0c253503f217501f508a4d56edce2c813ecdd9ad796dbeba907401210234b9d9413f247bb78cd3293b7b65a2c38018ba5621ea9ee737f3a6a3523fb4cdffffffff551b865d1568ac0a305e5f9c5dae6c540982334efbe789074318e0efc5b564631b0000006b48304502203b2fd1e39ae0e469d7a15768f262661b0de41470daf0fe8c4fd0c26542a0870002210081c57e331f9a2d214457d953e3542904727ee412c63028113635d7224da3dccc012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff57503e5a016189d407a721791459280875264f908ca2c5d4862c01386e7fb50b470400006b48304502206947a9c54f0664ece4430fd4ae999891dc50bb6126bc36b6a15a3189f29d25e9022100a86cfc4e2fdd9e39a20e305cfd1b76509c67b3e313e0f118229105caa0e823c9012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff3f16c1fb9d3e1a26d872933e955df85ee7f3f817711062b00b54a2144827349b250000006b483045022100c7128fe10b2d38744ae8177776054c29fc8ec13f07207723e70766ab7164847402201d2cf09009b9596de74c0183d1ab832e5edddb7a9965880bb400097e850850f8012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff4142a69d85b8498af214f0dd427b6ab29c240a0b8577e2944d37a7d8c05c6bb8140000006b48304502203b89a71628a28cc3703d170ca3be77786cff6b867e38a18b719705f8a326578f022100b2a9879e1acf621faa6466c207746a7f3eb4c8514c1482969aba3f2a957f1321012103f1575d6124ac78be398c25b31146d08313c6072d23a4d7df5ac6a9f87346c64cffffffff36e2feecc0a4bff7480015d42c12121932db389025ed0ac1d344ecee53230a3df20000006c493046022100ef794a8ef7fd6752d2a183c18866ff6e8dc0f5bd889a63e2c21cf303a6302461022100c1b09662d9e92988c3f9fcf17d1bcc79b5403647095d7212b9f8a1278a532d68012103091137f3ef23f4acfc19a5953a68b2074fae942ad3563ef28c33b0cac9a93adcffffffff0260f73608000000001976a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac41420f00000000001976a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac48d60400"
+}
diff --git a/src/test/data/tx_invalid.json b/src/test/data/tx_invalid.json
index cc059e814f..f8baee0577 100644
--- a/src/test/data/tx_invalid.json
+++ b/src/test/data/tx_invalid.json
@@ -30,10 +30,6 @@
"010000000100010000000000000000000000000000000000000000000000000000000000000000000009085768617420697320ffffffff010000000000000000015100000000", "P2SH"],
["Tests for CheckTransaction()"],
-["No inputs"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7a052c840ba73af26755de42cf01cc9e0a49fef0 EQUAL"]],
-"0100000000010000000000000000015100000000", "P2SH"],
-
["No outputs"],
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x05ab9e14d983742513f0f451e105ffb4198d1dd4 EQUAL"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000006d483045022100f16703104aab4e4088317c862daec83440242411b039d14280e03dd33b487ab802201318a7be236672c5c56083eb7a5a195bc57a40af7923ff8545016cd3b571e2a601232103c40e5d339df3f30bf753e7e04450ae4ef76c9e45587d1d993bdc4cd06f0651c7acffffffff0000000000", "P2SH"],
@@ -127,66 +123,66 @@
["CHECKLOCKTIMEVERIFY tests"],
["By-height locks, with argument just beyond tx nLockTime"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1 CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000fe64cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
["By-time locks, with argument just beyond tx nLockTime (but within numerical boundaries)"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000001 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000001 CHECKLOCKTIMEVERIFY 1"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000feffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
["Argument missing"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000001b1010000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["Argument negative with by-blockheight nLockTime=0"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "-1 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "-1 CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["Argument negative with by-blocktime nLockTime=500,000,000"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "-1 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "-1 CHECKLOCKTIMEVERIFY 1"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000004005194b1010000000100000000000000000002000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["Input locked"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b1ffffffff0100000000000000000002000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["Another input being unlocked isn't sufficient; the CHECKLOCKTIMEVERIFY-using input must be unlocked"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"] ,
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKLOCKTIMEVERIFY 1"] ,
["0000000000000000000000000000000000000000000000000000000000000200", 1, "1"]],
"010000000200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00020000000000000000000000000000000000000000000000000000000000000100000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["Argument/tx height/time mismatch, both versions"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKLOCKTIMEVERIFY 1"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b100000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 CHECKLOCKTIMEVERIFY 1"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
["Argument 2^32 with nLockTime=2^32-1"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967296 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967296 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
["Same, but with nLockTime=2^31-1"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffff7f", "P2SH,CHECKLOCKTIMEVERIFY"],
["6 byte non-minimally-encoded arguments are invalid even if their contents are valid"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x06 0x000000000000 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x06 0x000000000000 CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["Failure due to failing CHECKLOCKTIMEVERIFY in scriptSig"],
@@ -201,5 +197,122 @@
[[["b1dbc81696c8a9c0fccd0693ab66d7c368dbc38c0def4e800685560ddd1b2132", 0, "DUP HASH160 0x14 0x4b3bd7eba3bc0284fd3007be7f3be275e94f5826 EQUALVERIFY CHECKSIG"]],
"010000000132211bdd0d568506804eef0d8cc3db68c3d766ab9306cdfcc0a9c89616c8dbb1000000006c493045022100c7bb0faea0522e74ff220c20c022d2cb6033f8d167fb89e75a50e237a35fd6d202203064713491b1f8ad5f79e623d0219ad32510bfaa1009ab30cbee77b59317d6e30001210237af13eb2d84e4545af287b919c2282019c9691cc509e78e196a9d8274ed1be0ffffffff0100000000000000001976a914f1b3ed2eda9a2ebe5a9374f692877cdf87c0f95b88ac00000000", "P2SH,DERSIG"],
+["CHECKSEQUENCEVERIFY tests"],
+
+["By-height locks, with argument just beyond txin.nSequence"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feff40000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["By-time locks, with argument just beyond txin.nSequence (but within numerical boundries)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194305 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feff40000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Argument missing"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Argument negative with by-blockheight txin.nSequence=0"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "-1 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Argument negative with by-blocktime txin.nSequence=CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "-1 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Argument/tx height/time mismatch, both versions"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "65535 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194304 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["6 byte non-minimally-encoded arguments are invalid even if their contents are valid"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x06 0x000000000000 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Failure due to failing CHECKSEQUENCEVERIFY in scriptSig"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1"]],
+"02000000010001000000000000000000000000000000000000000000000000000000000000000000000251b2000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Failure due to failing CHECKSEQUENCEVERIFY in redeemScript"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7c17aff532f22beb54069942f9bf567a66133eaf EQUAL"]],
+"0200000001000100000000000000000000000000000000000000000000000000000000000000000000030251b2000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Failure due to insufficient tx.nVersion (<2)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKSEQUENCEVERIFY 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194304 CHECKSEQUENCEVERIFY 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Unknown witness program version (with DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x60 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002483045022100a3cec69b52cba2d2de623ffffffffff1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"],
+
+["Unknown length for witness program v0"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x15 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3fff", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff04b60300000000000001519e070000000000000151860b0000000000000100960000000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash Single|AnyoneCanPay (same index output value changed)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e80300000000000001516c070000000000000151b80b0000000000000151000248304502210092f4777a0f17bf5aeb8ae768dec5f2c14feabf9d1fe2c89c78dfed0f13fdb86902206da90a86042e252bcd1e80a168c719e4a1ddcc3cebea24b9812c5453c79107e9832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash None|AnyoneCanPay (input sequence changed)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff000100000000000000000000000000000000000000000000000000000000000001000000000100000000010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00000248304502210091b32274295c2a3fa02f5bce92fb2789e3fc6ea947fbe1a76e52ea3f4ef2381a022079ad72aefa3837a2e0c033a8652a59731da05fa4a813f4fc48e87c075037256b822103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash All|AnyoneCanPay (third output value changed)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151540b00000000000001510002483045022100a3cec69b52cba2d2de623eeef89e0ba1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with a push of 521 bytes"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x20 0x33198a9bfef674ebddb9ffaa52928017b8472791e54c609cb95f278ac6b1e349", 1000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015102fd0902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002755100000000", "P2SH,WITNESS"],
+
+["Witness with unknown version which push false on the stack should be invalid (even without DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x60 0x02 0x0000", 2000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015101010100000000", "P2SH,WITNESS"],
+
+["Witness program should leave clean stack"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x20 0x2f04a3aa051f1f60d695f6c44c0c3d383973dfd446ace8962664a76bb10e31a8", 2000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01000000000000000001510102515100000000", "P2SH,WITNESS"],
+
+["Witness v0 with a push of 2 bytes"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x02 0x0001", 2000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015101040002000100000000", "P2SH,WITNESS"],
+
+["Unknown witness version with non empty scriptSig"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x60 0x02 0x0001", 2000]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000151ffffffff010000000000000000015100000000", "P2SH,WITNESS"],
+
+["Non witness Single|AnyoneCanPay hash input's position (permutation)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG", 1001]],
+"010000000200010000000000000000000000000000000000000000000000000000000000000100000049483045022100acb96cfdbda6dc94b489fd06f2d720983b5f350e31ba906cdbd800773e80b21c02200d74ea5bdf114212b4bbe9ed82c36d2e369e302dff57cb60d01c428f0bd3daab83ffffffff0001000000000000000000000000000000000000000000000000000000000000000000004847304402202a0b4b1294d70540235ae033d78e64b4897ec859c7b6f1b2b1d8a02e1d46006702201445e756d2254b0f1dfda9ab8e1e1bc26df9668077403204f32d16a49a36eb6983ffffffff02e9030000000000000151e803000000000000015100000000", "P2SH,WITNESS"],
+
+["P2WSH with a redeem representing a witness scriptPubKey should fail"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x20 0x34b6c399093e06cf9f0f7f660a1abcfe78fcf7b576f43993208edd9518a0ae9b", 1000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0001045102010100000000", "P2SH,WITNESS"],
+
+["33 bytes push should be considered a witness scriptPubKey"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x60 0x21 0xff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3dbff", 1000]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"],
+
["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 0dfef73ae5..1ea70135b4 100644
--- a/src/test/data/tx_valid.json
+++ b/src/test/data/tx_valid.json
@@ -190,35 +190,35 @@
["CHECKLOCKTIMEVERIFY tests"],
["By-height locks, with argument == 0 and == tx nLockTime"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
["By-time locks, with argument just beyond tx nLockTime (but within numerical boundaries)"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 CHECKLOCKTIMEVERIFY 1"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
["Any non-maxint nSequence is fine"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["The argument can be calculated rather than created directly by a PUSHDATA"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 1ADD NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 1ADD CHECKLOCKTIMEVERIFY 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"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483647 2147483647 ADD CHECKLOCKTIMEVERIFY 1"]],
"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000feffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
["5 byte non-minimally-encoded arguments are valid"],
-[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x05 0x0000000000 NOP2 1"]],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x05 0x0000000000 CHECKLOCKTIMEVERIFY 1"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["Valid CHECKLOCKTIMEVERIFY in scriptSig"],
@@ -233,5 +233,259 @@
[[["b1dbc81696c8a9c0fccd0693ab66d7c368dbc38c0def4e800685560ddd1b2132", 0, "DUP HASH160 0x14 0x4b3bd7eba3bc0284fd3007be7f3be275e94f5826 EQUALVERIFY CHECKSIG"]],
"010000000132211bdd0d568506804eef0d8cc3db68c3d766ab9306cdfcc0a9c89616c8dbb1000000006c493045022100c7bb0faea0522e74ff220c20c022d2cb6033f8d167fb89e75a50e237a35fd6d202203064713491b1f8ad5f79e623d0219ad32510bfaa1009ab30cbee77b59317d6e30001210237af13eb2d84e4545af287b919c2282019c9691cc509e78e196a9d8274ed1be0ffffffff0100000000000000001976a914f1b3ed2eda9a2ebe5a9374f692877cdf87c0f95b88ac00000000", "P2SH"],
+["CHECKSEQUENCEVERIFY tests"],
+
+["By-height locks, with argument == 0 and == txin.nSequence"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "65535 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "65535 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["By-time locks, with argument == 0 and == txin.nSequence"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194304 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff40000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194304 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Upper sequence with upper sequence is fine"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Argument 2^31 with various nSequence"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Argument 2^32-1 with various nSequence"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Argument 3<<31 with various nSequence"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "6442450944 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "6442450944 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "6442450944 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["5 byte non-minimally-encoded operandss are valid"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x05 0x0000000000 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["The argument can be calculated rather than created directly by a PUSHDATA"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194303 1ADD CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194304 1SUB CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["An ADD producing a 5-byte result that sets CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483647 65536 CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483647 4259840 ADD CHECKSEQUENCEVERIFY 1"]],
+"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Valid CHECKSEQUENCEVERIFY in scriptSig"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1"]],
+"02000000010001000000000000000000000000000000000000000000000000000000000000000000000251b2010000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Valid CHECKSEQUENCEVERIFY in redeemScript"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7c17aff532f22beb54069942f9bf567a66133eaf EQUAL"]],
+"0200000001000100000000000000000000000000000000000000000000000000000000000000000000030251b2010000000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"],
+
+["Valid P2WPKH (Private key of segwit tests is L5AQtV2HDm4xGsseLokK2VAT2EtYKcTm3c7HwqnJBFt9LdaQULsM)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100cfb07164b36ba64c1b1e8c7720a56ad64d96f6ef332d3d37f9cb3c96477dc44502200a464cd7a9cf94cd70f66ce4f4f0625ef650052c7afcfe29d7d7e01830ff91ed012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", "P2SH,WITNESS"],
+
+["Valid P2WSH"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x20 0xff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3db", 1000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100aa5d8aa40a90f23ce2c3d11bc845ca4a12acd99cbea37de6b9f6d86edebba8cb022022dedc2aa0a255f74d04c0b76ece2d7c691f9dd11a64a8ac49f62a99c3a05f9d01232103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ac00000000", "P2SH,WITNESS"],
+
+["Valid P2SH(P2WPKH)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0xfe9c7dacc9fcfbf7e3b7d5ad06aa2b28c5a7b7e3 EQUAL", 1000]],
+"01000000000101000100000000000000000000000000000000000000000000000000000000000000000000171600144c9c3dfac4207d5d8cb89df5722cb3d712385e3fffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100cfb07164b36ba64c1b1e8c7720a56ad64d96f6ef332d3d37f9cb3c96477dc44502200a464cd7a9cf94cd70f66ce4f4f0625ef650052c7afcfe29d7d7e01830ff91ed012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", "P2SH,WITNESS"],
+
+["Valid P2SH(P2WSH)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x2135ab4f0981830311e35600eebc7376dce3a914 EQUAL", 1000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000023220020ff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3dbffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100aa5d8aa40a90f23ce2c3d11bc845ca4a12acd99cbea37de6b9f6d86edebba8cb022022dedc2aa0a255f74d04c0b76ece2d7c691f9dd11a64a8ac49f62a99c3a05f9d01232103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ac00000000", "P2SH,WITNESS"],
+
+["Witness with SigHash Single|AnyoneCanPay"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1100],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3100],
+["0000000000000000000000000000000000000000000000000000000000000100", 3, "0x51", 4100]],
+"0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff05540b0000000000000151d0070000000000000151840300000000000001513c0f00000000000001512c010000000000000151000248304502210092f4777a0f17bf5aeb8ae768dec5f2c14feabf9d1fe2c89c78dfed0f13fdb86902206da90a86042e252bcd1e80a168c719e4a1ddcc3cebea24b9812c5453c79107e9832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71000000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash Single|AnyoneCanPay (same signature as previous)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000248304502210092f4777a0f17bf5aeb8ae768dec5f2c14feabf9d1fe2c89c78dfed0f13fdb86902206da90a86042e252bcd1e80a168c719e4a1ddcc3cebea24b9812c5453c79107e9832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash Single"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff0484030000000000000151d0070000000000000151540b0000000000000151c800000000000000015100024730440220699e6b0cfe015b64ca3283e6551440a34f901ba62dd4c72fe1cb815afb2e6761022021cc5e84db498b1479de14efda49093219441adc6c543e5534979605e273d80b032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash Single (same signature as previous)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b000000000000015100024730440220699e6b0cfe015b64ca3283e6551440a34f901ba62dd4c72fe1cb815afb2e6761022021cc5e84db498b1479de14efda49093219441adc6c543e5534979605e273d80b032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash None|AnyoneCanPay"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1100],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3100],
+["0000000000000000000000000000000000000000000000000000000000000100", 3, "0x51", 4100]],
+"0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff04b60300000000000001519e070000000000000151860b00000000000001009600000000000000015100000248304502210091b32274295c2a3fa02f5bce92fb2789e3fc6ea947fbe1a76e52ea3f4ef2381a022079ad72aefa3837a2e0c033a8652a59731da05fa4a813f4fc48e87c075037256b822103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash None|AnyoneCanPay (same signature as previous)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000248304502210091b32274295c2a3fa02f5bce92fb2789e3fc6ea947fbe1a76e52ea3f4ef2381a022079ad72aefa3837a2e0c033a8652a59731da05fa4a813f4fc48e87c075037256b822103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash None"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff04b60300000000000001519e070000000000000151860b0000000000000100960000000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash None (same signature as previous)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash None (same signature, only sequences changed)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"01000000000103000100000000000000000000000000000000000000000000000000000000000000000000000200000000010000000000000000000000000000000000000000000000000000000000000100000000ffffffff000100000000000000000000000000000000000000000000000000000000000002000000000200000003e8030000000000000151d0070000000000000151b80b00000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash All|AnyoneCanPay"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1100],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3100],
+["0000000000000000000000000000000000000000000000000000000000000100", 3, "0x51", 4100]],
+"0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000002483045022100a3cec69b52cba2d2de623eeef89e0ba1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with SigHash All|AnyoneCanPay (same signature as previous)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002483045022100a3cec69b52cba2d2de623eeef89e0ba1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Unknown witness program version (without DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x60 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 2000],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "0x51", 3000]],
+"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002483045022100a3cec69b52cba2d2de623ffffffffff1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Witness with a push of 520 bytes"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x20 0x33198a9bfef674ebddb9ffaa52928017b8472791e54c609cb95f278ac6b1e349", 1000]],
+"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015102fd08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002755100000000", "P2SH,WITNESS"],
+
+["Transaction mixing all SigHash, segwit and normal inputs"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1001],
+["0000000000000000000000000000000000000000000000000000000000000100", 2, "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", 1002],
+["0000000000000000000000000000000000000000000000000000000000000100", 3, "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", 1003],
+["0000000000000000000000000000000000000000000000000000000000000100", 4, "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", 1004],
+["0000000000000000000000000000000000000000000000000000000000000100", 5, "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", 1005],
+["0000000000000000000000000000000000000000000000000000000000000100", 6, "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", 1006],
+["0000000000000000000000000000000000000000000000000000000000000100", 7, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1007],
+["0000000000000000000000000000000000000000000000000000000000000100", 8, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1008],
+["0000000000000000000000000000000000000000000000000000000000000100", 9, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1009],
+["0000000000000000000000000000000000000000000000000000000000000100", 10, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1010],
+["0000000000000000000000000000000000000000000000000000000000000100", 11, "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", 1011]],
+"0100000000010c00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff0001000000000000000000000000000000000000000000000000000000000000020000006a473044022026c2e65b33fcd03b2a3b0f25030f0244bd23cc45ae4dec0f48ae62255b1998a00220463aa3982b718d593a6b9e0044513fd67a5009c2fdccc59992cffc2b167889f4012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000030000006a4730440220008bd8382911218dcb4c9f2e75bf5c5c3635f2f2df49b36994fde85b0be21a1a02205a539ef10fb4c778b522c1be852352ea06c67ab74200977c722b0bc68972575a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000040000006b483045022100d9436c32ff065127d71e1a20e319e4fe0a103ba0272743dbd8580be4659ab5d302203fd62571ee1fe790b182d078ecfd092a509eac112bea558d122974ef9cc012c7012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000050000006a47304402200e2c149b114ec546015c13b2b464bbcb0cdc5872e6775787527af6cbc4830b6c02207e9396c6979fb15a9a2b96ca08a633866eaf20dc0ff3c03e512c1d5a1654f148012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000060000006b483045022100b20e70d897dc15420bccb5e0d3e208d27bdd676af109abbd3f88dbdb7721e6d6022005836e663173fbdfe069f54cde3c2decd3d0ea84378092a5d9d85ec8642e8a41012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff00010000000000000000000000000000000000000000000000000000000000000700000000ffffffff00010000000000000000000000000000000000000000000000000000000000000800000000ffffffff00010000000000000000000000000000000000000000000000000000000000000900000000ffffffff00010000000000000000000000000000000000000000000000000000000000000a00000000ffffffff00010000000000000000000000000000000000000000000000000000000000000b0000006a47304402206639c6e05e3b9d2675a7f3876286bdf7584fe2bbd15e0ce52dd4e02c0092cdc60220757d60b0a61fc95ada79d23746744c72bac1545a75ff6c2c7cdb6ae04e7e9592012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0ce8030000000000000151e9030000000000000151ea030000000000000151eb030000000000000151ec030000000000000151ed030000000000000151ee030000000000000151ef030000000000000151f0030000000000000151f1030000000000000151f2030000000000000151f30300000000000001510248304502210082219a54f61bf126bfc3fa068c6e33831222d1d7138c6faa9d33ca87fd4202d6022063f9902519624254d7c2c8ea7ba2d66ae975e4e229ae38043973ec707d5d4a83012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7102473044022017fb58502475848c1b09f162cb1688d0920ff7f142bed0ef904da2ccc88b168f02201798afa61850c65e77889cbcd648a5703b487895517c88f85cdd18b021ee246a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000000247304402202830b7926e488da75782c81a54cd281720890d1af064629ebf2e31bf9f5435f30220089afaa8b455bbeb7d9b9c3fe1ed37d07685ade8455c76472cda424d93e4074a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7102473044022026326fcdae9207b596c2b05921dbac11d81040c4d40378513670f19d9f4af893022034ecd7a282c0163b89aaa62c22ec202cef4736c58cd251649bad0d8139bcbf55012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71024730440220214978daeb2f38cd426ee6e2f44131a33d6b191af1c216247f1dd7d74c16d84a02205fdc05529b0bc0c430b4d5987264d9d075351c4f4484c16e91662e90a72aab24012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710247304402204a6e9f199dc9672cf2ff8094aaa784363be1eb62b679f7ff2df361124f1dca3302205eeb11f70fab5355c9c8ad1a0700ea355d315e334822fa182227e9815308ee8f012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", "P2SH,WITNESS"],
+
+["Unknown version witness program with empty witness"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x60 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1000]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", "P2SH,WITNESS"],
+
+["Witness SIGHASH_SINGLE with output out of bound"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x51", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x20 0x4d6c2a32c87821d68fc016fca70797abdb80df6cd84651d40a9300c6bad79e62", 1000]],
+"0100000000010200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff01d00700000000000001510003483045022100e078de4e96a0e05dcdc0a414124dd8475782b5f3f0ed3f607919e9a5eeeb22bf02201de309b3a3109adb3de8074b3610d4cf454c49b61247a2779a0bcbf31c889333032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc711976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac00000000", "P2SH,WITNESS"],
+
+["1 byte push should not be considered a witness scriptPubKey"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x60 0x01 0x01", 1000]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"],
+
+["41 bytes push should not be considered a witness scriptPubKey"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x60 0x29 0xff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3dbff0000000000000000", 1000]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"],
+
+["The witness version must use OP_1 to OP_16 only"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x01 0x10 0x02 0x0001", 1000]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"],
+
+["The witness program push must be canonical"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x60 0x4c02 0x0001", 1000]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"],
+
+["Witness Single|AnyoneCanPay does not hash input's position"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1001]],
+"0100000000010200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff02e8030000000000000151e90300000000000001510247304402206d59682663faab5e4cb733c562e22cdae59294895929ec38d7c016621ff90da0022063ef0af5f970afe8a45ea836e3509b8847ed39463253106ac17d19c437d3d56b832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710248304502210085001a820bfcbc9f9de0298af714493f8a37b3b354bfd21a7097c3e009f2018c022050a8b4dbc8155d4d04da2f5cdd575dcf8dd0108de8bec759bd897ea01ecb3af7832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", "P2SH,WITNESS"],
+
+["Witness Single|AnyoneCanPay does not hash input's position (permutation)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1001]],
+"0100000000010200010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff02e9030000000000000151e80300000000000001510248304502210085001a820bfcbc9f9de0298af714493f8a37b3b354bfd21a7097c3e009f2018c022050a8b4dbc8155d4d04da2f5cdd575dcf8dd0108de8bec759bd897ea01ecb3af7832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710247304402206d59682663faab5e4cb733c562e22cdae59294895929ec38d7c016621ff90da0022063ef0af5f970afe8a45ea836e3509b8847ed39463253106ac17d19c437d3d56b832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", "P2SH,WITNESS"],
+
+["Non witness Single|AnyoneCanPay hash input's position"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG", 1000],
+["0000000000000000000000000000000000000000000000000000000000000100", 1, "0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG", 1001]],
+"01000000020001000000000000000000000000000000000000000000000000000000000000000000004847304402202a0b4b1294d70540235ae033d78e64b4897ec859c7b6f1b2b1d8a02e1d46006702201445e756d2254b0f1dfda9ab8e1e1bc26df9668077403204f32d16a49a36eb6983ffffffff00010000000000000000000000000000000000000000000000000000000000000100000049483045022100acb96cfdbda6dc94b489fd06f2d720983b5f350e31ba906cdbd800773e80b21c02200d74ea5bdf114212b4bbe9ed82c36d2e369e302dff57cb60d01c428f0bd3daab83ffffffff02e8030000000000000151e903000000000000015100000000", "P2SH,WITNESS"],
+
+["BIP143 examples: details and private keys are available in BIP143"],
+["BIP143 example: P2WSH with OP_CODESEPARATOR and out-of-range SIGHASH_SINGLE."],
+[[["6eb316926b1c5d567cd6f5e6a84fec606fc53d7b474526d1fff3948020c93dfe", 0, "0x21 0x036d5c20fa14fb2f635474c1dc4ef5909d4568e5569b79fc94d3448486e14685f8 CHECKSIG", 156250000],
+["f825690aee1b3dc247da796cacb12687a5e802429fd291cfd63e010f02cf1508", 0, "0x00 0x20 0x5d1b56b63d714eebe542309525f484b7e9d6f686b3781b6f61ef925d66d6f6a0", 4900000000]],
+"01000000000102fe3dc9208094f3ffd12645477b3dc56f60ec4fa8e6f5d67c565d1c6b9216b36e000000004847304402200af4e47c9b9629dbecc21f73af989bdaa911f7e6f6c2e9394588a3aa68f81e9902204f3fcf6ade7e5abb1295b6774c8e0abd94ae62217367096bc02ee5e435b67da201ffffffff0815cf020f013ed6cf91d29f4202e8a58726b1ac6c79da47c23d1bee0a6925f80000000000ffffffff0100f2052a010000001976a914a30741f8145e5acadf23f751864167f32e0963f788ac000347304402200de66acf4527789bfda55fc5459e214fa6083f936b430a762c629656216805ac0220396f550692cd347171cbc1ef1f51e15282e837bb2b30860dc77c8f78bc8501e503473044022027dc95ad6b740fe5129e7e62a75dd00f291a2aeb1200b84b09d9e3789406b6c002201a9ecd315dd6a0e632ab20bbb98948bc0c6fb204f2c286963bb48517a7058e27034721026dccc749adc2a9d0d89497ac511f760f45c47dc5ed9cf352a58ac706453880aeadab210255a9626aebf5e29c0e6538428ba0d1dcf6ca98ffdf086aa8ced5e0d0215ea465ac00000000", "P2SH,WITNESS"],
+
+["BIP143 example: P2WSH with unexecuted OP_CODESEPARATOR and SINGLE|ANYONECANPAY"],
+[[["01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9", 0, "0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d", 16777215],
+["1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680", 0, "0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537", 16777215]],
+"01000000000102e9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff80e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffff0280969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac80969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS"],
+
+["BIP143 example: Same as the previous example with input-output paris swapped"],
+[[["1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680", 0, "0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537", 16777215],
+["01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9", 0, "0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d", 16777215]],
+"0100000000010280e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffffe9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff0280969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac80969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS"],
+
+["BIP143 example: P2SH-P2WSH 6-of-6 multisig signed with 6 different SIGHASH types"],
+[[["6eb98797a21c6c10aa74edf29d618be109f48a8e94c694f3701e08ca69186436", 1, "HASH160 0x14 0x9993a429037b5d912407a71c252019287b8d27a5 EQUAL", 987654321]],
+"0100000000010136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000023220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac080047304402206ac44d672dac41f9b00e28f4df20c52eeb087207e8d758d76d92c6fab3b73e2b0220367750dbbe19290069cba53d096f44530e4f98acaa594810388cf7409a1870ce01473044022068c7946a43232757cbdf9176f009a928e1cd9a1a8c212f15c1e11ac9f2925d9002205b75f937ff2f9f3c1246e547e54f62e027f64eefa2695578cc6432cdabce271502473044022059ebf56d98010a932cf8ecfec54c48e6139ed6adb0728c09cbe1e4fa0915302e022007cd986c8fa870ff5d2b3a89139c9fe7e499259875357e20fcbb15571c76795403483045022100fbefd94bd0a488d50b79102b5dad4ab6ced30c4069f1eaa69a4b5a763414067e02203156c6a5c9cf88f91265f5a942e96213afae16d83321c8b31bb342142a14d16381483045022100a5263ea0553ba89221984bd7f0b13613db16e7a70c549a86de0cc0444141a407022005c360ef0ae5a5d4f9f2f87a56c1546cc8268cab08c73501d6b3be2e1e1a8a08824730440220525406a1482936d5a21888260dc165497a90a15669636d8edca6b9fe490d309c022032af0c646a34a44d1f4576bf6a4a74b67940f8faa84c7df9abe12a01a11e2b4783cf56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae00000000", "P2SH,WITNESS"],
+
["Make diffs cleaner by leaving a comment here without comma at the end"]
]
diff --git a/src/test/data/txcreate1.json b/src/test/data/txcreate1.json
new file mode 100644
index 0000000000..567e8026a3
--- /dev/null
+++ b/src/test/data/txcreate1.json
@@ -0,0 +1,64 @@
+{
+ "txid": "f70f0d6c71416ed538e37549f430ab3665fee2437a42f10238c1bd490e782231",
+ "hash": "f70f0d6c71416ed538e37549f430ab3665fee2437a42f10238c1bd490e782231",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "",
+ "hex": ""
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "bf829c6bcf84579331337659d31f89dfd138f7f7785802d5501c92333145ca7c",
+ "vout": 18,
+ "scriptSig": {
+ "asm": "",
+ "hex": ""
+ },
+ "sequence": 4294967295
+ },
+ {
+ "txid": "22a6f904655d53ae2ff70e701a0bbd90aa3975c0f40bfc6cc996a9049e31cdfc",
+ "vout": 1,
+ "scriptSig": {
+ "asm": "",
+ "hex": ""
+ },
+ "sequence": 4294967295
+ }
+ ],
+ "vout": [
+ {
+ "value": 0.18,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
+ ]
+ }
+ },
+ {
+ "value": 4.00,
+ "n": 1,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 f2d4db28cad6502226ee484ae24505c2885cb12d OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a914f2d4db28cad6502226ee484ae24505c2885cb12d88ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "1P8yWvZW8jVihP1bzHeqfE4aoXNX8AVa46"
+ ]
+ }
+ }
+ ],
+ "hex": "01000000031f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000ffffffff7cca453133921c50d5025878f7f738d1df891fd359763331935784cf6b9c82bf1200000000fffffffffccd319e04a996c96cfc0bf4c07539aa90bd0b1a700ef72fae535d6504f9a6220100000000ffffffff0280a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac0084d717000000001976a914f2d4db28cad6502226ee484ae24505c2885cb12d88ac00000000"
+}
diff --git a/src/test/data/txcreate2.json b/src/test/data/txcreate2.json
new file mode 100644
index 0000000000..a70c1d302a
--- /dev/null
+++ b/src/test/data/txcreate2.json
@@ -0,0 +1,20 @@
+{
+ "txid": "cf90229625e9eb10f6be8156bf6aa5ec2eca19a42b1e05c11f3029b560a32e13",
+ "hash": "cf90229625e9eb10f6be8156bf6aa5ec2eca19a42b1e05c11f3029b560a32e13",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ ],
+ "vout": [
+ {
+ "value": 0.00,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "",
+ "hex": "",
+ "type": "nonstandard"
+ }
+ }
+ ],
+ "hex": "01000000000100000000000000000000000000"
+}
diff --git a/src/test/data/txcreatedata1.json b/src/test/data/txcreatedata1.json
new file mode 100644
index 0000000000..760518d30a
--- /dev/null
+++ b/src/test/data/txcreatedata1.json
@@ -0,0 +1,42 @@
+{
+ "txid": "07894b4d12fe7853dd911402db1620920d261b9627c447f931417d330c25f06e",
+ "hash": "07894b4d12fe7853dd911402db1620920d261b9627c447f931417d330c25f06e",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "",
+ "hex": ""
+ },
+ "sequence": 4294967295
+ }
+ ],
+ "vout": [
+ {
+ "value": 0.18,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
+ ]
+ }
+ },
+ {
+ "value": 4.00,
+ "n": 1,
+ "scriptPubKey": {
+ "asm": "OP_RETURN 54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e",
+ "hex": "6a4c4f54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e",
+ "type": "nulldata"
+ }
+ }
+ ],
+ "hex": "01000000011f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000ffffffff0280a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac0084d71700000000526a4c4f54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e00000000"
+}
diff --git a/src/test/data/txcreatedata2.json b/src/test/data/txcreatedata2.json
new file mode 100644
index 0000000000..56dfe4a1b0
--- /dev/null
+++ b/src/test/data/txcreatedata2.json
@@ -0,0 +1,42 @@
+{
+ "txid": "4ed17118f5e932ba8c75c461787d171bc02a016d8557cb5bcf34cd416c27bb8b",
+ "hash": "4ed17118f5e932ba8c75c461787d171bc02a016d8557cb5bcf34cd416c27bb8b",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "",
+ "hex": ""
+ },
+ "sequence": 4294967295
+ }
+ ],
+ "vout": [
+ {
+ "value": 0.18,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
+ ]
+ }
+ },
+ {
+ "value": 0.00,
+ "n": 1,
+ "scriptPubKey": {
+ "asm": "OP_RETURN 54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e",
+ "hex": "6a4c4f54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e",
+ "type": "nulldata"
+ }
+ }
+ ],
+ "hex": "01000000011f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000ffffffff0280a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac0000000000000000526a4c4f54686973204f505f52455455524e207472616e73616374696f6e206f7574707574207761732063726561746564206279206d6f646966696564206372656174657261777472616e73616374696f6e2e00000000"
+}
diff --git a/src/test/data/txcreatedata_seq0.hex b/src/test/data/txcreatedata_seq0.hex
new file mode 100644
index 0000000000..db02b5e4a4
--- /dev/null
+++ b/src/test/data/txcreatedata_seq0.hex
@@ -0,0 +1 @@
+01000000011f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000fdffffff0180a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac00000000
diff --git a/src/test/data/txcreatedata_seq0.json b/src/test/data/txcreatedata_seq0.json
new file mode 100644
index 0000000000..9bc0ed4593
--- /dev/null
+++ b/src/test/data/txcreatedata_seq0.json
@@ -0,0 +1,33 @@
+{
+ "txid": "71603ccb1cd76d73d76eb6cfd5f0b9df6d65d90d76860ee52cb461c4be7032e8",
+ "hash": "71603ccb1cd76d73d76eb6cfd5f0b9df6d65d90d76860ee52cb461c4be7032e8",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "",
+ "hex": ""
+ },
+ "sequence": 4294967293
+ }
+ ],
+ "vout": [
+ {
+ "value": 0.18,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
+ ]
+ }
+ }
+ ],
+ "hex": "01000000011f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000fdffffff0180a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac00000000"
+}
diff --git a/src/test/data/txcreatedata_seq1.hex b/src/test/data/txcreatedata_seq1.hex
new file mode 100644
index 0000000000..4cedcd975c
--- /dev/null
+++ b/src/test/data/txcreatedata_seq1.hex
@@ -0,0 +1 @@
+01000000021f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000fdffffff1f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000010000000180a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac00000000
diff --git a/src/test/data/txcreatedata_seq1.json b/src/test/data/txcreatedata_seq1.json
new file mode 100644
index 0000000000..d323255418
--- /dev/null
+++ b/src/test/data/txcreatedata_seq1.json
@@ -0,0 +1,42 @@
+{
+ "txid": "c4dea671b0d7b48f8ab10bc46650e8329d3c5766931f548f513847a19f5ba75b",
+ "hash": "c4dea671b0d7b48f8ab10bc46650e8329d3c5766931f548f513847a19f5ba75b",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "",
+ "hex": ""
+ },
+ "sequence": 4294967293
+ },
+ {
+ "txid": "5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "",
+ "hex": ""
+ },
+ "sequence": 1
+ }
+ ],
+ "vout": [
+ {
+ "value": 0.18,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
+ ]
+ }
+ }
+ ],
+ "hex": "01000000021f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000fdffffff1f5c38dfcf6f1a5f5a87c416076d392c87e6d41970d5ad5e477a02d66bde97580000000000010000000180a81201000000001976a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac00000000"
+}
diff --git a/src/test/data/txcreatesign.json b/src/test/data/txcreatesign.json
new file mode 100644
index 0000000000..ff39e71b40
--- /dev/null
+++ b/src/test/data/txcreatesign.json
@@ -0,0 +1,33 @@
+{
+ "txid": "977e7cd286cb72cd470d539ba6cb48400f8f387d97451d45cdb8819437a303af",
+ "hash": "977e7cd286cb72cd470d539ba6cb48400f8f387d97451d45cdb8819437a303af",
+ "version": 1,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485",
+ "vout": 0,
+ "scriptSig": {
+ "asm": "304502210096a75056c9e2cc62b7214777b3d2a592cfda7092520126d4ebfcd6d590c99bd8022051bb746359cf98c0603f3004477eac68701132380db8facba19c89dc5ab5c5e2[ALL] 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+ "hex": "48304502210096a75056c9e2cc62b7214777b3d2a592cfda7092520126d4ebfcd6d590c99bd8022051bb746359cf98c0603f3004477eac68701132380db8facba19c89dc5ab5c5e201410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
+ },
+ "sequence": 4294967295
+ }
+ ],
+ "vout": [
+ {
+ "value": 0.001,
+ "n": 0,
+ "scriptPubKey": {
+ "asm": "OP_DUP OP_HASH160 5834479edbbe0539b31ffd3a8f8ebadc2165ed01 OP_EQUALVERIFY OP_CHECKSIG",
+ "hex": "76a9145834479edbbe0539b31ffd3a8f8ebadc2165ed0188ac",
+ "reqSigs": 1,
+ "type": "pubkeyhash",
+ "addresses": [
+ "193P6LtvS4nCnkDvM9uXn1gsSRqh4aDAz7"
+ ]
+ }
+ }
+ ],
+ "hex": "01000000018594c5bdcaec8f06b78b596f31cd292a294fd031e24eec716f43dac91ea7494d000000008b48304502210096a75056c9e2cc62b7214777b3d2a592cfda7092520126d4ebfcd6d590c99bd8022051bb746359cf98c0603f3004477eac68701132380db8facba19c89dc5ab5c5e201410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ffffffff01a0860100000000001976a9145834479edbbe0539b31ffd3a8f8ebadc2165ed0188ac00000000"
+}
diff --git a/src/test/dbwrapper_tests.cpp b/src/test/dbwrapper_tests.cpp
index 8b6b0697ab..d4d825d199 100644
--- a/src/test/dbwrapper_tests.cpp
+++ b/src/test/dbwrapper_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
@@ -39,7 +39,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper)
uint256 res;
// Ensure that we're doing real obfuscation when obfuscate=true
- BOOST_CHECK(obfuscate != is_null_key(dbw.GetObfuscateKey()));
+ BOOST_CHECK(obfuscate != is_null_key(dbwrapper_private::GetObfuscateKey(dbw)));
BOOST_CHECK(dbw.Write(key, in));
BOOST_CHECK(dbw.Read(key, res));
@@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_batch)
uint256 in3 = GetRandHash();
uint256 res;
- CDBBatch batch(&dbw.GetObfuscateKey());
+ CDBBatch batch(dbw);
batch.Write(key, in);
batch.Write(key2, in2);
@@ -101,7 +101,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
uint256 in2 = GetRandHash();
BOOST_CHECK(dbw.Write(key2, in2));
- boost::scoped_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
+ std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
// Be sure to seek past the obfuscation key (if it exists)
it->Seek(key);
@@ -156,7 +156,7 @@ BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
BOOST_CHECK_EQUAL(res2.ToString(), in.ToString());
BOOST_CHECK(!odbw.IsEmpty()); // There should be existing data
- BOOST_CHECK(is_null_key(odbw.GetObfuscateKey())); // The key should be an empty string
+ BOOST_CHECK(is_null_key(dbwrapper_private::GetObfuscateKey(odbw))); // The key should be an empty string
uint256 in2 = GetRandHash();
uint256 res3;
@@ -193,7 +193,7 @@ BOOST_AUTO_TEST_CASE(existing_data_reindex)
// Check that the key/val we wrote with unobfuscated wrapper doesn't exist
uint256 res2;
BOOST_CHECK(!odbw.Read(key, res2));
- BOOST_CHECK(!is_null_key(odbw.GetObfuscateKey()));
+ BOOST_CHECK(!is_null_key(dbwrapper_private::GetObfuscateKey(odbw)));
uint256 in2 = GetRandHash();
uint256 res3;
@@ -203,5 +203,125 @@ BOOST_AUTO_TEST_CASE(existing_data_reindex)
BOOST_CHECK(odbw.Read(key, res3));
BOOST_CHECK_EQUAL(res3.ToString(), in2.ToString());
}
-
+
+BOOST_AUTO_TEST_CASE(iterator_ordering)
+{
+ path ph = temp_directory_path() / unique_path();
+ CDBWrapper dbw(ph, (1 << 20), true, false, false);
+ for (int x=0x00; x<256; ++x) {
+ uint8_t key = x;
+ uint32_t value = x*x;
+ BOOST_CHECK(dbw.Write(key, value));
+ }
+
+ std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
+ for (int c=0; c<2; ++c) {
+ int seek_start;
+ if (c == 0)
+ seek_start = 0x00;
+ else
+ seek_start = 0x80;
+ it->Seek((uint8_t)seek_start);
+ for (int x=seek_start; x<256; ++x) {
+ uint8_t key;
+ uint32_t value;
+ BOOST_CHECK(it->Valid());
+ if (!it->Valid()) // Avoid spurious errors about invalid iterator's key and value in case of failure
+ break;
+ BOOST_CHECK(it->GetKey(key));
+ BOOST_CHECK(it->GetValue(value));
+ BOOST_CHECK_EQUAL(key, x);
+ BOOST_CHECK_EQUAL(value, x*x);
+ it->Next();
+ }
+ BOOST_CHECK(!it->Valid());
+ }
+}
+
+struct StringContentsSerializer {
+ // Used to make two serialized objects the same while letting them have a different lengths
+ // This is a terrible idea
+ string str;
+ StringContentsSerializer() {}
+ StringContentsSerializer(const string& inp) : str(inp) {}
+
+ StringContentsSerializer& operator+=(const string& s) {
+ str += s;
+ return *this;
+ }
+ StringContentsSerializer& operator+=(const StringContentsSerializer& s) { return *this += s.str; }
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ if (ser_action.ForRead()) {
+ str.clear();
+ char c = 0;
+ while (true) {
+ try {
+ READWRITE(c);
+ str.push_back(c);
+ } catch (const std::ios_base::failure& e) {
+ break;
+ }
+ }
+ } else {
+ for (size_t i = 0; i < str.size(); i++)
+ READWRITE(str[i]);
+ }
+ }
+};
+
+BOOST_AUTO_TEST_CASE(iterator_string_ordering)
+{
+ char buf[10];
+
+ path ph = temp_directory_path() / unique_path();
+ CDBWrapper dbw(ph, (1 << 20), true, false, false);
+ for (int x=0x00; x<10; ++x) {
+ for (int y = 0; y < 10; y++) {
+ sprintf(buf, "%d", x);
+ StringContentsSerializer key(buf);
+ for (int z = 0; z < y; z++)
+ key += key;
+ uint32_t value = x*x;
+ BOOST_CHECK(dbw.Write(key, value));
+ }
+ }
+
+ std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
+ for (int c=0; c<2; ++c) {
+ int seek_start;
+ if (c == 0)
+ seek_start = 0;
+ else
+ seek_start = 5;
+ sprintf(buf, "%d", seek_start);
+ StringContentsSerializer seek_key(buf);
+ it->Seek(seek_key);
+ for (int x=seek_start; x<10; ++x) {
+ for (int y = 0; y < 10; y++) {
+ sprintf(buf, "%d", x);
+ string exp_key(buf);
+ for (int z = 0; z < y; z++)
+ exp_key += exp_key;
+ StringContentsSerializer key;
+ uint32_t value;
+ BOOST_CHECK(it->Valid());
+ if (!it->Valid()) // Avoid spurious errors about invalid iterator's key and value in case of failure
+ break;
+ BOOST_CHECK(it->GetKey(key));
+ BOOST_CHECK(it->GetValue(value));
+ BOOST_CHECK_EQUAL(key.str, exp_key);
+ BOOST_CHECK_EQUAL(value, x*x);
+ it->Next();
+ }
+ }
+ BOOST_CHECK(!it->Valid());
+ }
+}
+
+
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/getarg_tests.cpp b/src/test/getarg_tests.cpp
index eb61a2884d..9f59de3ef5 100644
--- a/src/test/getarg_tests.cpp
+++ b/src/test/getarg_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
diff --git a/src/test/hash_tests.cpp b/src/test/hash_tests.cpp
index e5d2e5a439..fa9624f13d 100644
--- a/src/test/hash_tests.cpp
+++ b/src/test/hash_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2013 The Bitcoin Core developers
+// Copyright (c) 2013-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.
@@ -47,4 +47,85 @@ BOOST_AUTO_TEST_CASE(murmurhash3)
#undef T
}
+/*
+ SipHash-2-4 output with
+ k = 00 01 02 ...
+ and
+ in = (empty string)
+ in = 00 (1 byte)
+ in = 00 01 (2 bytes)
+ in = 00 01 02 (3 bytes)
+ ...
+ in = 00 01 02 ... 3e (63 bytes)
+
+ from: https://131002.net/siphash/siphash24.c
+*/
+uint64_t siphash_4_2_testvec[] = {
+ 0x726fdb47dd0e0e31, 0x74f839c593dc67fd, 0x0d6c8009d9a94f5a, 0x85676696d7fb7e2d,
+ 0xcf2794e0277187b7, 0x18765564cd99a68d, 0xcbc9466e58fee3ce, 0xab0200f58b01d137,
+ 0x93f5f5799a932462, 0x9e0082df0ba9e4b0, 0x7a5dbbc594ddb9f3, 0xf4b32f46226bada7,
+ 0x751e8fbc860ee5fb, 0x14ea5627c0843d90, 0xf723ca908e7af2ee, 0xa129ca6149be45e5,
+ 0x3f2acc7f57c29bdb, 0x699ae9f52cbe4794, 0x4bc1b3f0968dd39c, 0xbb6dc91da77961bd,
+ 0xbed65cf21aa2ee98, 0xd0f2cbb02e3b67c7, 0x93536795e3a33e88, 0xa80c038ccd5ccec8,
+ 0xb8ad50c6f649af94, 0xbce192de8a85b8ea, 0x17d835b85bbb15f3, 0x2f2e6163076bcfad,
+ 0xde4daaaca71dc9a5, 0xa6a2506687956571, 0xad87a3535c49ef28, 0x32d892fad841c342,
+ 0x7127512f72f27cce, 0xa7f32346f95978e3, 0x12e0b01abb051238, 0x15e034d40fa197ae,
+ 0x314dffbe0815a3b4, 0x027990f029623981, 0xcadcd4e59ef40c4d, 0x9abfd8766a33735c,
+ 0x0e3ea96b5304a7d0, 0xad0c42d6fc585992, 0x187306c89bc215a9, 0xd4a60abcf3792b95,
+ 0xf935451de4f21df2, 0xa9538f0419755787, 0xdb9acddff56ca510, 0xd06c98cd5c0975eb,
+ 0xe612a3cb9ecba951, 0xc766e62cfcadaf96, 0xee64435a9752fe72, 0xa192d576b245165a,
+ 0x0a8787bf8ecb74b2, 0x81b3e73d20b49b6f, 0x7fa8220ba3b2ecea, 0x245731c13ca42499,
+ 0xb78dbfaf3a8d83bd, 0xea1ad565322a1a0b, 0x60e61c23a3795013, 0x6606d7e446282b93,
+ 0x6ca4ecb15c5f91e1, 0x9f626da15c9625f3, 0xe51b38608ef25f57, 0x958a324ceb064572
+};
+
+BOOST_AUTO_TEST_CASE(siphash)
+{
+ CSipHasher hasher(0x0706050403020100ULL, 0x0F0E0D0C0B0A0908ULL);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0x726fdb47dd0e0e31ull);
+ static const unsigned char t0[1] = {0};
+ hasher.Write(t0, 1);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0x74f839c593dc67fdull);
+ static const unsigned char t1[7] = {1,2,3,4,5,6,7};
+ hasher.Write(t1, 7);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0x93f5f5799a932462ull);
+ hasher.Write(0x0F0E0D0C0B0A0908ULL);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0x3f2acc7f57c29bdbull);
+ static const unsigned char t2[2] = {16,17};
+ hasher.Write(t2, 2);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0x4bc1b3f0968dd39cull);
+ static const unsigned char t3[9] = {18,19,20,21,22,23,24,25,26};
+ hasher.Write(t3, 9);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0x2f2e6163076bcfadull);
+ static const unsigned char t4[5] = {27,28,29,30,31};
+ hasher.Write(t4, 5);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0x7127512f72f27cceull);
+ hasher.Write(0x2726252423222120ULL);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0x0e3ea96b5304a7d0ull);
+ hasher.Write(0x2F2E2D2C2B2A2928ULL);
+ BOOST_CHECK_EQUAL(hasher.Finalize(), 0xe612a3cb9ecba951ull);
+
+ BOOST_CHECK_EQUAL(SipHashUint256(0x0706050403020100ULL, 0x0F0E0D0C0B0A0908ULL, uint256S("1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100")), 0x7127512f72f27cceull);
+
+ // Check test vectors from spec, one byte at a time
+ CSipHasher hasher2(0x0706050403020100ULL, 0x0F0E0D0C0B0A0908ULL);
+ for (uint8_t x=0; x<ARRAYLEN(siphash_4_2_testvec); ++x)
+ {
+ BOOST_CHECK_EQUAL(hasher2.Finalize(), siphash_4_2_testvec[x]);
+ hasher2.Write(&x, 1);
+ }
+ // Check test vectors from spec, eight bytes at a time
+ CSipHasher hasher3(0x0706050403020100ULL, 0x0F0E0D0C0B0A0908ULL);
+ for (uint8_t x=0; x<ARRAYLEN(siphash_4_2_testvec); x+=8)
+ {
+ BOOST_CHECK_EQUAL(hasher3.Finalize(), siphash_4_2_testvec[x]);
+ hasher3.Write(uint64_t(x)|(uint64_t(x+1)<<8)|(uint64_t(x+2)<<16)|(uint64_t(x+3)<<24)|
+ (uint64_t(x+4)<<32)|(uint64_t(x+5)<<40)|(uint64_t(x+6)<<48)|(uint64_t(x+7)<<56));
+ }
+
+ CHashWriter ss(SER_DISK, CLIENT_VERSION);
+ ss << CTransaction();
+ BOOST_CHECK_EQUAL(SipHashUint256(1, 2, ss.GetHash()), 0x79751e980c2a0a35ULL);
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/key_tests.cpp b/src/test/key_tests.cpp
index 13ca949469..4978c95130 100644
--- a/src/test/key_tests.cpp
+++ b/src/test/key_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
diff --git a/src/test/main_tests.cpp b/src/test/main_tests.cpp
index 2b92d239e9..dbfbdd934f 100644
--- a/src/test/main_tests.cpp
+++ b/src/test/main_tests.cpp
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/test/mempool_tests.cpp b/src/test/mempool_tests.cpp
index e9f7378f74..033a50f94f 100644
--- a/src/test/mempool_tests.cpp
+++ b/src/test/mempool_tests.cpp
@@ -1,7 +1,8 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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/policy.h"
#include "txmempool.h"
#include "util.h"
@@ -57,12 +58,12 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest)
std::list<CTransaction> removed;
// Nothing in pool, remove should do nothing:
- testPool.remove(txParent, removed, true);
+ testPool.removeRecursive(txParent, removed);
BOOST_CHECK_EQUAL(removed.size(), 0);
// Just the parent:
testPool.addUnchecked(txParent.GetHash(), entry.FromTx(txParent));
- testPool.remove(txParent, removed, true);
+ testPool.removeRecursive(txParent, removed);
BOOST_CHECK_EQUAL(removed.size(), 1);
removed.clear();
@@ -74,16 +75,16 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest)
testPool.addUnchecked(txGrandChild[i].GetHash(), entry.FromTx(txGrandChild[i]));
}
// Remove Child[0], GrandChild[0] should be removed:
- testPool.remove(txChild[0], removed, true);
+ testPool.removeRecursive(txChild[0], removed);
BOOST_CHECK_EQUAL(removed.size(), 2);
removed.clear();
// ... make sure grandchild and child are gone:
- testPool.remove(txGrandChild[0], removed, true);
+ testPool.removeRecursive(txGrandChild[0], removed);
BOOST_CHECK_EQUAL(removed.size(), 0);
- testPool.remove(txChild[0], removed, true);
+ testPool.removeRecursive(txChild[0], removed);
BOOST_CHECK_EQUAL(removed.size(), 0);
// Remove parent, all children/grandchildren should go:
- testPool.remove(txParent, removed, true);
+ testPool.removeRecursive(txParent, removed);
BOOST_CHECK_EQUAL(removed.size(), 5);
BOOST_CHECK_EQUAL(testPool.size(), 0);
removed.clear();
@@ -96,19 +97,19 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest)
}
// Now remove the parent, as might happen if a block-re-org occurs but the parent cannot be
// put into the mempool (maybe because it is non-standard):
- testPool.remove(txParent, removed, true);
+ testPool.removeRecursive(txParent, removed);
BOOST_CHECK_EQUAL(removed.size(), 6);
BOOST_CHECK_EQUAL(testPool.size(), 0);
removed.clear();
}
-template<int index>
+template<typename name>
void CheckSort(CTxMemPool &pool, std::vector<std::string> &sortedOrder)
{
BOOST_CHECK_EQUAL(pool.size(), sortedOrder.size());
- typename CTxMemPool::indexed_transaction_set::nth_index<index>::type::iterator it = pool.mapTx.get<index>().begin();
+ typename CTxMemPool::indexed_transaction_set::index<name>::type::iterator it = pool.mapTx.get<name>().begin();
int count=0;
- for (; it != pool.mapTx.get<index>().end(); ++it, ++count) {
+ for (; it != pool.mapTx.get<name>().end(); ++it, ++count) {
BOOST_CHECK_EQUAL(it->GetTx().GetHash().ToString(), sortedOrder[count]);
}
}
@@ -164,7 +165,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
sortedOrder[2] = tx1.GetHash().ToString(); // 10000
sortedOrder[3] = tx4.GetHash().ToString(); // 15000
sortedOrder[4] = tx2.GetHash().ToString(); // 20000
- CheckSort<1>(pool, sortedOrder);
+ CheckSort<descendant_score>(pool, sortedOrder);
/* low fee but with high fee child */
/* tx6 -> tx7 -> tx8, tx9 -> tx10 */
@@ -176,7 +177,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
BOOST_CHECK_EQUAL(pool.size(), 6);
// Check that at this point, tx6 is sorted low
sortedOrder.insert(sortedOrder.begin(), tx6.GetHash().ToString());
- CheckSort<1>(pool, sortedOrder);
+ CheckSort<descendant_score>(pool, sortedOrder);
CTxMemPool::setEntries setAncestors;
setAncestors.insert(pool.mapTx.find(tx6.GetHash()));
@@ -202,7 +203,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
sortedOrder.erase(sortedOrder.begin());
sortedOrder.push_back(tx6.GetHash().ToString());
sortedOrder.push_back(tx7.GetHash().ToString());
- CheckSort<1>(pool, sortedOrder);
+ CheckSort<descendant_score>(pool, sortedOrder);
/* low fee child of tx7 */
CMutableTransaction tx8 = CMutableTransaction();
@@ -217,7 +218,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
// Now tx8 should be sorted low, but tx6/tx both high
sortedOrder.insert(sortedOrder.begin(), tx8.GetHash().ToString());
- CheckSort<1>(pool, sortedOrder);
+ CheckSort<descendant_score>(pool, sortedOrder);
/* low fee child of tx7 */
CMutableTransaction tx9 = CMutableTransaction();
@@ -232,7 +233,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
// tx9 should be sorted low
BOOST_CHECK_EQUAL(pool.size(), 9);
sortedOrder.insert(sortedOrder.begin(), tx9.GetHash().ToString());
- CheckSort<1>(pool, sortedOrder);
+ CheckSort<descendant_score>(pool, sortedOrder);
std::vector<std::string> snapshotOrder = sortedOrder;
@@ -274,18 +275,18 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
sortedOrder.insert(sortedOrder.begin()+5, tx9.GetHash().ToString());
sortedOrder.insert(sortedOrder.begin()+6, tx8.GetHash().ToString());
sortedOrder.insert(sortedOrder.begin()+7, tx10.GetHash().ToString()); // tx10 is just before tx6
- CheckSort<1>(pool, sortedOrder);
+ CheckSort<descendant_score>(pool, sortedOrder);
// there should be 10 transactions in the mempool
BOOST_CHECK_EQUAL(pool.size(), 10);
// Now try removing tx10 and verify the sort order returns to normal
std::list<CTransaction> removed;
- pool.remove(pool.mapTx.find(tx10.GetHash())->GetTx(), removed, true);
- CheckSort<1>(pool, snapshotOrder);
+ pool.removeRecursive(pool.mapTx.find(tx10.GetHash())->GetTx(), removed);
+ CheckSort<descendant_score>(pool, snapshotOrder);
- pool.remove(pool.mapTx.find(tx9.GetHash())->GetTx(), removed, true);
- pool.remove(pool.mapTx.find(tx8.GetHash())->GetTx(), removed, true);
+ pool.removeRecursive(pool.mapTx.find(tx9.GetHash())->GetTx(), removed);
+ pool.removeRecursive(pool.mapTx.find(tx8.GetHash())->GetTx(), removed);
/* Now check the sort on the mining score index.
* Final order should be:
*
@@ -314,7 +315,111 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
sortedOrder.push_back(tx3.GetHash().ToString());
sortedOrder.push_back(tx6.GetHash().ToString());
}
- CheckSort<3>(pool, sortedOrder);
+ CheckSort<mining_score>(pool, sortedOrder);
+}
+
+BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest)
+{
+ CTxMemPool pool(CFeeRate(0));
+ TestMemPoolEntryHelper entry;
+ entry.hadNoDependencies = true;
+
+ /* 3rd highest fee */
+ CMutableTransaction tx1 = CMutableTransaction();
+ tx1.vout.resize(1);
+ tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
+ tx1.vout[0].nValue = 10 * COIN;
+ pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).Priority(10.0).FromTx(tx1));
+
+ /* highest fee */
+ CMutableTransaction tx2 = CMutableTransaction();
+ tx2.vout.resize(1);
+ tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
+ tx2.vout[0].nValue = 2 * COIN;
+ pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).Priority(9.0).FromTx(tx2));
+ uint64_t tx2Size = GetVirtualTransactionSize(tx2);
+
+ /* lowest fee */
+ CMutableTransaction tx3 = CMutableTransaction();
+ tx3.vout.resize(1);
+ tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
+ tx3.vout[0].nValue = 5 * COIN;
+ pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).Priority(100.0).FromTx(tx3));
+
+ /* 2nd highest fee */
+ CMutableTransaction tx4 = CMutableTransaction();
+ tx4.vout.resize(1);
+ tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
+ tx4.vout[0].nValue = 6 * COIN;
+ pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).Priority(1.0).FromTx(tx4));
+
+ /* equal fee rate to tx1, but newer */
+ CMutableTransaction tx5 = CMutableTransaction();
+ tx5.vout.resize(1);
+ tx5.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
+ tx5.vout[0].nValue = 11 * COIN;
+ pool.addUnchecked(tx5.GetHash(), entry.Fee(10000LL).FromTx(tx5));
+ BOOST_CHECK_EQUAL(pool.size(), 5);
+
+ std::vector<std::string> sortedOrder;
+ sortedOrder.resize(5);
+ sortedOrder[0] = tx2.GetHash().ToString(); // 20000
+ sortedOrder[1] = tx4.GetHash().ToString(); // 15000
+ // tx1 and tx5 are both 10000
+ // Ties are broken by hash, not timestamp, so determine which
+ // hash comes first.
+ if (tx1.GetHash() < tx5.GetHash()) {
+ sortedOrder[2] = tx1.GetHash().ToString();
+ sortedOrder[3] = tx5.GetHash().ToString();
+ } else {
+ sortedOrder[2] = tx5.GetHash().ToString();
+ sortedOrder[3] = tx1.GetHash().ToString();
+ }
+ sortedOrder[4] = tx3.GetHash().ToString(); // 0
+
+ CheckSort<ancestor_score>(pool, sortedOrder);
+
+ /* low fee parent with high fee child */
+ /* tx6 (0) -> tx7 (high) */
+ CMutableTransaction tx6 = CMutableTransaction();
+ tx6.vout.resize(1);
+ tx6.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
+ tx6.vout[0].nValue = 20 * COIN;
+ uint64_t tx6Size = GetVirtualTransactionSize(tx6);
+
+ pool.addUnchecked(tx6.GetHash(), entry.Fee(0LL).FromTx(tx6));
+ BOOST_CHECK_EQUAL(pool.size(), 6);
+ sortedOrder.push_back(tx6.GetHash().ToString());
+ CheckSort<ancestor_score>(pool, sortedOrder);
+
+ CMutableTransaction tx7 = CMutableTransaction();
+ tx7.vin.resize(1);
+ tx7.vin[0].prevout = COutPoint(tx6.GetHash(), 0);
+ tx7.vin[0].scriptSig = CScript() << OP_11;
+ tx7.vout.resize(1);
+ tx7.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
+ tx7.vout[0].nValue = 10 * COIN;
+ uint64_t tx7Size = GetVirtualTransactionSize(tx7);
+
+ /* set the fee to just below tx2's feerate when including ancestor */
+ CAmount fee = (20000/tx2Size)*(tx7Size + tx6Size) - 1;
+
+ //CTxMemPoolEntry entry7(tx7, fee, 2, 10.0, 1, true);
+ pool.addUnchecked(tx7.GetHash(), entry.Fee(fee).FromTx(tx7));
+ BOOST_CHECK_EQUAL(pool.size(), 7);
+ sortedOrder.insert(sortedOrder.begin()+1, tx7.GetHash().ToString());
+ CheckSort<ancestor_score>(pool, sortedOrder);
+
+ /* after tx6 is mined, tx7 should move up in the sort */
+ std::vector<CTransaction> vtx;
+ vtx.push_back(tx6);
+ std::list<CTransaction> dummy;
+ pool.removeForBlock(vtx, 1, dummy, false);
+
+ sortedOrder.erase(sortedOrder.begin()+1);
+ sortedOrder.pop_back();
+ sortedOrder.insert(sortedOrder.begin(), tx7.GetHash().ToString());
+ CheckSort<ancestor_score>(pool, sortedOrder);
}
@@ -363,12 +468,12 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest)
BOOST_CHECK(pool.exists(tx2.GetHash()));
BOOST_CHECK(pool.exists(tx3.GetHash()));
- pool.TrimToSize(::GetSerializeSize(CTransaction(tx1), SER_NETWORK, PROTOCOL_VERSION)); // mempool is limited to tx1's size in memory usage, so nothing fits
+ pool.TrimToSize(GetVirtualTransactionSize(tx1)); // mempool is limited to tx1's size in memory usage, so nothing fits
BOOST_CHECK(!pool.exists(tx1.GetHash()));
BOOST_CHECK(!pool.exists(tx2.GetHash()));
BOOST_CHECK(!pool.exists(tx3.GetHash()));
- CFeeRate maxFeeRateRemoved(25000, ::GetSerializeSize(CTransaction(tx3), SER_NETWORK, PROTOCOL_VERSION) + ::GetSerializeSize(CTransaction(tx2), SER_NETWORK, PROTOCOL_VERSION));
+ CFeeRate maxFeeRateRemoved(25000, GetVirtualTransactionSize(tx3) + GetVirtualTransactionSize(tx2));
BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), maxFeeRateRemoved.GetFeePerK() + 1000);
CMutableTransaction tx4 = CMutableTransaction();
diff --git a/src/test/merkle_tests.cpp b/src/test/merkle_tests.cpp
index 1e31f2e679..b40ab848dc 100644
--- a/src/test/merkle_tests.cpp
+++ b/src/test/merkle_tests.cpp
@@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE(merkle_test)
int duplicate2 = mutate >= 2 ? 1 << ctz(ntx1) : 0; // Likewise for the second mutation.
if (duplicate2 >= ntx1) break;
int ntx2 = ntx1 + duplicate2;
- int duplicate3 = mutate >= 3 ? 1 << ctz(ntx2) : 0; // And for the the third mutation.
+ int duplicate3 = mutate >= 3 ? 1 << ctz(ntx2) : 0; // And for the third mutation.
if (duplicate3 >= ntx2) break;
int ntx3 = ntx2 + duplicate3;
// Build a block with ntx different transactions.
diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp
index 19ddb5b79c..d3aa2364d1 100644
--- a/src/test/miner_tests.cpp
+++ b/src/test/miner_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -57,9 +57,131 @@ struct {
{2, 0xbbbeb305}, {2, 0xfe1c810a},
};
+CBlockIndex CreateBlockIndex(int nHeight)
+{
+ CBlockIndex index;
+ index.nHeight = nHeight;
+ index.pprev = chainActive.Tip();
+ return index;
+}
+
+bool TestSequenceLocks(const CTransaction &tx, int flags)
+{
+ LOCK(mempool.cs);
+ return CheckSequenceLocks(tx, flags);
+}
+
+// Test suite for ancestor feerate transaction selection.
+// Implemented as an additional function, rather than a separate test case,
+// to allow reusing the blockchain created in CreateNewBlock_validity.
+// Note that this test assumes blockprioritysize is 0.
+void TestPackageSelection(const CChainParams& chainparams, CScript scriptPubKey, std::vector<CTransaction *>& txFirst)
+{
+ // Test the ancestor feerate transaction selection.
+ TestMemPoolEntryHelper entry;
+
+ // Test that a medium fee transaction will be selected after a higher fee
+ // rate package with a low fee rate parent.
+ CMutableTransaction tx;
+ tx.vin.resize(1);
+ tx.vin[0].scriptSig = CScript() << OP_1;
+ tx.vin[0].prevout.hash = txFirst[0]->GetHash();
+ tx.vin[0].prevout.n = 0;
+ tx.vout.resize(1);
+ tx.vout[0].nValue = 5000000000LL - 1000;
+ // This tx has a low fee: 1000 satoshis
+ uint256 hashParentTx = tx.GetHash(); // save this txid for later use
+ mempool.addUnchecked(hashParentTx, entry.Fee(1000).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
+
+ // This tx has a medium fee: 10000 satoshis
+ tx.vin[0].prevout.hash = txFirst[1]->GetHash();
+ tx.vout[0].nValue = 5000000000LL - 10000;
+ uint256 hashMediumFeeTx = tx.GetHash();
+ mempool.addUnchecked(hashMediumFeeTx, entry.Fee(10000).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
+
+ // This tx has a high fee, but depends on the first transaction
+ tx.vin[0].prevout.hash = hashParentTx;
+ tx.vout[0].nValue = 5000000000LL - 1000 - 50000; // 50k satoshi fee
+ uint256 hashHighFeeTx = tx.GetHash();
+ mempool.addUnchecked(hashHighFeeTx, entry.Fee(50000).Time(GetTime()).SpendsCoinbase(false).FromTx(tx));
+
+ CBlockTemplate *pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey);
+ BOOST_CHECK(pblocktemplate->block.vtx[1].GetHash() == hashParentTx);
+ BOOST_CHECK(pblocktemplate->block.vtx[2].GetHash() == hashHighFeeTx);
+ BOOST_CHECK(pblocktemplate->block.vtx[3].GetHash() == hashMediumFeeTx);
+
+ // Test that a package below the min relay fee doesn't get included
+ tx.vin[0].prevout.hash = hashHighFeeTx;
+ tx.vout[0].nValue = 5000000000LL - 1000 - 50000; // 0 fee
+ uint256 hashFreeTx = tx.GetHash();
+ mempool.addUnchecked(hashFreeTx, entry.Fee(0).FromTx(tx));
+ size_t freeTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
+
+ // Calculate a fee on child transaction that will put the package just
+ // below the min relay fee (assuming 1 child tx of the same size).
+ CAmount feeToUse = minRelayTxFee.GetFee(2*freeTxSize) - 1;
+
+ tx.vin[0].prevout.hash = hashFreeTx;
+ tx.vout[0].nValue = 5000000000LL - 1000 - 50000 - feeToUse;
+ uint256 hashLowFeeTx = tx.GetHash();
+ mempool.addUnchecked(hashLowFeeTx, entry.Fee(feeToUse).FromTx(tx));
+ pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey);
+ // Verify that the free tx and the low fee tx didn't get selected
+ for (size_t i=0; i<pblocktemplate->block.vtx.size(); ++i) {
+ BOOST_CHECK(pblocktemplate->block.vtx[i].GetHash() != hashFreeTx);
+ BOOST_CHECK(pblocktemplate->block.vtx[i].GetHash() != hashLowFeeTx);
+ }
+
+ // Test that packages above the min relay fee do get included, even if one
+ // of the transactions is below the min relay fee
+ // Remove the low fee transaction and replace with a higher fee transaction
+ std::list<CTransaction> dummy;
+ mempool.removeRecursive(tx, dummy);
+ tx.vout[0].nValue -= 2; // Now we should be just over the min relay fee
+ hashLowFeeTx = tx.GetHash();
+ mempool.addUnchecked(hashLowFeeTx, entry.Fee(feeToUse+2).FromTx(tx));
+ pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey);
+ BOOST_CHECK(pblocktemplate->block.vtx[4].GetHash() == hashFreeTx);
+ BOOST_CHECK(pblocktemplate->block.vtx[5].GetHash() == hashLowFeeTx);
+
+ // Test that transaction selection properly updates ancestor fee
+ // calculations as ancestor transactions get included in a block.
+ // Add a 0-fee transaction that has 2 outputs.
+ tx.vin[0].prevout.hash = txFirst[2]->GetHash();
+ tx.vout.resize(2);
+ tx.vout[0].nValue = 5000000000LL - 100000000;
+ tx.vout[1].nValue = 100000000; // 1BTC output
+ uint256 hashFreeTx2 = tx.GetHash();
+ mempool.addUnchecked(hashFreeTx2, entry.Fee(0).SpendsCoinbase(true).FromTx(tx));
+
+ // This tx can't be mined by itself
+ tx.vin[0].prevout.hash = hashFreeTx2;
+ tx.vout.resize(1);
+ feeToUse = minRelayTxFee.GetFee(freeTxSize);
+ tx.vout[0].nValue = 5000000000LL - 100000000 - feeToUse;
+ uint256 hashLowFeeTx2 = tx.GetHash();
+ mempool.addUnchecked(hashLowFeeTx2, entry.Fee(feeToUse).SpendsCoinbase(false).FromTx(tx));
+ pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey);
+
+ // Verify that this tx isn't selected.
+ for (size_t i=0; i<pblocktemplate->block.vtx.size(); ++i) {
+ BOOST_CHECK(pblocktemplate->block.vtx[i].GetHash() != hashFreeTx2);
+ BOOST_CHECK(pblocktemplate->block.vtx[i].GetHash() != hashLowFeeTx2);
+ }
+
+ // This tx will be mineable, and should cause hashLowFeeTx2 to be selected
+ // as well.
+ tx.vin[0].prevout.n = 1;
+ tx.vout[0].nValue = 100000000 - 10000; // 10k satoshi fee
+ mempool.addUnchecked(tx.GetHash(), entry.Fee(10000).FromTx(tx));
+ pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey);
+ BOOST_CHECK(pblocktemplate->block.vtx[8].GetHash() == hashLowFeeTx2);
+}
+
// NOTE: These tests rely on CreateNewBlock doing its own self-validation!
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
{
+ // Note that by default, these tests run with size accounting enabled.
const CChainParams& chainparams = Params(CBaseChainParams::MAIN);
CScript scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
CBlockTemplate *pblocktemplate;
@@ -75,10 +197,11 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
fCheckpointsEnabled = false;
// Simple block creation, nothing special yet:
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
// We can't make transactions until we have inputs
// Therefore, load 100 blocks :)
+ int baseheight = 0;
std::vector<CTransaction*>txFirst;
for (unsigned int i = 0; i < sizeof(blockinfo)/sizeof(*blockinfo); ++i)
{
@@ -92,21 +215,28 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
txCoinbase.vin[0].scriptSig.push_back(chainActive.Height());
txCoinbase.vout[0].scriptPubKey = CScript();
pblock->vtx[0] = CTransaction(txCoinbase);
- if (txFirst.size() < 2)
+ if (txFirst.size() == 0)
+ baseheight = chainActive.Height();
+ if (txFirst.size() < 4)
txFirst.push_back(new CTransaction(pblock->vtx[0]));
pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
pblock->nNonce = blockinfo[i].nonce;
CValidationState state;
- BOOST_CHECK(ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL));
+ BOOST_CHECK(ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL, connman));
BOOST_CHECK(state.IsValid());
pblock->hashPrevBlock = pblock->GetHash();
}
delete pblocktemplate;
// Just to make sure we can still make simple blocks
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
delete pblocktemplate;
+ const CAmount BLOCKSUBSIDY = 50*COIN;
+ const CAmount LOWFEE = CENT;
+ const CAmount HIGHFEE = COIN;
+ const CAmount HIGHERFEE = 4*COIN;
+
// block sigops > limit: 1000 CHECKMULTISIG + 1
tx.vin.resize(1);
// NOTE: OP_NOP is used to force 20 SigOps for the CHECKMULTISIG
@@ -114,31 +244,31 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
tx.vin[0].prevout.n = 0;
tx.vout.resize(1);
- tx.vout[0].nValue = 5000000000LL;
+ tx.vout[0].nValue = BLOCKSUBSIDY;
for (unsigned int i = 0; i < 1001; ++i)
{
- tx.vout[0].nValue -= 1000000;
+ tx.vout[0].nValue -= LOWFEE;
hash = tx.GetHash();
bool spendsCoinbase = (i == 0) ? true : false; // only first tx spends coinbase
// If we don't set the # of sig ops in the CTxMemPoolEntry, template creation fails
- mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx));
+ mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx));
tx.vin[0].prevout.hash = hash;
}
- BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error);
+ BOOST_CHECK_THROW(BlockAssembler(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
mempool.clear();
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
- tx.vout[0].nValue = 5000000000LL;
+ tx.vout[0].nValue = BLOCKSUBSIDY;
for (unsigned int i = 0; i < 1001; ++i)
{
- tx.vout[0].nValue -= 1000000;
+ tx.vout[0].nValue -= LOWFEE;
hash = tx.GetHash();
bool spendsCoinbase = (i == 0) ? true : false; // only first tx spends coinbase
// If we do set the # of sig ops in the CTxMemPoolEntry, template creation passes
- mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).SpendsCoinbase(spendsCoinbase).SigOps(20).FromTx(tx));
+ mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(spendsCoinbase).SigOpsCost(80).FromTx(tx));
tx.vin[0].prevout.hash = hash;
}
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
delete pblocktemplate;
mempool.clear();
@@ -150,40 +280,40 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
tx.vin[0].scriptSig << vchData << OP_DROP;
tx.vin[0].scriptSig << OP_1;
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
- tx.vout[0].nValue = 5000000000LL;
+ tx.vout[0].nValue = BLOCKSUBSIDY;
for (unsigned int i = 0; i < 128; ++i)
{
- tx.vout[0].nValue -= 10000000;
+ tx.vout[0].nValue -= LOWFEE;
hash = tx.GetHash();
bool spendsCoinbase = (i == 0) ? true : false; // only first tx spends coinbase
- mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx));
+ mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx));
tx.vin[0].prevout.hash = hash;
}
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
delete pblocktemplate;
mempool.clear();
// orphan in mempool, template creation fails
hash = tx.GetHash();
- mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).FromTx(tx));
- BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error);
+ mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).FromTx(tx));
+ BOOST_CHECK_THROW(BlockAssembler(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
mempool.clear();
// child with higher priority than parent
tx.vin[0].scriptSig = CScript() << OP_1;
tx.vin[0].prevout.hash = txFirst[1]->GetHash();
- tx.vout[0].nValue = 4900000000LL;
+ tx.vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
hash = tx.GetHash();
- mempool.addUnchecked(hash, entry.Fee(100000000LL).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
+ mempool.addUnchecked(hash, entry.Fee(HIGHFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
tx.vin[0].prevout.hash = hash;
tx.vin.resize(2);
tx.vin[1].scriptSig = CScript() << OP_1;
tx.vin[1].prevout.hash = txFirst[0]->GetHash();
tx.vin[1].prevout.n = 0;
- tx.vout[0].nValue = 5900000000LL;
+ tx.vout[0].nValue = tx.vout[0].nValue+BLOCKSUBSIDY-HIGHERFEE; //First txn output + fresh coinbase - new txn fee
hash = tx.GetHash();
- mempool.addUnchecked(hash, entry.Fee(400000000LL).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
+ mempool.addUnchecked(hash, entry.Fee(HIGHERFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
delete pblocktemplate;
mempool.clear();
@@ -194,103 +324,179 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
tx.vout[0].nValue = 0;
hash = tx.GetHash();
// give it a fee so it'll get mined
- mempool.addUnchecked(hash, entry.Fee(100000).Time(GetTime()).SpendsCoinbase(false).FromTx(tx));
- BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error);
+ mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(false).FromTx(tx));
+ BOOST_CHECK_THROW(BlockAssembler(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
mempool.clear();
// invalid (pre-p2sh) txn in mempool, template creation fails
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
tx.vin[0].prevout.n = 0;
tx.vin[0].scriptSig = CScript() << OP_1;
- tx.vout[0].nValue = 4900000000LL;
+ tx.vout[0].nValue = BLOCKSUBSIDY-LOWFEE;
script = CScript() << OP_0;
tx.vout[0].scriptPubKey = GetScriptForDestination(CScriptID(script));
hash = tx.GetHash();
- mempool.addUnchecked(hash, entry.Fee(10000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
+ mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
tx.vin[0].prevout.hash = hash;
tx.vin[0].scriptSig = CScript() << std::vector<unsigned char>(script.begin(), script.end());
- tx.vout[0].nValue -= 1000000;
+ tx.vout[0].nValue -= LOWFEE;
hash = tx.GetHash();
- mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).SpendsCoinbase(false).FromTx(tx));
- BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error);
+ mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(false).FromTx(tx));
+ BOOST_CHECK_THROW(BlockAssembler(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
mempool.clear();
// double spend txn pair in mempool, template creation fails
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
tx.vin[0].scriptSig = CScript() << OP_1;
- tx.vout[0].nValue = 4900000000LL;
+ tx.vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
tx.vout[0].scriptPubKey = CScript() << OP_1;
hash = tx.GetHash();
- mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
+ mempool.addUnchecked(hash, entry.Fee(HIGHFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
tx.vout[0].scriptPubKey = CScript() << OP_2;
hash = tx.GetHash();
- mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
- BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error);
+ mempool.addUnchecked(hash, entry.Fee(HIGHFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
+ BOOST_CHECK_THROW(BlockAssembler(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
mempool.clear();
// subsidy changing
int nHeight = chainActive.Height();
- chainActive.Tip()->nHeight = 209999;
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
+ // Create an actual 209999-long block chain (without valid blocks).
+ while (chainActive.Tip()->nHeight < 209999) {
+ CBlockIndex* prev = chainActive.Tip();
+ CBlockIndex* next = new CBlockIndex();
+ next->phashBlock = new uint256(GetRandHash());
+ pcoinsTip->SetBestBlock(next->GetBlockHash());
+ next->pprev = prev;
+ next->nHeight = prev->nHeight + 1;
+ next->BuildSkip();
+ chainActive.SetTip(next);
+ }
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
delete pblocktemplate;
- chainActive.Tip()->nHeight = 210000;
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
+ // Extend to a 210000-long block chain.
+ while (chainActive.Tip()->nHeight < 210000) {
+ CBlockIndex* prev = chainActive.Tip();
+ CBlockIndex* next = new CBlockIndex();
+ next->phashBlock = new uint256(GetRandHash());
+ pcoinsTip->SetBestBlock(next->GetBlockHash());
+ next->pprev = prev;
+ next->nHeight = prev->nHeight + 1;
+ next->BuildSkip();
+ chainActive.SetTip(next);
+ }
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
delete pblocktemplate;
- chainActive.Tip()->nHeight = nHeight;
+ // Delete the dummy blocks again.
+ while (chainActive.Tip()->nHeight > nHeight) {
+ CBlockIndex* del = chainActive.Tip();
+ chainActive.SetTip(del->pprev);
+ pcoinsTip->SetBestBlock(del->pprev->GetBlockHash());
+ delete del->phashBlock;
+ delete del;
+ }
// non-final txs in mempool
SetMockTime(chainActive.Tip()->GetMedianTimePast()+1);
+ int flags = LOCKTIME_VERIFY_SEQUENCE|LOCKTIME_MEDIAN_TIME_PAST;
+ // height map
+ std::vector<int> prevheights;
- // height locked
- tx.vin[0].prevout.hash = txFirst[0]->GetHash();
+ // relative height locked
+ tx.nVersion = 2;
+ tx.vin.resize(1);
+ prevheights.resize(1);
+ tx.vin[0].prevout.hash = txFirst[0]->GetHash(); // only 1 transaction
+ tx.vin[0].prevout.n = 0;
tx.vin[0].scriptSig = CScript() << OP_1;
- tx.vin[0].nSequence = 0;
- tx.vout[0].nValue = 4900000000LL;
+ tx.vin[0].nSequence = chainActive.Tip()->nHeight + 1; // txFirst[0] is the 2nd block
+ prevheights[0] = baseheight + 1;
+ tx.vout.resize(1);
+ tx.vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
tx.vout[0].scriptPubKey = CScript() << OP_1;
- tx.nLockTime = chainActive.Tip()->nHeight+1;
+ tx.nLockTime = 0;
hash = tx.GetHash();
- mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
- BOOST_CHECK(!CheckFinalTx(tx, LOCKTIME_MEDIAN_TIME_PAST));
-
- // time locked
- tx2.vin.resize(1);
- tx2.vin[0].prevout.hash = txFirst[1]->GetHash();
- tx2.vin[0].prevout.n = 0;
- tx2.vin[0].scriptSig = CScript() << OP_1;
- tx2.vin[0].nSequence = 0;
- tx2.vout.resize(1);
- tx2.vout[0].nValue = 4900000000LL;
- tx2.vout[0].scriptPubKey = CScript() << OP_1;
- tx2.nLockTime = chainActive.Tip()->GetMedianTimePast()+1;
- hash = tx2.GetHash();
- mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx2));
- BOOST_CHECK(!CheckFinalTx(tx2, LOCKTIME_MEDIAN_TIME_PAST));
-
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
-
- // Neither tx should have make it into the template.
- BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 1);
- delete pblocktemplate;
+ mempool.addUnchecked(hash, entry.Fee(HIGHFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
+ BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes
+ BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail
+ BOOST_CHECK(SequenceLocks(tx, flags, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 2))); // Sequence locks pass on 2nd block
- // However if we advance height and time by one, both will.
- chainActive.Tip()->nHeight++;
- SetMockTime(chainActive.Tip()->GetMedianTimePast()+2);
+ // relative time locked
+ tx.vin[0].prevout.hash = txFirst[1]->GetHash();
+ tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | (((chainActive.Tip()->GetMedianTimePast()+1-chainActive[1]->GetMedianTimePast()) >> CTxIn::SEQUENCE_LOCKTIME_GRANULARITY) + 1); // txFirst[1] is the 3rd block
+ prevheights[0] = baseheight + 2;
+ hash = tx.GetHash();
+ mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx));
+ BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes
+ BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail
+
+ for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++)
+ chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime += 512; //Trick the MedianTimePast
+ BOOST_CHECK(SequenceLocks(tx, flags, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 1))); // Sequence locks pass 512 seconds later
+ for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++)
+ chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime -= 512; //undo tricked MTP
+
+ // absolute height locked
+ tx.vin[0].prevout.hash = txFirst[2]->GetHash();
+ tx.vin[0].nSequence = CTxIn::SEQUENCE_FINAL - 1;
+ prevheights[0] = baseheight + 3;
+ tx.nLockTime = chainActive.Tip()->nHeight + 1;
+ hash = tx.GetHash();
+ mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx));
+ BOOST_CHECK(!CheckFinalTx(tx, flags)); // Locktime fails
+ BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass
+ BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetMedianTimePast())); // Locktime passes on 2nd block
+
+ // absolute time locked
+ tx.vin[0].prevout.hash = txFirst[3]->GetHash();
+ tx.nLockTime = chainActive.Tip()->GetMedianTimePast();
+ prevheights.resize(1);
+ prevheights[0] = baseheight + 4;
+ hash = tx.GetHash();
+ mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx));
+ BOOST_CHECK(!CheckFinalTx(tx, flags)); // Locktime fails
+ BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass
+ BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetMedianTimePast() + 1)); // Locktime passes 1 second later
- // 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));
+ // mempool-dependent transactions (not added)
+ tx.vin[0].prevout.hash = hash;
+ prevheights[0] = chainActive.Tip()->nHeight + 1;
+ tx.nLockTime = 0;
+ tx.vin[0].nSequence = 0;
+ BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes
+ BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass
+ tx.vin[0].nSequence = 1;
+ BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail
+ tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG;
+ BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass
+ tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | 1;
+ BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail
- BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey));
- BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 2);
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
+
+ // None of the of the absolute height/time locked tx should have made
+ // it into the template because we still check IsFinalTx in CreateNewBlock,
+ // but relative locked txs will if inconsistently added to mempool.
+ // For now these will still generate a valid template until BIP68 soft fork
+ BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 3);
+ delete pblocktemplate;
+ // However if we advance height by 1 and time by 512, all of them should be mined
+ for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++)
+ chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime += 512; //Trick the MedianTimePast
+ chainActive.Tip()->nHeight++;
+ SetMockTime(chainActive.Tip()->GetMedianTimePast() + 1);
+
+ BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey));
+ BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 5);
delete pblocktemplate;
chainActive.Tip()->nHeight--;
SetMockTime(0);
mempool.clear();
- BOOST_FOREACH(CTransaction *tx, txFirst)
- delete tx;
+ TestPackageSelection(chainparams, scriptPubKey, txFirst);
+
+ BOOST_FOREACH(CTransaction *_tx, txFirst)
+ delete _tx;
fCheckpointsEnabled = true;
}
diff --git a/src/test/mruset_tests.cpp b/src/test/mruset_tests.cpp
deleted file mode 100644
index 2b68f8899e..0000000000
--- a/src/test/mruset_tests.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// 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 "mruset.h"
-
-#include "random.h"
-#include "util.h"
-#include "test/test_bitcoin.h"
-
-#include <set>
-
-#include <boost/test/unit_test.hpp>
-
-#define NUM_TESTS 16
-#define MAX_SIZE 100
-
-using namespace std;
-
-BOOST_FIXTURE_TEST_SUITE(mruset_tests, BasicTestingSetup)
-
-BOOST_AUTO_TEST_CASE(mruset_test)
-{
- // 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));
- }
- }
- }
- }
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp
index b65c299adc..581b0cee1e 100644
--- a/src/test/multisig_tests.cpp
+++ b/src/test/multisig_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// Copyright (c) 2011-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.
@@ -9,12 +9,10 @@
#include "script/script_error.h"
#include "script/interpreter.h"
#include "script/sign.h"
+#include "script/ismine.h"
#include "uint256.h"
#include "test/test_bitcoin.h"
-#ifdef ENABLE_WALLET
-#include "wallet/wallet_ismine.h"
-#endif
#include <boost/foreach.hpp>
#include <boost/test/unit_test.hpp>
@@ -28,7 +26,7 @@ BOOST_FIXTURE_TEST_SUITE(multisig_tests, BasicTestingSetup)
CScript
sign_multisig(CScript scriptPubKey, vector<CKey> keys, CTransaction transaction, int whichIn)
{
- uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL);
+ uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL, 0, SIGVERSION_BASE);
CScript result;
result << OP_0; // CHECKMULTISIG bug workaround
@@ -48,6 +46,7 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
ScriptError err;
CKey key[4];
+ CAmount amount = 0;
for (int i = 0; i < 4; i++)
key[i].MakeNewKey(true);
@@ -83,20 +82,20 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
keys.assign(1,key[0]);
keys.push_back(key[1]);
s = sign_multisig(a_and_b, keys, txTo[0], 0);
- BOOST_CHECK(VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err));
+ BOOST_CHECK(VerifyScript(s, a_and_b, NULL, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
for (int i = 0; i < 4; i++)
{
keys.assign(1,key[i]);
s = sign_multisig(a_and_b, keys, txTo[0], 0);
- BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err), strprintf("a&b 1: %d", i));
+ BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, NULL, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 1: %d", i));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
keys.assign(1,key[1]);
keys.push_back(key[i]);
s = sign_multisig(a_and_b, keys, txTo[0], 0);
- BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err), strprintf("a&b 2: %d", i));
+ BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, NULL, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 2: %d", i));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
}
@@ -107,18 +106,18 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
s = sign_multisig(a_or_b, keys, txTo[1], 0);
if (i == 0 || i == 1)
{
- BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err), strprintf("a|b: %d", i));
+ BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, NULL, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
}
else
{
- BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err), strprintf("a|b: %d", i));
+ BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, NULL, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
}
}
s.clear();
s << OP_0 << OP_1;
- BOOST_CHECK(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err));
+ BOOST_CHECK(!VerifyScript(s, a_or_b, NULL, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_SIG_DER, ScriptErrorString(err));
@@ -130,12 +129,12 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
s = sign_multisig(escrow, keys, txTo[2], 0);
if (i < j && i < 3 && j < 3)
{
- BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0), &err), strprintf("escrow 1: %d %d", i, j));
+ BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, NULL, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 1: %d %d", i, j));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
}
else
{
- BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0), &err), strprintf("escrow 2: %d %d", i, j));
+ BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, NULL, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 2: %d %d", i, j));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
}
}
@@ -210,10 +209,8 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1)
CTxDestination addr;
BOOST_CHECK(ExtractDestination(s, addr));
BOOST_CHECK(addr == keyaddr[0]);
-#ifdef ENABLE_WALLET
BOOST_CHECK(IsMine(keystore, s));
BOOST_CHECK(!IsMine(emptykeystore, s));
-#endif
}
{
vector<valtype> solutions;
@@ -225,10 +222,8 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1)
CTxDestination addr;
BOOST_CHECK(ExtractDestination(s, addr));
BOOST_CHECK(addr == keyaddr[0]);
-#ifdef ENABLE_WALLET
BOOST_CHECK(IsMine(keystore, s));
BOOST_CHECK(!IsMine(emptykeystore, s));
-#endif
}
{
vector<valtype> solutions;
@@ -239,11 +234,9 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1)
BOOST_CHECK_EQUAL(solutions.size(), 4U);
CTxDestination addr;
BOOST_CHECK(!ExtractDestination(s, addr));
-#ifdef ENABLE_WALLET
BOOST_CHECK(IsMine(keystore, s));
BOOST_CHECK(!IsMine(emptykeystore, s));
BOOST_CHECK(!IsMine(partialkeystore, s));
-#endif
}
{
vector<valtype> solutions;
@@ -258,11 +251,9 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1)
BOOST_CHECK(addrs[0] == keyaddr[0]);
BOOST_CHECK(addrs[1] == keyaddr[1]);
BOOST_CHECK(nRequired == 1);
-#ifdef ENABLE_WALLET
BOOST_CHECK(IsMine(keystore, s));
BOOST_CHECK(!IsMine(emptykeystore, s));
BOOST_CHECK(!IsMine(partialkeystore, s));
-#endif
}
{
vector<valtype> solutions;
@@ -312,7 +303,7 @@ BOOST_AUTO_TEST_CASE(multisig_Sign)
for (int i = 0; i < 3; i++)
{
- BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i));
+ BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
}
}
diff --git a/src/test/net_tests.cpp b/src/test/net_tests.cpp
new file mode 100644
index 0000000000..4a7d6e778f
--- /dev/null
+++ b/src/test/net_tests.cpp
@@ -0,0 +1,177 @@
+// Copyright (c) 2012-2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include "addrman.h"
+#include "test/test_bitcoin.h"
+#include <string>
+#include <boost/test/unit_test.hpp>
+#include "hash.h"
+#include "serialize.h"
+#include "streams.h"
+#include "net.h"
+#include "netbase.h"
+#include "chainparams.h"
+
+using namespace std;
+
+class CAddrManSerializationMock : public CAddrMan
+{
+public:
+ virtual void Serialize(CDataStream& s, int nType, int nVersionDummy) const = 0;
+
+ //! Ensure that bucket placement is always the same for testing purposes.
+ void MakeDeterministic()
+ {
+ nKey.SetNull();
+ seed_insecure_rand(true);
+ }
+};
+
+class CAddrManUncorrupted : public CAddrManSerializationMock
+{
+public:
+ void Serialize(CDataStream& s, int nType, int nVersionDummy) const
+ {
+ CAddrMan::Serialize(s, nType, nVersionDummy);
+ }
+};
+
+class CAddrManCorrupted : public CAddrManSerializationMock
+{
+public:
+ void Serialize(CDataStream& s, int nType, int nVersionDummy) const
+ {
+ // Produces corrupt output that claims addrman has 20 addrs when it only has one addr.
+ unsigned char nVersion = 1;
+ s << nVersion;
+ s << ((unsigned char)32);
+ s << nKey;
+ s << 10; // nNew
+ s << 10; // nTried
+
+ int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30);
+ s << nUBuckets;
+
+ CService serv;
+ Lookup("252.1.1.1", serv, 7777, false);
+ CAddress addr = CAddress(serv, NODE_NONE);
+ CNetAddr resolved;
+ LookupHost("252.2.2.2", resolved, false);
+ CAddrInfo info = CAddrInfo(addr, resolved);
+ s << info;
+ }
+};
+
+CDataStream AddrmanToStream(CAddrManSerializationMock& _addrman)
+{
+ CDataStream ssPeersIn(SER_DISK, CLIENT_VERSION);
+ ssPeersIn << FLATDATA(Params().MessageStart());
+ ssPeersIn << _addrman;
+ std::string str = ssPeersIn.str();
+ vector<unsigned char> vchData(str.begin(), str.end());
+ return CDataStream(vchData, SER_DISK, CLIENT_VERSION);
+}
+
+BOOST_FIXTURE_TEST_SUITE(net_tests, BasicTestingSetup)
+
+BOOST_AUTO_TEST_CASE(caddrdb_read)
+{
+ CAddrManUncorrupted addrmanUncorrupted;
+ addrmanUncorrupted.MakeDeterministic();
+
+ CService addr1, addr2, addr3;
+ Lookup("250.7.1.1", addr1, 8333, false);
+ Lookup("250.7.2.2", addr2, 9999, false);
+ Lookup("250.7.3.3", addr3, 9999, false);
+
+ // Add three addresses to new table.
+ CService source;
+ Lookup("252.5.1.1", source, 8333, false);
+ addrmanUncorrupted.Add(CAddress(addr1, NODE_NONE), source);
+ addrmanUncorrupted.Add(CAddress(addr2, NODE_NONE), source);
+ addrmanUncorrupted.Add(CAddress(addr3, NODE_NONE), source);
+
+ // Test that the de-serialization does not throw an exception.
+ CDataStream ssPeers1 = AddrmanToStream(addrmanUncorrupted);
+ bool exceptionThrown = false;
+ CAddrMan addrman1;
+
+ BOOST_CHECK(addrman1.size() == 0);
+ try {
+ unsigned char pchMsgTmp[4];
+ ssPeers1 >> FLATDATA(pchMsgTmp);
+ ssPeers1 >> addrman1;
+ } catch (const std::exception& e) {
+ exceptionThrown = true;
+ }
+
+ BOOST_CHECK(addrman1.size() == 3);
+ BOOST_CHECK(exceptionThrown == false);
+
+ // Test that CAddrDB::Read creates an addrman with the correct number of addrs.
+ CDataStream ssPeers2 = AddrmanToStream(addrmanUncorrupted);
+
+ CAddrMan addrman2;
+ CAddrDB adb;
+ BOOST_CHECK(addrman2.size() == 0);
+ adb.Read(addrman2, ssPeers2);
+ BOOST_CHECK(addrman2.size() == 3);
+}
+
+
+BOOST_AUTO_TEST_CASE(caddrdb_read_corrupted)
+{
+ CAddrManCorrupted addrmanCorrupted;
+ addrmanCorrupted.MakeDeterministic();
+
+ // Test that the de-serialization of corrupted addrman throws an exception.
+ CDataStream ssPeers1 = AddrmanToStream(addrmanCorrupted);
+ bool exceptionThrown = false;
+ CAddrMan addrman1;
+ BOOST_CHECK(addrman1.size() == 0);
+ try {
+ unsigned char pchMsgTmp[4];
+ ssPeers1 >> FLATDATA(pchMsgTmp);
+ ssPeers1 >> addrman1;
+ } catch (const std::exception& e) {
+ exceptionThrown = true;
+ }
+ // Even through de-serialization failed addrman is not left in a clean state.
+ BOOST_CHECK(addrman1.size() == 1);
+ BOOST_CHECK(exceptionThrown);
+
+ // Test that CAddrDB::Read leaves addrman in a clean state if de-serialization fails.
+ CDataStream ssPeers2 = AddrmanToStream(addrmanCorrupted);
+
+ CAddrMan addrman2;
+ CAddrDB adb;
+ BOOST_CHECK(addrman2.size() == 0);
+ adb.Read(addrman2, ssPeers2);
+ BOOST_CHECK(addrman2.size() == 0);
+}
+
+BOOST_AUTO_TEST_CASE(cnode_simple_test)
+{
+ SOCKET hSocket = INVALID_SOCKET;
+ NodeId id = 0;
+ int height = 0;
+
+ in_addr ipv4Addr;
+ ipv4Addr.s_addr = 0xa0b0c001;
+
+ CAddress addr = CAddress(CService(ipv4Addr, 7777), NODE_NETWORK);
+ std::string pszDest = "";
+ bool fInboundIn = false;
+
+ // Test that fFeeler is false by default.
+ CNode* pnode1 = new CNode(id++, NODE_NETWORK, height, hSocket, addr, 0, pszDest, fInboundIn);
+ BOOST_CHECK(pnode1->fInbound == false);
+ BOOST_CHECK(pnode1->fFeeler == false);
+
+ fInboundIn = true;
+ CNode* pnode2 = new CNode(id++, NODE_NETWORK, height, hSocket, addr, 1, pszDest, fInboundIn);
+ BOOST_CHECK(pnode2->fInbound == true);
+ BOOST_CHECK(pnode2->fFeeler == false);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/netbase_tests.cpp b/src/test/netbase_tests.cpp
index b1ef0ed24a..18ad5dc90b 100644
--- a/src/test/netbase_tests.cpp
+++ b/src/test/netbase_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
@@ -14,37 +14,54 @@ using namespace std;
BOOST_FIXTURE_TEST_SUITE(netbase_tests, BasicTestingSetup)
+static CNetAddr ResolveIP(const char* ip)
+{
+ CNetAddr addr;
+ LookupHost(ip, addr, false);
+ return addr;
+}
+
+static CSubNet ResolveSubNet(const char* subnet)
+{
+ CSubNet ret;
+ LookupSubNet(subnet, ret);
+ return ret;
+}
+
BOOST_AUTO_TEST_CASE(netbase_networks)
{
- BOOST_CHECK(CNetAddr("127.0.0.1").GetNetwork() == NET_UNROUTABLE);
- BOOST_CHECK(CNetAddr("::1").GetNetwork() == NET_UNROUTABLE);
- BOOST_CHECK(CNetAddr("8.8.8.8").GetNetwork() == NET_IPV4);
- BOOST_CHECK(CNetAddr("2001::8888").GetNetwork() == NET_IPV6);
- BOOST_CHECK(CNetAddr("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetNetwork() == NET_TOR);
+ BOOST_CHECK(ResolveIP("127.0.0.1").GetNetwork() == NET_UNROUTABLE);
+ BOOST_CHECK(ResolveIP("::1").GetNetwork() == NET_UNROUTABLE);
+ BOOST_CHECK(ResolveIP("8.8.8.8").GetNetwork() == NET_IPV4);
+ BOOST_CHECK(ResolveIP("2001::8888").GetNetwork() == NET_IPV6);
+ BOOST_CHECK(ResolveIP("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetNetwork() == NET_TOR);
+
}
BOOST_AUTO_TEST_CASE(netbase_properties)
{
- BOOST_CHECK(CNetAddr("127.0.0.1").IsIPv4());
- BOOST_CHECK(CNetAddr("::FFFF:192.168.1.1").IsIPv4());
- BOOST_CHECK(CNetAddr("::1").IsIPv6());
- BOOST_CHECK(CNetAddr("10.0.0.1").IsRFC1918());
- BOOST_CHECK(CNetAddr("192.168.1.1").IsRFC1918());
- BOOST_CHECK(CNetAddr("172.31.255.255").IsRFC1918());
- BOOST_CHECK(CNetAddr("2001:0DB8::").IsRFC3849());
- BOOST_CHECK(CNetAddr("169.254.1.1").IsRFC3927());
- BOOST_CHECK(CNetAddr("2002::1").IsRFC3964());
- BOOST_CHECK(CNetAddr("FC00::").IsRFC4193());
- BOOST_CHECK(CNetAddr("2001::2").IsRFC4380());
- BOOST_CHECK(CNetAddr("2001:10::").IsRFC4843());
- BOOST_CHECK(CNetAddr("FE80::").IsRFC4862());
- BOOST_CHECK(CNetAddr("64:FF9B::").IsRFC6052());
- BOOST_CHECK(CNetAddr("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").IsTor());
- BOOST_CHECK(CNetAddr("127.0.0.1").IsLocal());
- BOOST_CHECK(CNetAddr("::1").IsLocal());
- BOOST_CHECK(CNetAddr("8.8.8.8").IsRoutable());
- BOOST_CHECK(CNetAddr("2001::1").IsRoutable());
- BOOST_CHECK(CNetAddr("127.0.0.1").IsValid());
+
+ BOOST_CHECK(ResolveIP("127.0.0.1").IsIPv4());
+ BOOST_CHECK(ResolveIP("::FFFF:192.168.1.1").IsIPv4());
+ BOOST_CHECK(ResolveIP("::1").IsIPv6());
+ BOOST_CHECK(ResolveIP("10.0.0.1").IsRFC1918());
+ BOOST_CHECK(ResolveIP("192.168.1.1").IsRFC1918());
+ BOOST_CHECK(ResolveIP("172.31.255.255").IsRFC1918());
+ BOOST_CHECK(ResolveIP("2001:0DB8::").IsRFC3849());
+ BOOST_CHECK(ResolveIP("169.254.1.1").IsRFC3927());
+ BOOST_CHECK(ResolveIP("2002::1").IsRFC3964());
+ BOOST_CHECK(ResolveIP("FC00::").IsRFC4193());
+ BOOST_CHECK(ResolveIP("2001::2").IsRFC4380());
+ BOOST_CHECK(ResolveIP("2001:10::").IsRFC4843());
+ BOOST_CHECK(ResolveIP("FE80::").IsRFC4862());
+ BOOST_CHECK(ResolveIP("64:FF9B::").IsRFC6052());
+ BOOST_CHECK(ResolveIP("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").IsTor());
+ BOOST_CHECK(ResolveIP("127.0.0.1").IsLocal());
+ BOOST_CHECK(ResolveIP("::1").IsLocal());
+ BOOST_CHECK(ResolveIP("8.8.8.8").IsRoutable());
+ BOOST_CHECK(ResolveIP("2001::1").IsRoutable());
+ BOOST_CHECK(ResolveIP("127.0.0.1").IsValid());
+
}
bool static TestSplitHost(string test, string host, int port)
@@ -76,9 +93,7 @@ BOOST_AUTO_TEST_CASE(netbase_splithost)
bool static TestParse(string src, string canon)
{
- CService addr;
- if (!LookupNumeric(src.c_str(), addr, 65535))
- return canon == "";
+ CService addr(LookupNumeric(src.c_str(), 65535));
return canon == addr.ToString();
}
@@ -90,165 +105,185 @@ BOOST_AUTO_TEST_CASE(netbase_lookupnumeric)
BOOST_CHECK(TestParse("::", "[::]:65535"));
BOOST_CHECK(TestParse("[::]:8333", "[::]:8333"));
BOOST_CHECK(TestParse("[127.0.0.1]", "127.0.0.1:65535"));
- BOOST_CHECK(TestParse(":::", ""));
+ BOOST_CHECK(TestParse(":::", "[::]:0"));
}
BOOST_AUTO_TEST_CASE(onioncat_test)
{
+
// values from https://web.archive.org/web/20121122003543/http://www.cypherpunk.at/onioncat/wiki/OnionCat
- CNetAddr addr1("5wyqrzbvrdsumnok.onion");
- CNetAddr addr2("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca");
+ CNetAddr addr1(ResolveIP("5wyqrzbvrdsumnok.onion"));
+ CNetAddr addr2(ResolveIP("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca"));
BOOST_CHECK(addr1 == addr2);
BOOST_CHECK(addr1.IsTor());
BOOST_CHECK(addr1.ToStringIP() == "5wyqrzbvrdsumnok.onion");
BOOST_CHECK(addr1.IsRoutable());
+
}
BOOST_AUTO_TEST_CASE(subnet_test)
{
- BOOST_CHECK(CSubNet("1.2.3.0/24") == CSubNet("1.2.3.0/255.255.255.0"));
- BOOST_CHECK(CSubNet("1.2.3.0/24") != CSubNet("1.2.4.0/255.255.255.0"));
- BOOST_CHECK(CSubNet("1.2.3.0/24").Match(CNetAddr("1.2.3.4")));
- BOOST_CHECK(!CSubNet("1.2.2.0/24").Match(CNetAddr("1.2.3.4")));
- BOOST_CHECK(CSubNet("1.2.3.4").Match(CNetAddr("1.2.3.4")));
- BOOST_CHECK(CSubNet("1.2.3.4/32").Match(CNetAddr("1.2.3.4")));
- BOOST_CHECK(!CSubNet("1.2.3.4").Match(CNetAddr("5.6.7.8")));
- BOOST_CHECK(!CSubNet("1.2.3.4/32").Match(CNetAddr("5.6.7.8")));
- BOOST_CHECK(CSubNet("::ffff:127.0.0.1").Match(CNetAddr("127.0.0.1")));
- 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")));
+
+ BOOST_CHECK(ResolveSubNet("1.2.3.0/24") == ResolveSubNet("1.2.3.0/255.255.255.0"));
+ BOOST_CHECK(ResolveSubNet("1.2.3.0/24") != ResolveSubNet("1.2.4.0/255.255.255.0"));
+ BOOST_CHECK(ResolveSubNet("1.2.3.0/24").Match(ResolveIP("1.2.3.4")));
+ BOOST_CHECK(!ResolveSubNet("1.2.2.0/24").Match(ResolveIP("1.2.3.4")));
+ BOOST_CHECK(ResolveSubNet("1.2.3.4").Match(ResolveIP("1.2.3.4")));
+ BOOST_CHECK(ResolveSubNet("1.2.3.4/32").Match(ResolveIP("1.2.3.4")));
+ BOOST_CHECK(!ResolveSubNet("1.2.3.4").Match(ResolveIP("5.6.7.8")));
+ BOOST_CHECK(!ResolveSubNet("1.2.3.4/32").Match(ResolveIP("5.6.7.8")));
+ BOOST_CHECK(ResolveSubNet("::ffff:127.0.0.1").Match(ResolveIP("127.0.0.1")));
+ BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8").Match(ResolveIP("1:2:3:4:5:6:7:8")));
+ BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8").Match(ResolveIP("1:2:3:4:5:6:7:9")));
+ BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:0/112").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
+ BOOST_CHECK(ResolveSubNet("192.168.0.1/24").Match(ResolveIP("192.168.0.2")));
+ BOOST_CHECK(ResolveSubNet("192.168.0.20/29").Match(ResolveIP("192.168.0.18")));
+ BOOST_CHECK(ResolveSubNet("1.2.2.1/24").Match(ResolveIP("1.2.2.4")));
+ BOOST_CHECK(ResolveSubNet("1.2.2.110/31").Match(ResolveIP("1.2.2.111")));
+ BOOST_CHECK(ResolveSubNet("1.2.2.20/26").Match(ResolveIP("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")));
+ BOOST_CHECK(ResolveSubNet("::/0").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
+ BOOST_CHECK(ResolveSubNet("::/0").Match(ResolveIP("1.2.3.4")));
// All-Matching IPv4 does not Match IPv6
- BOOST_CHECK(!CSubNet("0.0.0.0/0").Match(CNetAddr("1:2:3:4:5:6:7:1234")));
+ BOOST_CHECK(!ResolveSubNet("0.0.0.0/0").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
// Invalid subnets Match nothing (not even invalid addresses)
- BOOST_CHECK(!CSubNet().Match(CNetAddr("1.2.3.4")));
- BOOST_CHECK(!CSubNet("").Match(CNetAddr("4.5.6.7")));
- BOOST_CHECK(!CSubNet("bloop").Match(CNetAddr("0.0.0.0")));
- BOOST_CHECK(!CSubNet("bloop").Match(CNetAddr("hab")));
+ BOOST_CHECK(!CSubNet().Match(ResolveIP("1.2.3.4")));
+ BOOST_CHECK(!ResolveSubNet("").Match(ResolveIP("4.5.6.7")));
+ BOOST_CHECK(!ResolveSubNet("bloop").Match(ResolveIP("0.0.0.0")));
+ BOOST_CHECK(!ResolveSubNet("bloop").Match(ResolveIP("hab")));
// Check valid/invalid
- BOOST_CHECK(CSubNet("1.2.3.0/0").IsValid());
- BOOST_CHECK(!CSubNet("1.2.3.0/-1").IsValid());
- BOOST_CHECK(CSubNet("1.2.3.0/32").IsValid());
- BOOST_CHECK(!CSubNet("1.2.3.0/33").IsValid());
- BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:8/0").IsValid());
- BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:8/33").IsValid());
- BOOST_CHECK(!CSubNet("1:2:3:4:5:6:7:8/-1").IsValid());
- BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:8/128").IsValid());
- BOOST_CHECK(!CSubNet("1:2:3:4:5:6:7:8/129").IsValid());
- BOOST_CHECK(!CSubNet("fuzzy").IsValid());
+ BOOST_CHECK(ResolveSubNet("1.2.3.0/0").IsValid());
+ BOOST_CHECK(!ResolveSubNet("1.2.3.0/-1").IsValid());
+ BOOST_CHECK(ResolveSubNet("1.2.3.0/32").IsValid());
+ BOOST_CHECK(!ResolveSubNet("1.2.3.0/33").IsValid());
+ BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/0").IsValid());
+ BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/33").IsValid());
+ BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8/-1").IsValid());
+ BOOST_CHECK(ResolveSubNet("1:2:3:4:5:6:7:8/128").IsValid());
+ BOOST_CHECK(!ResolveSubNet("1:2:3:4:5:6:7:8/129").IsValid());
+ BOOST_CHECK(!ResolveSubNet("fuzzy").IsValid());
//CNetAddr constructor test
- BOOST_CHECK(CSubNet(CNetAddr("127.0.0.1")).IsValid());
- BOOST_CHECK(CSubNet(CNetAddr("127.0.0.1")).Match(CNetAddr("127.0.0.1")));
- BOOST_CHECK(!CSubNet(CNetAddr("127.0.0.1")).Match(CNetAddr("127.0.0.2")));
- BOOST_CHECK(CSubNet(CNetAddr("127.0.0.1")).ToString() == "127.0.0.1/32");
+ BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).IsValid());
+ BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).Match(ResolveIP("127.0.0.1")));
+ BOOST_CHECK(!CSubNet(ResolveIP("127.0.0.1")).Match(ResolveIP("127.0.0.2")));
+ BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).ToString() == "127.0.0.1/32");
- BOOST_CHECK(CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).IsValid());
- BOOST_CHECK(CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).Match(CNetAddr("1:2:3:4:5:6:7:8")));
- BOOST_CHECK(!CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).Match(CNetAddr("1:2:3:4:5:6:7:9")));
- BOOST_CHECK(CSubNet(CNetAddr("1:2:3:4:5:6:7:8")).ToString() == "1:2:3:4:5:6:7:8/128");
+ CSubNet subnet = CSubNet(ResolveIP("1.2.3.4"), 32);
+ BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
+ subnet = CSubNet(ResolveIP("1.2.3.4"), 8);
+ BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
+ subnet = CSubNet(ResolveIP("1.2.3.4"), 0);
+ BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
- CSubNet subnet = CSubNet("1.2.3.4/255.255.255.255");
+ subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("255.255.255.255"));
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
- subnet = CSubNet("1.2.3.4/255.255.255.254");
+ subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("255.0.0.0"));
+ BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
+ subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("0.0.0.0"));
+ BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
+
+ BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).IsValid());
+ BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).Match(ResolveIP("1:2:3:4:5:6:7:8")));
+ BOOST_CHECK(!CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).Match(ResolveIP("1:2:3:4:5:6:7:9")));
+ BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).ToString() == "1:2:3:4:5:6:7:8/128");
+
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.255");
+ BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.254");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/31");
- subnet = CSubNet("1.2.3.4/255.255.255.252");
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.252");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/30");
- subnet = CSubNet("1.2.3.4/255.255.255.248");
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.248");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/29");
- subnet = CSubNet("1.2.3.4/255.255.255.240");
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.240");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/28");
- subnet = CSubNet("1.2.3.4/255.255.255.224");
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.224");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/27");
- subnet = CSubNet("1.2.3.4/255.255.255.192");
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.192");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/26");
- subnet = CSubNet("1.2.3.4/255.255.255.128");
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.128");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/25");
- subnet = CSubNet("1.2.3.4/255.255.255.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.255.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/24");
- subnet = CSubNet("1.2.3.4/255.255.254.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.254.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.2.0/23");
- subnet = CSubNet("1.2.3.4/255.255.252.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.252.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/22");
- subnet = CSubNet("1.2.3.4/255.255.248.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.248.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/21");
- subnet = CSubNet("1.2.3.4/255.255.240.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.240.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/20");
- subnet = CSubNet("1.2.3.4/255.255.224.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.224.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/19");
- subnet = CSubNet("1.2.3.4/255.255.192.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.192.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/18");
- subnet = CSubNet("1.2.3.4/255.255.128.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.128.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/17");
- subnet = CSubNet("1.2.3.4/255.255.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/16");
- subnet = CSubNet("1.2.3.4/255.254.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.254.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/15");
- subnet = CSubNet("1.2.3.4/255.252.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.252.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/14");
- subnet = CSubNet("1.2.3.4/255.248.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.248.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/13");
- subnet = CSubNet("1.2.3.4/255.240.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.240.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/12");
- subnet = CSubNet("1.2.3.4/255.224.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.224.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/11");
- subnet = CSubNet("1.2.3.4/255.192.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.192.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/10");
- subnet = CSubNet("1.2.3.4/255.128.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.128.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/9");
- subnet = CSubNet("1.2.3.4/255.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/255.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
- subnet = CSubNet("1.2.3.4/254.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/254.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/7");
- subnet = CSubNet("1.2.3.4/252.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/252.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/6");
- subnet = CSubNet("1.2.3.4/248.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/248.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/5");
- subnet = CSubNet("1.2.3.4/240.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/240.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/4");
- subnet = CSubNet("1.2.3.4/224.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/224.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/3");
- subnet = CSubNet("1.2.3.4/192.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/192.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/2");
- subnet = CSubNet("1.2.3.4/128.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/128.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/1");
- subnet = CSubNet("1.2.3.4/0.0.0.0");
+ subnet = ResolveSubNet("1.2.3.4/0.0.0.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
- subnet = CSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
+ subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/128");
- subnet = CSubNet("1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");
+ subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");
BOOST_CHECK_EQUAL(subnet.ToString(), "1::/16");
- subnet = CSubNet("1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");
+ subnet = ResolveSubNet("1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");
BOOST_CHECK_EQUAL(subnet.ToString(), "::/0");
- subnet = CSubNet("1.2.3.4/255.255.232.0");
+ subnet = ResolveSubNet("1.2.3.4/255.255.232.0");
BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/255.255.232.0");
- subnet = CSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
+ subnet = ResolveSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
+
}
BOOST_AUTO_TEST_CASE(netbase_getgroup)
{
- BOOST_CHECK(CNetAddr("127.0.0.1").GetGroup() == boost::assign::list_of(0)); // Local -> !Routable()
- BOOST_CHECK(CNetAddr("257.0.0.1").GetGroup() == boost::assign::list_of(0)); // !Valid -> !Routable()
- BOOST_CHECK(CNetAddr("10.0.0.1").GetGroup() == boost::assign::list_of(0)); // RFC1918 -> !Routable()
- BOOST_CHECK(CNetAddr("169.254.1.1").GetGroup() == boost::assign::list_of(0)); // RFC3927 -> !Routable()
- BOOST_CHECK(CNetAddr("1.2.3.4").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // IPv4
- BOOST_CHECK(CNetAddr("::FFFF:0:102:304").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC6145
- BOOST_CHECK(CNetAddr("64:FF9B::102:304").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC6052
- BOOST_CHECK(CNetAddr("2002:102:304:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC3964
- BOOST_CHECK(CNetAddr("2001:0:9999:9999:9999:9999:FEFD:FCFB").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC4380
- BOOST_CHECK(CNetAddr("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetGroup() == boost::assign::list_of((unsigned char)NET_TOR)(239)); // Tor
- BOOST_CHECK(CNetAddr("2001:470:abcd:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV6)(32)(1)(4)(112)(175)); //he.net
- BOOST_CHECK(CNetAddr("2001:2001:9999:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV6)(32)(1)(32)(1)); //IPv6
+
+ BOOST_CHECK(ResolveIP("127.0.0.1").GetGroup() == boost::assign::list_of(0)); // Local -> !Routable()
+ BOOST_CHECK(ResolveIP("257.0.0.1").GetGroup() == boost::assign::list_of(0)); // !Valid -> !Routable()
+ BOOST_CHECK(ResolveIP("10.0.0.1").GetGroup() == boost::assign::list_of(0)); // RFC1918 -> !Routable()
+ BOOST_CHECK(ResolveIP("169.254.1.1").GetGroup() == boost::assign::list_of(0)); // RFC3927 -> !Routable()
+ BOOST_CHECK(ResolveIP("1.2.3.4").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // IPv4
+ BOOST_CHECK(ResolveIP("::FFFF:0:102:304").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC6145
+ BOOST_CHECK(ResolveIP("64:FF9B::102:304").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC6052
+ BOOST_CHECK(ResolveIP("2002:102:304:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC3964
+ BOOST_CHECK(ResolveIP("2001:0:9999:9999:9999:9999:FEFD:FCFB").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV4)(1)(2)); // RFC4380
+ BOOST_CHECK(ResolveIP("FD87:D87E:EB43:edb1:8e4:3588:e546:35ca").GetGroup() == boost::assign::list_of((unsigned char)NET_TOR)(239)); // Tor
+ BOOST_CHECK(ResolveIP("2001:470:abcd:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV6)(32)(1)(4)(112)(175)); //he.net
+ BOOST_CHECK(ResolveIP("2001:2001:9999:9999:9999:9999:9999:9999").GetGroup() == boost::assign::list_of((unsigned char)NET_IPV6)(32)(1)(32)(1)); //IPv6
+
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/pmt_tests.cpp b/src/test/pmt_tests.cpp
index 0d7fb2bc35..e9c8691745 100644
--- a/src/test/pmt_tests.cpp
+++ b/src/test/pmt_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
@@ -37,8 +37,8 @@ BOOST_AUTO_TEST_CASE(pmt_test1)
seed_insecure_rand(false);
static const unsigned int nTxCounts[] = {1, 4, 7, 17, 56, 100, 127, 256, 312, 513, 1000, 4095};
- for (int n = 0; n < 12; n++) {
- unsigned int nTx = nTxCounts[n];
+ for (int i = 0; i < 12; i++) {
+ unsigned int nTx = nTxCounts[i];
// build a block with some dummy transactions
CBlock block;
@@ -88,7 +88,8 @@ BOOST_AUTO_TEST_CASE(pmt_test1)
// extract merkle root and matched txids from copy
std::vector<uint256> vMatchTxid2;
- uint256 merkleRoot2 = pmt2.ExtractMatches(vMatchTxid2);
+ std::vector<unsigned int> vIndex;
+ uint256 merkleRoot2 = pmt2.ExtractMatches(vMatchTxid2, vIndex);
// check that it has the same merkle root as the original, and a valid one
BOOST_CHECK(merkleRoot1 == merkleRoot2);
@@ -102,7 +103,7 @@ BOOST_AUTO_TEST_CASE(pmt_test1)
CPartialMerkleTreeTester pmt3(pmt2);
pmt3.Damage();
std::vector<uint256> vMatchTxid3;
- uint256 merkleRoot3 = pmt3.ExtractMatches(vMatchTxid3);
+ uint256 merkleRoot3 = pmt3.ExtractMatches(vMatchTxid3, vIndex);
BOOST_CHECK(merkleRoot3 != merkleRoot1);
}
}
@@ -121,8 +122,8 @@ BOOST_AUTO_TEST_CASE(pmt_malleability)
std::vector<bool> vMatch = boost::assign::list_of(false)(false)(false)(false)(false)(false)(false)(false)(false)(true)(true)(false);
CPartialMerkleTree tree(vTxid, vMatch);
- std::vector<uint256> vTxid2;
- BOOST_CHECK(tree.ExtractMatches(vTxid).IsNull());
+ std::vector<unsigned int> vIndex;
+ BOOST_CHECK(tree.ExtractMatches(vTxid, vIndex).IsNull());
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp
index 644c3da213..5c902387f1 100644
--- a/src/test/policyestimator_tests.cpp
+++ b/src/test/policyestimator_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 "policy/policy.h"
#include "policy/fees.h"
#include "txmempool.h"
#include "uint256.h"
@@ -50,7 +51,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
tx.vin[0].scriptSig = garbage;
tx.vout.resize(1);
tx.vout[0].nValue=0LL;
- CFeeRate baseRate(basefee, ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION));
+ CFeeRate baseRate(basefee, GetVirtualTransactionSize(tx));
// Create a fake block
std::vector<CTransaction> block;
@@ -74,9 +75,9 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
// 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);
+ std::shared_ptr<const CTransaction> ptx = mpool.get(txHashes[9-h].back());
+ if (ptx)
+ block.push_back(*ptx);
txHashes[9-h].pop_back();
}
}
@@ -160,9 +161,9 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
// 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);
+ std::shared_ptr<const CTransaction> ptx = mpool.get(txHashes[j].back());
+ if (ptx)
+ block.push_back(*ptx);
txHashes[j].pop_back();
}
}
@@ -181,9 +182,9 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
uint256 hash = tx.GetHash();
mpool.addUnchecked(hash, entry.Fee(feeV[k/4][j]).Time(GetTime()).Priority(priV[k/4][j]).Height(blocknum).FromTx(tx, &mpool));
- CTransaction btx;
- if (mpool.lookup(hash, btx))
- block.push_back(btx);
+ std::shared_ptr<const CTransaction> ptx = mpool.get(hash);
+ if (ptx)
+ block.push_back(*ptx);
}
}
mpool.removeForBlock(block, ++blocknum, dummyConflicted);
diff --git a/src/test/prevector_tests.cpp b/src/test/prevector_tests.cpp
index 01a45b540d..b8c45ca564 100644
--- a/src/test/prevector_tests.cpp
+++ b/src/test/prevector_tests.cpp
@@ -19,62 +19,77 @@ template<unsigned int N, typename T>
class prevector_tester {
typedef std::vector<T> realtype;
realtype real_vector;
+ realtype real_vector_alt;
typedef prevector<N, T> pretype;
pretype pre_vector;
+ pretype pre_vector_alt;
typedef typename pretype::size_type Size;
+ bool passed = true;
+ uint32_t insecure_rand_Rz_cache;
+ uint32_t insecure_rand_Rw_cache;
+
+ template <typename A, typename B>
+ void local_check_equal(A a, B b)
+ {
+ local_check(a == b);
+ }
+ void local_check(bool b)
+ {
+ passed &= b;
+ }
void test() {
const pretype& const_pre_vector = pre_vector;
- BOOST_CHECK_EQUAL(real_vector.size(), pre_vector.size());
- BOOST_CHECK_EQUAL(real_vector.empty(), pre_vector.empty());
+ local_check_equal(real_vector.size(), pre_vector.size());
+ local_check_equal(real_vector.empty(), pre_vector.empty());
for (Size s = 0; s < real_vector.size(); s++) {
- BOOST_CHECK(real_vector[s] == pre_vector[s]);
- BOOST_CHECK(&(pre_vector[s]) == &(pre_vector.begin()[s]));
- BOOST_CHECK(&(pre_vector[s]) == &*(pre_vector.begin() + s));
- BOOST_CHECK(&(pre_vector[s]) == &*((pre_vector.end() + s) - real_vector.size()));
+ local_check(real_vector[s] == pre_vector[s]);
+ local_check(&(pre_vector[s]) == &(pre_vector.begin()[s]));
+ local_check(&(pre_vector[s]) == &*(pre_vector.begin() + s));
+ local_check(&(pre_vector[s]) == &*((pre_vector.end() + s) - real_vector.size()));
}
- // BOOST_CHECK(realtype(pre_vector) == real_vector);
- BOOST_CHECK(pretype(real_vector.begin(), real_vector.end()) == pre_vector);
- BOOST_CHECK(pretype(pre_vector.begin(), pre_vector.end()) == pre_vector);
+ // local_check(realtype(pre_vector) == real_vector);
+ local_check(pretype(real_vector.begin(), real_vector.end()) == pre_vector);
+ local_check(pretype(pre_vector.begin(), pre_vector.end()) == pre_vector);
size_t pos = 0;
BOOST_FOREACH(const T& v, pre_vector) {
- BOOST_CHECK(v == real_vector[pos++]);
+ local_check(v == real_vector[pos++]);
}
BOOST_REVERSE_FOREACH(const T& v, pre_vector) {
- BOOST_CHECK(v == real_vector[--pos]);
+ local_check(v == real_vector[--pos]);
}
BOOST_FOREACH(const T& v, const_pre_vector) {
- BOOST_CHECK(v == real_vector[pos++]);
+ local_check(v == real_vector[pos++]);
}
BOOST_REVERSE_FOREACH(const T& v, const_pre_vector) {
- BOOST_CHECK(v == real_vector[--pos]);
+ local_check(v == real_vector[--pos]);
}
CDataStream ss1(SER_DISK, 0);
CDataStream ss2(SER_DISK, 0);
ss1 << real_vector;
ss2 << pre_vector;
- BOOST_CHECK_EQUAL(ss1.size(), ss2.size());
+ local_check_equal(ss1.size(), ss2.size());
for (Size s = 0; s < ss1.size(); s++) {
- BOOST_CHECK_EQUAL(ss1[s], ss2[s]);
+ local_check_equal(ss1[s], ss2[s]);
}
}
public:
void resize(Size s) {
real_vector.resize(s);
- BOOST_CHECK_EQUAL(real_vector.size(), s);
+ local_check_equal(real_vector.size(), s);
pre_vector.resize(s);
- BOOST_CHECK_EQUAL(pre_vector.size(), s);
+ local_check_equal(pre_vector.size(), s);
test();
}
void reserve(Size s) {
real_vector.reserve(s);
- BOOST_CHECK(real_vector.capacity() >= s);
+ local_check(real_vector.capacity() >= s);
pre_vector.reserve(s);
- BOOST_CHECK(pre_vector.capacity() >= s);
+ local_check(pre_vector.capacity() >= s);
test();
}
@@ -149,6 +164,23 @@ public:
pre_vector.shrink_to_fit();
test();
}
+
+ void swap() {
+ real_vector.swap(real_vector_alt);
+ pre_vector.swap(pre_vector_alt);
+ test();
+ }
+ ~prevector_tester() {
+ BOOST_CHECK_MESSAGE(passed, "insecure_rand_Rz: "
+ << insecure_rand_Rz_cache
+ << ", insecure_rand_Rw: "
+ << insecure_rand_Rw_cache);
+ }
+ prevector_tester() {
+ seed_insecure_rand();
+ insecure_rand_Rz_cache = insecure_rand_Rz;
+ insecure_rand_Rw_cache = insecure_rand_Rw;
+ }
};
BOOST_AUTO_TEST_CASE(PrevectorTestInt)
@@ -184,8 +216,8 @@ BOOST_AUTO_TEST_CASE(PrevectorTestInt)
if (((r >> 21) % 32) == 7) {
int values[4];
int num = 1 + (insecure_rand() % 4);
- for (int i = 0; i < num; i++) {
- values[i] = insecure_rand();
+ for (int k = 0; k < num; k++) {
+ values[k] = insecure_rand();
}
test.insert_range(insecure_rand() % (test.size() + 1), values, values + num);
}
@@ -204,12 +236,15 @@ BOOST_AUTO_TEST_CASE(PrevectorTestInt)
if (test.size() > 0) {
test.update(insecure_rand() % test.size(), insecure_rand());
}
- if (((r >> 11) & 1024) == 11) {
+ if (((r >> 11) % 1024) == 11) {
test.clear();
}
- if (((r >> 21) & 512) == 12) {
+ if (((r >> 21) % 512) == 12) {
test.assign(insecure_rand() % 32, insecure_rand());
}
+ if (((r >> 15) % 64) == 3) {
+ test.swap();
+ }
}
}
}
diff --git a/src/test/reverselock_tests.cpp b/src/test/reverselock_tests.cpp
index e7e627ae0f..8bdff97000 100644
--- a/src/test/reverselock_tests.cpp
+++ b/src/test/reverselock_tests.cpp
@@ -42,22 +42,18 @@ BOOST_AUTO_TEST_CASE(reverselock_errors)
BOOST_CHECK(failed);
BOOST_CHECK(!lock.owns_lock());
- // Make sure trying to lock a lock after it has been reverse locked fails
- failed = false;
- bool locked = false;
+ // Locking the original lock after it has been taken by a reverse lock
+ // makes no sense. Ensure that the original lock no longer owns the lock
+ // after giving it to a reverse one.
lock.lock();
BOOST_CHECK(lock.owns_lock());
-
- try {
+ {
reverse_lock<boost::unique_lock<boost::mutex> > rlock(lock);
- lock.lock();
- locked = true;
- } catch(...) {
- failed = true;
+ BOOST_CHECK(!lock.owns_lock());
}
- BOOST_CHECK(locked && failed);
+ BOOST_CHECK(failed);
BOOST_CHECK(lock.owns_lock());
}
diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp
index ce22975005..a15915aad2 100644
--- a/src/test/rpc_tests.cpp
+++ b/src/test/rpc_tests.cpp
@@ -1,9 +1,9 @@
-// Copyright (c) 2012-2013 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.
-#include "rpcserver.h"
-#include "rpcclient.h"
+#include "rpc/server.h"
+#include "rpc/client.h"
#include "base58.h"
#include "netbase.h"
@@ -11,24 +11,13 @@
#include "test/test_bitcoin.h"
#include <boost/algorithm/string.hpp>
+#include <boost/assign/list_of.hpp>
#include <boost/test/unit_test.hpp>
#include <univalue.h>
using namespace std;
-UniValue
-createArgs(int nRequired, const char* address1=NULL, const char* address2=NULL)
-{
- UniValue result(UniValue::VARR);
- result.push_back(nRequired);
- UniValue addresses(UniValue::VARR);
- if (address1) addresses.push_back(address1);
- if (address2) addresses.push_back(address2);
- result.push_back(addresses);
- return result;
-}
-
UniValue CallRPC(string args)
{
vector<string> vArgs;
@@ -36,7 +25,7 @@ UniValue CallRPC(string args)
string strMethod = vArgs[0];
vArgs.erase(vArgs.begin());
UniValue params = RPCConvertValues(strMethod, vArgs);
-
+ BOOST_CHECK(tableRPC[strMethod]);
rpcfn_type method = tableRPC[strMethod]->actor;
try {
UniValue result = (*method)(params, false);
@@ -237,7 +226,7 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
UniValue o1 = ar[0].get_obj();
UniValue adr = find_value(o1, "address");
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/32");
- BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0 remove")));;
+ 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);
@@ -260,14 +249,14 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
adr = find_value(o1, "address");
banned_until = find_value(o1, "banned_until");
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/24");
- int64_t now = GetTime();
+ 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(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);
@@ -308,4 +297,27 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
BOOST_CHECK_EQUAL(adr.get_str(), "2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/128");
}
+BOOST_AUTO_TEST_CASE(rpc_convert_values_generatetoaddress)
+{
+ UniValue result;
+
+ BOOST_CHECK_NO_THROW(result = RPCConvertValues("generatetoaddress", boost::assign::list_of("101")("mkESjLZW66TmHhiFX8MCaBjrhZ543PPh9a")));
+ BOOST_CHECK_EQUAL(result[0].get_int(), 101);
+ BOOST_CHECK_EQUAL(result[1].get_str(), "mkESjLZW66TmHhiFX8MCaBjrhZ543PPh9a");
+
+ BOOST_CHECK_NO_THROW(result = RPCConvertValues("generatetoaddress", boost::assign::list_of("101")("mhMbmE2tE9xzJYCV9aNC8jKWN31vtGrguU")));
+ BOOST_CHECK_EQUAL(result[0].get_int(), 101);
+ BOOST_CHECK_EQUAL(result[1].get_str(), "mhMbmE2tE9xzJYCV9aNC8jKWN31vtGrguU");
+
+ BOOST_CHECK_NO_THROW(result = RPCConvertValues("generatetoaddress", boost::assign::list_of("1")("mkESjLZW66TmHhiFX8MCaBjrhZ543PPh9a")("9")));
+ BOOST_CHECK_EQUAL(result[0].get_int(), 1);
+ BOOST_CHECK_EQUAL(result[1].get_str(), "mkESjLZW66TmHhiFX8MCaBjrhZ543PPh9a");
+ BOOST_CHECK_EQUAL(result[2].get_int(), 9);
+
+ BOOST_CHECK_NO_THROW(result = RPCConvertValues("generatetoaddress", boost::assign::list_of("1")("mhMbmE2tE9xzJYCV9aNC8jKWN31vtGrguU")("9")));
+ BOOST_CHECK_EQUAL(result[0].get_int(), 1);
+ BOOST_CHECK_EQUAL(result[1].get_str(), "mhMbmE2tE9xzJYCV9aNC8jKWN31vtGrguU");
+ BOOST_CHECK_EQUAL(result[2].get_int(), 9);
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp
deleted file mode 100644
index 2e652f76e2..0000000000
--- a/src/test/rpc_wallet_tests.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright (c) 2013-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.
-
-#include "rpcserver.h"
-#include "rpcclient.h"
-
-#include "base58.h"
-#include "main.h"
-#include "wallet/wallet.h"
-
-#include "test/test_bitcoin.h"
-
-#include <boost/algorithm/string.hpp>
-#include <boost/test/unit_test.hpp>
-
-#include <univalue.h>
-
-using namespace std;
-
-extern UniValue createArgs(int nRequired, const char* address1 = NULL, const char* address2 = NULL);
-extern UniValue CallRPC(string args);
-
-extern CWallet* pwalletMain;
-
-BOOST_FIXTURE_TEST_SUITE(rpc_wallet_tests, TestingSetup)
-
-BOOST_AUTO_TEST_CASE(rpc_addmultisig)
-{
- rpcfn_type addmultisig = tableRPC["addmultisigaddress"]->actor;
-
- // old, 65-byte-long:
- const char address1Hex[] = "0434e3e09f49ea168c5bbf53f877ff4206923858aab7c7e1df25bc263978107c95e35065a27ef6f1b27222db0ec97e0e895eaca603d3ee0d4c060ce3d8a00286c8";
- // new, compressed:
- const char address2Hex[] = "0388c2037017c62240b6b72ac1a2a5f94da790596ebd06177c8572752922165cb4";
-
- UniValue v;
- CBitcoinAddress address;
- BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false));
- address.SetString(v.get_str());
- BOOST_CHECK(address.IsValid() && address.IsScript());
-
- BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex, address2Hex), false));
- address.SetString(v.get_str());
- BOOST_CHECK(address.IsValid() && address.IsScript());
-
- BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(2, address1Hex, address2Hex), false));
- address.SetString(v.get_str());
- BOOST_CHECK(address.IsValid() && address.IsScript());
-
- BOOST_CHECK_THROW(addmultisig(createArgs(0), false), runtime_error);
- BOOST_CHECK_THROW(addmultisig(createArgs(1), false), runtime_error);
- BOOST_CHECK_THROW(addmultisig(createArgs(2, address1Hex), false), runtime_error);
-
- BOOST_CHECK_THROW(addmultisig(createArgs(1, ""), false), runtime_error);
- BOOST_CHECK_THROW(addmultisig(createArgs(1, "NotAValidPubkey"), false), runtime_error);
-
- string short1(address1Hex, address1Hex + sizeof(address1Hex) - 2); // last byte missing
- BOOST_CHECK_THROW(addmultisig(createArgs(2, short1.c_str()), false), runtime_error);
-
- string short2(address1Hex + 1, address1Hex + sizeof(address1Hex)); // first byte missing
- BOOST_CHECK_THROW(addmultisig(createArgs(2, short2.c_str()), false), runtime_error);
-}
-
-BOOST_AUTO_TEST_CASE(rpc_wallet)
-{
- // Test RPC calls for various wallet statistics
- UniValue r;
- CPubKey demoPubkey;
- CBitcoinAddress demoAddress;
- UniValue retValue;
- string strAccount = "walletDemoAccount";
- CBitcoinAddress setaccountDemoAddress;
- {
- LOCK(pwalletMain->cs_wallet);
-
- demoPubkey = pwalletMain->GenerateNewKey();
- demoAddress = CBitcoinAddress(CTxDestination(demoPubkey.GetID()));
- string strPurpose = "receive";
- BOOST_CHECK_NO_THROW({ /*Initialize Wallet with an account */
- CWalletDB walletdb(pwalletMain->strWalletFile);
- CAccount account;
- account.vchPubKey = demoPubkey;
- pwalletMain->SetAddressBook(account.vchPubKey.GetID(), strAccount, strPurpose);
- walletdb.WriteAccount(strAccount, account);
- });
-
- CPubKey setaccountDemoPubkey = pwalletMain->GenerateNewKey();
- setaccountDemoAddress = CBitcoinAddress(CTxDestination(setaccountDemoPubkey.GetID()));
- }
- /*********************************
- * setaccount
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("setaccount " + setaccountDemoAddress.ToString() + " nullaccount"));
- /* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ is not owned by the test wallet. */
- BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ nullaccount"), runtime_error);
- BOOST_CHECK_THROW(CallRPC("setaccount"), runtime_error);
- /* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X (33 chars) is an illegal address (should be 34 chars) */
- BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X nullaccount"), runtime_error);
-
-
- /*********************************
- * getbalance
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("getbalance"));
- BOOST_CHECK_NO_THROW(CallRPC("getbalance " + demoAddress.ToString()));
-
- /*********************************
- * listunspent
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("listunspent"));
- BOOST_CHECK_THROW(CallRPC("listunspent string"), runtime_error);
- BOOST_CHECK_THROW(CallRPC("listunspent 0 string"), runtime_error);
- BOOST_CHECK_THROW(CallRPC("listunspent 0 1 not_array"), runtime_error);
- BOOST_CHECK_THROW(CallRPC("listunspent 0 1 [] extra"), runtime_error);
- BOOST_CHECK_NO_THROW(r = CallRPC("listunspent 0 1 []"));
- BOOST_CHECK(r.get_array().empty());
-
- /*********************************
- * listreceivedbyaddress
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress"));
- BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress 0"));
- BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress not_int"), runtime_error);
- BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress 0 not_bool"), runtime_error);
- BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaddress 0 true"));
- BOOST_CHECK_THROW(CallRPC("listreceivedbyaddress 0 true extra"), runtime_error);
-
- /*********************************
- * listreceivedbyaccount
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount"));
- BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount 0"));
- BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount not_int"), runtime_error);
- BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount 0 not_bool"), runtime_error);
- BOOST_CHECK_NO_THROW(CallRPC("listreceivedbyaccount 0 true"));
- BOOST_CHECK_THROW(CallRPC("listreceivedbyaccount 0 true extra"), runtime_error);
-
- /*********************************
- * listsinceblock
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("listsinceblock"));
-
- /*********************************
- * listtransactions
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("listtransactions"));
- BOOST_CHECK_NO_THROW(CallRPC("listtransactions " + demoAddress.ToString()));
- BOOST_CHECK_NO_THROW(CallRPC("listtransactions " + demoAddress.ToString() + " 20"));
- BOOST_CHECK_NO_THROW(CallRPC("listtransactions " + demoAddress.ToString() + " 20 0"));
- BOOST_CHECK_THROW(CallRPC("listtransactions " + demoAddress.ToString() + " not_int"), runtime_error);
-
- /*********************************
- * listlockunspent
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("listlockunspent"));
-
- /*********************************
- * listaccounts
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("listaccounts"));
-
- /*********************************
- * listaddressgroupings
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("listaddressgroupings"));
-
- /*********************************
- * getrawchangeaddress
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("getrawchangeaddress"));
-
- /*********************************
- * getnewaddress
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("getnewaddress"));
- BOOST_CHECK_NO_THROW(CallRPC("getnewaddress getnewaddress_demoaccount"));
-
- /*********************************
- * getaccountaddress
- *********************************/
- BOOST_CHECK_NO_THROW(CallRPC("getaccountaddress \"\""));
- BOOST_CHECK_NO_THROW(CallRPC("getaccountaddress accountThatDoesntExists")); // Should generate a new account
- BOOST_CHECK_NO_THROW(retValue = CallRPC("getaccountaddress " + strAccount));
- BOOST_CHECK(CBitcoinAddress(retValue.get_str()).Get() == demoAddress.Get());
-
- /*********************************
- * getaccount
- *********************************/
- BOOST_CHECK_THROW(CallRPC("getaccount"), runtime_error);
- BOOST_CHECK_NO_THROW(CallRPC("getaccount " + demoAddress.ToString()));
-
- /*********************************
- * signmessage + verifymessage
- *********************************/
- BOOST_CHECK_NO_THROW(retValue = CallRPC("signmessage " + demoAddress.ToString() + " mymessage"));
- BOOST_CHECK_THROW(CallRPC("signmessage"), runtime_error);
- /* Should throw error because this address is not loaded in the wallet */
- BOOST_CHECK_THROW(CallRPC("signmessage 1QFqqMUD55ZV3PJEJZtaKCsQmjLT6JkjvJ mymessage"), runtime_error);
-
- /* missing arguments */
- BOOST_CHECK_THROW(CallRPC("verifymessage " + demoAddress.ToString()), runtime_error);
- BOOST_CHECK_THROW(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str()), runtime_error);
- /* Illegal address */
- BOOST_CHECK_THROW(CallRPC("verifymessage 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X " + retValue.get_str() + " mymessage"), runtime_error);
- /* wrong address */
- BOOST_CHECK(CallRPC("verifymessage 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ " + retValue.get_str() + " mymessage").get_bool() == false);
- /* Correct address and signature but wrong message */
- BOOST_CHECK(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str() + " wrongmessage").get_bool() == false);
- /* Correct address, message and signature*/
- BOOST_CHECK(CallRPC("verifymessage " + demoAddress.ToString() + " " + retValue.get_str() + " mymessage").get_bool() == true);
-
- /*********************************
- * getaddressesbyaccount
- *********************************/
- BOOST_CHECK_THROW(CallRPC("getaddressesbyaccount"), runtime_error);
- BOOST_CHECK_NO_THROW(retValue = CallRPC("getaddressesbyaccount " + strAccount));
- 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/sanity_tests.cpp b/src/test/sanity_tests.cpp
index f5f7f381d3..51f9e9f39f 100644
--- a/src/test/sanity_tests.cpp
+++ b/src/test/sanity_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
diff --git a/src/test/scheduler_tests.cpp b/src/test/scheduler_tests.cpp
index fc07aa72c1..aa12dfbd54 100644
--- a/src/test/scheduler_tests.cpp
+++ b/src/test/scheduler_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
@@ -40,7 +40,6 @@ static void MicroSleep(uint64_t n)
#endif
}
-#if 0 /* Disabled for now because there is a race condition issue in this test - see #6540 */
BOOST_AUTO_TEST_CASE(manythreads)
{
seed_insecure_rand(false);
@@ -116,6 +115,5 @@ BOOST_AUTO_TEST_CASE(manythreads)
}
BOOST_CHECK_EQUAL(counterSum, 200);
}
-#endif
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp
index e36aca8dfa..1a01593a8e 100644
--- a/src/test/script_P2SH_tests.cpp
+++ b/src/test/script_P2SH_tests.cpp
@@ -1,7 +1,8 @@
-// Copyright (c) 2012-2013 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.
+#include "core_io.h"
#include "key.h"
#include "keystore.h"
#include "main.h"
@@ -9,12 +10,9 @@
#include "script/script.h"
#include "script/script_error.h"
#include "script/sign.h"
+#include "script/ismine.h"
#include "test/test_bitcoin.h"
-#ifdef ENABLE_WALLET
-#include "wallet/wallet_ismine.h"
-#endif
-
#include <vector>
#include <boost/test/unit_test.hpp>
@@ -45,7 +43,7 @@ Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict, Scri
txTo.vin[0].scriptSig = scriptSig;
txTo.vout[0].nValue = 1;
- return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, MutableTransactionSignatureChecker(&txTo, 0), &err);
+ return VerifyScript(scriptSig, scriptPubKey, NULL, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, MutableTransactionSignatureChecker(&txTo, 0, txFrom.vout[0].nValue), &err);
}
@@ -101,28 +99,28 @@ BOOST_AUTO_TEST_CASE(sign)
txTo[i].vin[0].prevout.n = i;
txTo[i].vin[0].prevout.hash = txFrom.GetHash();
txTo[i].vout[0].nValue = 1;
-#ifdef ENABLE_WALLET
BOOST_CHECK_MESSAGE(IsMine(keystore, txFrom.vout[i].scriptPubKey), strprintf("IsMine %d", i));
-#endif
}
for (int i = 0; i < 8; i++)
{
- BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i));
+ BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
}
// All of the above should be OK, and the txTos have valid signatures
// Check to make sure signature verification fails if we use the wrong ScriptSig:
- for (int i = 0; i < 8; i++)
+ for (int i = 0; i < 8; i++) {
+ PrecomputedTransactionData txdata(txTo[i]);
for (int j = 0; j < 8; j++)
{
CScript sigSave = txTo[i].vin[0].scriptSig;
txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig;
- bool sigOK = CScriptCheck(CCoins(txFrom, 0), txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false)();
+ bool sigOK = CScriptCheck(CCoins(txFrom, 0), txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &txdata)();
if (i == j)
BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j));
else
BOOST_CHECK_MESSAGE(!sigOK, strprintf("VerifySignature %d %d", i, j));
txTo[i].vin[0].scriptSig = sigSave;
}
+ }
}
BOOST_AUTO_TEST_CASE(norecurse)
@@ -198,13 +196,11 @@ BOOST_AUTO_TEST_CASE(set)
txTo[i].vin[0].prevout.hash = txFrom.GetHash();
txTo[i].vout[0].nValue = 1*CENT;
txTo[i].vout[0].scriptPubKey = inner[i];
-#ifdef ENABLE_WALLET
BOOST_CHECK_MESSAGE(IsMine(keystore, txFrom.vout[i].scriptPubKey), strprintf("IsMine %d", i));
-#endif
}
for (int i = 0; i < 4; i++)
{
- BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i));
+ BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0, SIGHASH_ALL), strprintf("SignSignature %d", i));
BOOST_CHECK_MESSAGE(IsStandardTx(txTo[i], reason), strprintf("txTo[%d].IsStandard", i));
}
}
@@ -333,9 +329,9 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
txTo.vin[i].prevout.n = i;
txTo.vin[i].prevout.hash = txFrom.GetHash();
}
- BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 0));
- BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 1));
- BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 2));
+ BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL));
+ BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 1, SIGHASH_ALL));
+ BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 2, SIGHASH_ALL));
// SignSignature doesn't know how to sign these. We're
// not testing validating signatures, so just create
// dummy signatures that DO include the correct P2SH scripts:
@@ -346,15 +342,6 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
// 22 P2SH sigops for all inputs (1 for vin[0], 6 for vin[3], 15 for vin[4]
BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txTo, coins), 22U);
- // Make sure adding crap to the scriptSigs makes them non-standard:
- for (int i = 0; i < 3; i++)
- {
- CScript t = txTo.vin[i].scriptSig;
- txTo.vin[i].scriptSig = (CScript() << 11) + t;
- BOOST_CHECK(!::AreInputsStandard(txTo, coins));
- txTo.vin[i].scriptSig = t;
- }
-
CMutableTransaction txToNonStd1;
txToNonStd1.vout.resize(1);
txToNonStd1.vout[0].scriptPubKey = GetScriptForDestination(key[1].GetPubKey().GetID());
diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp
index 0059e4a998..561adb8ea2 100644
--- a/src/test/script_tests.cpp
+++ b/src/test/script_tests.cpp
@@ -1,9 +1,8 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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 "data/script_invalid.json.h"
-#include "data/script_valid.json.h"
+#include "data/script_tests.json.h"
#include "core_io.h"
#include "key.h"
@@ -14,6 +13,7 @@
#include "util.h"
#include "utilstrencodings.h"
#include "test/test_bitcoin.h"
+#include "rpc/server.h"
#if defined(HAVE_CONSENSUS_LIB)
#include "script/bitcoinconsensus.h"
@@ -52,9 +52,77 @@ read_json(const std::string& jsondata)
return v.get_array();
}
+struct ScriptErrorDesc
+{
+ ScriptError_t err;
+ const char *name;
+};
+
+static ScriptErrorDesc script_errors[]={
+ {SCRIPT_ERR_OK, "OK"},
+ {SCRIPT_ERR_UNKNOWN_ERROR, "UNKNOWN_ERROR"},
+ {SCRIPT_ERR_EVAL_FALSE, "EVAL_FALSE"},
+ {SCRIPT_ERR_OP_RETURN, "OP_RETURN"},
+ {SCRIPT_ERR_SCRIPT_SIZE, "SCRIPT_SIZE"},
+ {SCRIPT_ERR_PUSH_SIZE, "PUSH_SIZE"},
+ {SCRIPT_ERR_OP_COUNT, "OP_COUNT"},
+ {SCRIPT_ERR_STACK_SIZE, "STACK_SIZE"},
+ {SCRIPT_ERR_SIG_COUNT, "SIG_COUNT"},
+ {SCRIPT_ERR_PUBKEY_COUNT, "PUBKEY_COUNT"},
+ {SCRIPT_ERR_VERIFY, "VERIFY"},
+ {SCRIPT_ERR_EQUALVERIFY, "EQUALVERIFY"},
+ {SCRIPT_ERR_CHECKMULTISIGVERIFY, "CHECKMULTISIGVERIFY"},
+ {SCRIPT_ERR_CHECKSIGVERIFY, "CHECKSIGVERIFY"},
+ {SCRIPT_ERR_NUMEQUALVERIFY, "NUMEQUALVERIFY"},
+ {SCRIPT_ERR_BAD_OPCODE, "BAD_OPCODE"},
+ {SCRIPT_ERR_DISABLED_OPCODE, "DISABLED_OPCODE"},
+ {SCRIPT_ERR_INVALID_STACK_OPERATION, "INVALID_STACK_OPERATION"},
+ {SCRIPT_ERR_INVALID_ALTSTACK_OPERATION, "INVALID_ALTSTACK_OPERATION"},
+ {SCRIPT_ERR_UNBALANCED_CONDITIONAL, "UNBALANCED_CONDITIONAL"},
+ {SCRIPT_ERR_NEGATIVE_LOCKTIME, "NEGATIVE_LOCKTIME"},
+ {SCRIPT_ERR_UNSATISFIED_LOCKTIME, "UNSATISFIED_LOCKTIME"},
+ {SCRIPT_ERR_SIG_HASHTYPE, "SIG_HASHTYPE"},
+ {SCRIPT_ERR_SIG_DER, "SIG_DER"},
+ {SCRIPT_ERR_MINIMALDATA, "MINIMALDATA"},
+ {SCRIPT_ERR_SIG_PUSHONLY, "SIG_PUSHONLY"},
+ {SCRIPT_ERR_SIG_HIGH_S, "SIG_HIGH_S"},
+ {SCRIPT_ERR_SIG_NULLDUMMY, "SIG_NULLDUMMY"},
+ {SCRIPT_ERR_PUBKEYTYPE, "PUBKEYTYPE"},
+ {SCRIPT_ERR_CLEANSTACK, "CLEANSTACK"},
+ {SCRIPT_ERR_MINIMALIF, "MINIMALIF"},
+ {SCRIPT_ERR_SIG_NULLFAIL, "NULLFAIL"},
+ {SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS, "DISCOURAGE_UPGRADABLE_NOPS"},
+ {SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM, "DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"},
+ {SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH, "WITNESS_PROGRAM_WRONG_LENGTH"},
+ {SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY, "WITNESS_PROGRAM_WITNESS_EMPTY"},
+ {SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH, "WITNESS_PROGRAM_MISMATCH"},
+ {SCRIPT_ERR_WITNESS_MALLEATED, "WITNESS_MALLEATED"},
+ {SCRIPT_ERR_WITNESS_MALLEATED_P2SH, "WITNESS_MALLEATED_P2SH"},
+ {SCRIPT_ERR_WITNESS_UNEXPECTED, "WITNESS_UNEXPECTED"},
+ {SCRIPT_ERR_WITNESS_PUBKEYTYPE, "WITNESS_PUBKEYTYPE"},
+};
+
+const char *FormatScriptError(ScriptError_t err)
+{
+ for (unsigned int i=0; i<ARRAYLEN(script_errors); ++i)
+ if (script_errors[i].err == err)
+ return script_errors[i].name;
+ BOOST_ERROR("Unknown scripterror enumeration value, update script_errors in script_tests.cpp.");
+ return "";
+}
+
+ScriptError_t ParseScriptError(const std::string &name)
+{
+ for (unsigned int i=0; i<ARRAYLEN(script_errors); ++i)
+ if (script_errors[i].name == name)
+ return script_errors[i].err;
+ BOOST_ERROR("Unknown scripterror \"" << name << "\" in test description");
+ return SCRIPT_ERR_UNKNOWN_ERROR;
+}
+
BOOST_FIXTURE_TEST_SUITE(script_tests, BasicTestingSetup)
-CMutableTransaction BuildCreditingTransaction(const CScript& scriptPubKey)
+CMutableTransaction BuildCreditingTransaction(const CScript& scriptPubKey, int nValue = 0)
{
CMutableTransaction txCredit;
txCredit.nVersion = 1;
@@ -63,41 +131,54 @@ CMutableTransaction BuildCreditingTransaction(const CScript& scriptPubKey)
txCredit.vout.resize(1);
txCredit.vin[0].prevout.SetNull();
txCredit.vin[0].scriptSig = CScript() << CScriptNum(0) << CScriptNum(0);
- txCredit.vin[0].nSequence = std::numeric_limits<unsigned int>::max();
+ txCredit.vin[0].nSequence = CTxIn::SEQUENCE_FINAL;
txCredit.vout[0].scriptPubKey = scriptPubKey;
- txCredit.vout[0].nValue = 0;
+ txCredit.vout[0].nValue = nValue;
return txCredit;
}
-CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CMutableTransaction& txCredit)
+CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CScriptWitness& scriptWitness, const CMutableTransaction& txCredit)
{
CMutableTransaction txSpend;
txSpend.nVersion = 1;
txSpend.nLockTime = 0;
txSpend.vin.resize(1);
txSpend.vout.resize(1);
+ txSpend.wit.vtxinwit.resize(1);
+ txSpend.wit.vtxinwit[0].scriptWitness = scriptWitness;
txSpend.vin[0].prevout.hash = txCredit.GetHash();
txSpend.vin[0].prevout.n = 0;
txSpend.vin[0].scriptSig = scriptSig;
- txSpend.vin[0].nSequence = std::numeric_limits<unsigned int>::max();
+ txSpend.vin[0].nSequence = CTxIn::SEQUENCE_FINAL;
txSpend.vout[0].scriptPubKey = CScript();
- txSpend.vout[0].nValue = 0;
+ txSpend.vout[0].nValue = txCredit.vout[0].nValue;
return txSpend;
}
-void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, bool expect, const std::string& message)
+void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScriptWitness& scriptWitness, int flags, const std::string& message, int scriptError, CAmount nValue = 0)
{
+ bool expect = (scriptError == SCRIPT_ERR_OK);
+ if (flags & SCRIPT_VERIFY_CLEANSTACK) {
+ flags |= SCRIPT_VERIFY_P2SH;
+ flags |= SCRIPT_VERIFY_WITNESS;
+ }
ScriptError err;
- CMutableTransaction tx = BuildSpendingTransaction(scriptSig, BuildCreditingTransaction(scriptPubKey));
+ CMutableTransaction txCredit = BuildCreditingTransaction(scriptPubKey, nValue);
+ CMutableTransaction tx = BuildSpendingTransaction(scriptSig, scriptWitness, txCredit);
CMutableTransaction tx2 = tx;
- BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0), &err) == expect, message);
- BOOST_CHECK_MESSAGE(expect == (err == SCRIPT_ERR_OK), std::string(ScriptErrorString(err)) + ": " + message);
+ BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, &scriptWitness, flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue), &err) == expect, message);
+ BOOST_CHECK_MESSAGE(err == scriptError, std::string(FormatScriptError(err)) + " where " + std::string(FormatScriptError((ScriptError_t)scriptError)) + " expected: " + message);
#if defined(HAVE_CONSENSUS_LIB)
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
stream << tx2;
- BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script(begin_ptr(scriptPubKey), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), 0, flags, NULL) == expect,message);
+ if (flags & bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS) {
+ BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script_with_amount(begin_ptr(scriptPubKey), scriptPubKey.size(), txCredit.vout[0].nValue, (const unsigned char*)&stream[0], stream.size(), 0, flags, NULL) == expect, message);
+ } else {
+ BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script_with_amount(begin_ptr(scriptPubKey), scriptPubKey.size(), 0, (const unsigned char*)&stream[0], stream.size(), 0, flags, NULL) == expect, message);
+ BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script(begin_ptr(scriptPubKey), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), 0, flags, NULL) == expect,message);
+ }
#endif
}
@@ -176,17 +257,30 @@ struct KeyData
}
};
+enum WitnessMode {
+ WITNESS_NONE,
+ WITNESS_PKH,
+ WITNESS_SH
+};
class TestBuilder
{
private:
- CScript scriptPubKey;
+ //! Actually executed script
+ CScript script;
+ //! The P2SH redeemscript
+ CScript redeemscript;
+ //! The Witness embedded script
+ CScript witscript;
+ CScriptWitness scriptWitness;
CTransaction creditTx;
CMutableTransaction spendTx;
bool havePush;
std::vector<unsigned char> push;
std::string comment;
int flags;
+ int scriptError;
+ CAmount nValue;
void DoPush()
{
@@ -204,20 +298,38 @@ private:
}
public:
- TestBuilder(const CScript& redeemScript, const std::string& comment_, int flags_, bool P2SH = false) : scriptPubKey(redeemScript), havePush(false), comment(comment_), flags(flags_)
+ TestBuilder(const CScript& script_, const std::string& comment_, int flags_, bool P2SH = false, WitnessMode wm = WITNESS_NONE, int witnessversion = 0, CAmount nValue_ = 0) : script(script_), havePush(false), comment(comment_), flags(flags_), scriptError(SCRIPT_ERR_OK), nValue(nValue_)
{
+ CScript scriptPubKey = script;
+ if (wm == WITNESS_PKH) {
+ uint160 hash;
+ CHash160().Write(&script[1], script.size() - 1).Finalize(hash.begin());
+ script = CScript() << OP_DUP << OP_HASH160 << ToByteVector(hash) << OP_EQUALVERIFY << OP_CHECKSIG;
+ scriptPubKey = CScript() << witnessversion << ToByteVector(hash);
+ } else if (wm == WITNESS_SH) {
+ witscript = scriptPubKey;
+ uint256 hash;
+ CSHA256().Write(&witscript[0], witscript.size()).Finalize(hash.begin());
+ scriptPubKey = CScript() << witnessversion << ToByteVector(hash);
+ }
if (P2SH) {
- creditTx = BuildCreditingTransaction(CScript() << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL);
- } else {
- creditTx = BuildCreditingTransaction(redeemScript);
+ redeemscript = scriptPubKey;
+ scriptPubKey = CScript() << OP_HASH160 << ToByteVector(CScriptID(redeemscript)) << OP_EQUAL;
}
- spendTx = BuildSpendingTransaction(CScript(), creditTx);
+ creditTx = BuildCreditingTransaction(scriptPubKey, nValue);
+ spendTx = BuildSpendingTransaction(CScript(), CScriptWitness(), creditTx);
}
- TestBuilder& Add(const CScript& script)
+ TestBuilder& ScriptError(ScriptError_t err)
+ {
+ scriptError = err;
+ return *this;
+ }
+
+ TestBuilder& Add(const CScript& _script)
{
DoPush();
- spendTx.vin[0].scriptSig += script;
+ spendTx.vin[0].scriptSig += _script;
return *this;
}
@@ -234,9 +346,14 @@ public:
return *this;
}
- TestBuilder& PushSig(const CKey& key, int nHashType = SIGHASH_ALL, unsigned int lenR = 32, unsigned int lenS = 32)
+ TestBuilder& Push(const CScript& _script) {
+ DoPush(std::vector<unsigned char>(_script.begin(), _script.end()));
+ return *this;
+ }
+
+ TestBuilder& PushSig(const CKey& key, int nHashType = SIGHASH_ALL, unsigned int lenR = 32, unsigned int lenS = 32, SigVersion sigversion = SIGVERSION_BASE, CAmount amount = 0)
{
- uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType);
+ uint256 hash = SignatureHash(script, spendTx, 0, nHashType, amount, sigversion);
std::vector<unsigned char> vchSig, r, s;
uint32_t iter = 0;
do {
@@ -252,6 +369,13 @@ public:
return *this;
}
+ TestBuilder& PushWitSig(const CKey& key, CAmount amount = -1, int nHashType = SIGHASH_ALL, unsigned int lenR = 32, unsigned int lenS = 32, SigVersion sigversion = SIGVERSION_WITNESS_V0)
+ {
+ if (amount == -1)
+ amount = nValue;
+ return PushSig(key, nHashType, lenR, lenS, sigversion, amount).AsWit();
+ }
+
TestBuilder& Push(const CPubKey& pubkey)
{
DoPush(std::vector<unsigned char>(pubkey.begin(), pubkey.end()));
@@ -260,10 +384,16 @@ public:
TestBuilder& PushRedeem()
{
- DoPush(std::vector<unsigned char>(scriptPubKey.begin(), scriptPubKey.end()));
+ DoPush(std::vector<unsigned char>(redeemscript.begin(), redeemscript.end()));
return *this;
}
+ TestBuilder& PushWitRedeem()
+ {
+ DoPush(std::vector<unsigned char>(witscript.begin(), witscript.end()));
+ return AsWit();
+ }
+
TestBuilder& EditPush(unsigned int pos, const std::string& hexin, const std::string& hexout)
{
assert(havePush);
@@ -284,22 +414,39 @@ public:
return *this;
}
- TestBuilder& Test(bool expect)
+ TestBuilder& Test()
{
TestBuilder copy = *this; // Make a copy so we can rollback the push.
DoPush();
- DoTest(creditTx.vout[0].scriptPubKey, spendTx.vin[0].scriptSig, flags, expect, comment);
+ DoTest(creditTx.vout[0].scriptPubKey, spendTx.vin[0].scriptSig, scriptWitness, flags, comment, scriptError, nValue);
*this = copy;
return *this;
}
+ TestBuilder& AsWit()
+ {
+ assert(havePush);
+ scriptWitness.stack.push_back(push);
+ havePush = false;
+ return *this;
+ }
+
UniValue GetJSON()
{
DoPush();
UniValue array(UniValue::VARR);
+ if (!scriptWitness.stack.empty()) {
+ UniValue wit(UniValue::VARR);
+ for (unsigned i = 0; i < scriptWitness.stack.size(); i++) {
+ wit.push_back(HexStr(scriptWitness.stack[i]));
+ }
+ wit.push_back(ValueFromAmount(nValue));
+ array.push_back(wit);
+ }
array.push_back(FormatScript(spendTx.vin[0].scriptSig));
array.push_back(FormatScript(creditTx.vout[0].scriptPubKey));
array.push_back(FormatScriptFlags(flags));
+ array.push_back(FormatScriptError((ScriptError_t)scriptError));
array.push_back(comment);
return array;
}
@@ -314,370 +461,535 @@ public:
return creditTx.vout[0].scriptPubKey;
}
};
+
+std::string JSONPrettyPrint(const UniValue& univalue)
+{
+ std::string ret = univalue.write(4);
+ // Workaround for libunivalue pretty printer, which puts a space between comma's and newlines
+ size_t pos = 0;
+ while ((pos = ret.find(" \n", pos)) != std::string::npos) {
+ ret.replace(pos, 2, "\n");
+ pos++;
+ }
+ return ret;
+}
}
BOOST_AUTO_TEST_CASE(script_build)
{
const KeyData keys;
- std::vector<TestBuilder> good;
- std::vector<TestBuilder> bad;
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
- "P2PK", 0
- ).PushSig(keys.key0));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
- "P2PK, bad sig", 0
- ).PushSig(keys.key0).DamagePush(10));
-
- good.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey1C.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
- "P2PKH", 0
- ).PushSig(keys.key1).Push(keys.pubkey1C));
- bad.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey2C.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
- "P2PKH, bad pubkey", 0
- ).PushSig(keys.key2).Push(keys.pubkey2C).DamagePush(5));
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
- "P2PK anyonecanpay", 0
- ).PushSig(keys.key1, SIGHASH_ALL | SIGHASH_ANYONECANPAY));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
- "P2PK anyonecanpay marked with normal hashtype", 0
- ).PushSig(keys.key1, SIGHASH_ALL | SIGHASH_ANYONECANPAY).EditPush(70, "81", "01"));
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG,
- "P2SH(P2PK)", SCRIPT_VERIFY_P2SH, true
- ).PushSig(keys.key0).PushRedeem());
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG,
- "P2SH(P2PK), bad redeemscript", SCRIPT_VERIFY_P2SH, true
- ).PushSig(keys.key0).PushRedeem().DamagePush(10));
-
- good.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey1.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
- "P2SH(P2PKH), bad sig but no VERIFY_P2SH", 0, true
- ).PushSig(keys.key0).DamagePush(10).PushRedeem());
- bad.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey1.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
- "P2SH(P2PKH), bad sig", SCRIPT_VERIFY_P2SH, true
- ).PushSig(keys.key0).DamagePush(10).PushRedeem());
-
- good.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
- "3-of-3", 0
- ).Num(0).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
- bad.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
- "3-of-3, 2 sigs", 0
- ).Num(0).PushSig(keys.key0).PushSig(keys.key1).Num(0));
-
- good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
- "P2SH(2-of-3)", SCRIPT_VERIFY_P2SH, true
- ).Num(0).PushSig(keys.key1).PushSig(keys.key2).PushRedeem());
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
- "P2SH(2-of-3), 1 sig", SCRIPT_VERIFY_P2SH, true
- ).Num(0).PushSig(keys.key1).Num(0).PushRedeem());
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "P2PK with too much R padding but no DERSIG", 0
- ).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "P2PK with too much R padding", SCRIPT_VERIFY_DERSIG
- ).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "P2PK with too much S padding but no DERSIG", 0
- ).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "P2PK with too much S padding", SCRIPT_VERIFY_DERSIG
- ).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100"));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "P2PK with too little R padding but no DERSIG", 0
- ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "P2PK with too little R padding", SCRIPT_VERIFY_DERSIG
- ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with bad sig with too much R padding but no DERSIG", 0
- ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with bad sig with too much R padding", SCRIPT_VERIFY_DERSIG
- ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with too much R padding but no DERSIG", 0
- ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with too much R padding", SCRIPT_VERIFY_DERSIG
- ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "BIP66 example 1, without DERSIG", 0
- ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "BIP66 example 1, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
- "BIP66 example 2, without DERSIG", 0
- ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
- "BIP66 example 2, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "BIP66 example 3, without DERSIG", 0
- ).Num(0));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "BIP66 example 3, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(0));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
- "BIP66 example 4, without DERSIG", 0
- ).Num(0));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
- "BIP66 example 4, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(0));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "BIP66 example 5, without DERSIG", 0
- ).Num(1));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
- "BIP66 example 5, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(1));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
- "BIP66 example 6, without DERSIG", 0
- ).Num(1));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
- "BIP66 example 6, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(1));
- good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
- "BIP66 example 7, without DERSIG", 0
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
- "BIP66 example 7, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
- "BIP66 example 8, without DERSIG", 0
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
- "BIP66 example 8, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
- "BIP66 example 9, without DERSIG", 0
- ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
- "BIP66 example 9, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
- "BIP66 example 10, without DERSIG", 0
- ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
- "BIP66 example 10, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
- "BIP66 example 11, without DERSIG", 0
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
- "BIP66 example 11, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
- good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
- "BIP66 example 12, without DERSIG", 0
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
- good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
- "BIP66 example 12, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
- "P2PK with multi-byte hashtype, without DERSIG", 0
- ).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101"));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
- "P2PK with multi-byte hashtype, with DERSIG", SCRIPT_VERIFY_DERSIG
- ).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101"));
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
- "P2PK with high S but no LOW_S", 0
- ).PushSig(keys.key2, SIGHASH_ALL, 32, 33));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
- "P2PK with high S", SCRIPT_VERIFY_LOW_S
- ).PushSig(keys.key2, SIGHASH_ALL, 32, 33));
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG,
- "P2PK with hybrid pubkey but no STRICTENC", 0
- ).PushSig(keys.key0, SIGHASH_ALL));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG,
- "P2PK with hybrid pubkey", SCRIPT_VERIFY_STRICTENC
- ).PushSig(keys.key0, SIGHASH_ALL));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with hybrid pubkey but no STRICTENC", 0
- ).PushSig(keys.key0, SIGHASH_ALL));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with hybrid pubkey", SCRIPT_VERIFY_STRICTENC
- ).PushSig(keys.key0, SIGHASH_ALL));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with invalid hybrid pubkey but no STRICTENC", 0
- ).PushSig(keys.key0, SIGHASH_ALL).DamagePush(10));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with invalid hybrid pubkey", SCRIPT_VERIFY_STRICTENC
- ).PushSig(keys.key0, SIGHASH_ALL).DamagePush(10));
- good.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
- "1-of-2 with the second 1 hybrid pubkey and no STRICTENC", 0
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL));
- good.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
- "1-of-2 with the second 1 hybrid pubkey", SCRIPT_VERIFY_STRICTENC
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL));
- bad.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0H) << OP_2 << OP_CHECKMULTISIG,
- "1-of-2 with the first 1 hybrid pubkey", SCRIPT_VERIFY_STRICTENC
- ).Num(0).PushSig(keys.key1, SIGHASH_ALL));
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
- "P2PK with undefined hashtype but no STRICTENC", 0
- ).PushSig(keys.key1, 5));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
- "P2PK with undefined hashtype", SCRIPT_VERIFY_STRICTENC
- ).PushSig(keys.key1, 5));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with invalid sig and undefined hashtype but no STRICTENC", 0
- ).PushSig(keys.key1, 5).DamagePush(10));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG << OP_NOT,
- "P2PK NOT with invalid sig and undefined hashtype", SCRIPT_VERIFY_STRICTENC
- ).PushSig(keys.key1, 5).DamagePush(10));
-
- good.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
- "3-of-3 with nonzero dummy but no NULLDUMMY", 0
- ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
- bad.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
- "3-of-3 with nonzero dummy", SCRIPT_VERIFY_NULLDUMMY
- ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
- good.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG << OP_NOT,
- "3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY", 0
- ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).DamagePush(10));
- bad.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG << OP_NOT,
- "3-of-3 NOT with invalid sig with nonzero dummy", SCRIPT_VERIFY_NULLDUMMY
- ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).DamagePush(10));
-
- good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
- "2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY", 0
- ).Num(0).PushSig(keys.key1).Add(CScript() << OP_DUP));
- bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
- "2-of-2 with two identical keys and sigs pushed using OP_DUP", SCRIPT_VERIFY_SIGPUSHONLY
- ).Num(0).PushSig(keys.key1).Add(CScript() << OP_DUP));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
- "P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY", 0
- ).PushSig(keys.key2).PushRedeem());
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
- "P2SH(P2PK) with non-push scriptSig", SCRIPT_VERIFY_SIGPUSHONLY
- ).PushSig(keys.key2).PushRedeem());
- good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
- "2-of-2 with two identical keys and sigs pushed", SCRIPT_VERIFY_SIGPUSHONLY
- ).Num(0).PushSig(keys.key1).PushSig(keys.key1));
-
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
- "P2PK with unnecessary input but no CLEANSTACK", SCRIPT_VERIFY_P2SH
- ).Num(11).PushSig(keys.key0));
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
- "P2PK with unnecessary input", SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH
- ).Num(11).PushSig(keys.key0));
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
- "P2SH with unnecessary input but no CLEANSTACK", SCRIPT_VERIFY_P2SH, true
- ).Num(11).PushSig(keys.key0).PushRedeem());
- bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
- "P2SH with unnecessary input", SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH, true
- ).Num(11).PushSig(keys.key0).PushRedeem());
- good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
- "P2SH with CLEANSTACK", SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH, true
- ).PushSig(keys.key0).PushRedeem());
-
-
- std::set<std::string> tests_good;
- std::set<std::string> tests_bad;
+ std::vector<TestBuilder> tests;
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2PK", 0
+ ).PushSig(keys.key0));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2PK, bad sig", 0
+ ).PushSig(keys.key0).DamagePush(10).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+
+ tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey1C.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
+ "P2PKH", 0
+ ).PushSig(keys.key1).Push(keys.pubkey1C));
+ tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey2C.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
+ "P2PKH, bad pubkey", 0
+ ).PushSig(keys.key2).Push(keys.pubkey2C).DamagePush(5).ScriptError(SCRIPT_ERR_EQUALVERIFY));
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
+ "P2PK anyonecanpay", 0
+ ).PushSig(keys.key1, SIGHASH_ALL | SIGHASH_ANYONECANPAY));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
+ "P2PK anyonecanpay marked with normal hashtype", 0
+ ).PushSig(keys.key1, SIGHASH_ALL | SIGHASH_ANYONECANPAY).EditPush(70, "81", "01").ScriptError(SCRIPT_ERR_EVAL_FALSE));
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG,
+ "P2SH(P2PK)", SCRIPT_VERIFY_P2SH, true
+ ).PushSig(keys.key0).PushRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG,
+ "P2SH(P2PK), bad redeemscript", SCRIPT_VERIFY_P2SH, true
+ ).PushSig(keys.key0).PushRedeem().DamagePush(10).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+
+ tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey0.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
+ "P2SH(P2PKH)", SCRIPT_VERIFY_P2SH, true
+ ).PushSig(keys.key0).Push(keys.pubkey0).PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey1.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
+ "P2SH(P2PKH), bad sig but no VERIFY_P2SH", 0, true
+ ).PushSig(keys.key0).DamagePush(10).PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 << ToByteVector(keys.pubkey1.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG,
+ "P2SH(P2PKH), bad sig", SCRIPT_VERIFY_P2SH, true
+ ).PushSig(keys.key0).DamagePush(10).PushRedeem().ScriptError(SCRIPT_ERR_EQUALVERIFY));
+
+ tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
+ "3-of-3", 0
+ ).Num(0).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
+ tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
+ "3-of-3, 2 sigs", 0
+ ).Num(0).PushSig(keys.key0).PushSig(keys.key1).Num(0).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
+ "P2SH(2-of-3)", SCRIPT_VERIFY_P2SH, true
+ ).Num(0).PushSig(keys.key1).PushSig(keys.key2).PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
+ "P2SH(2-of-3), 1 sig", SCRIPT_VERIFY_P2SH, true
+ ).Num(0).PushSig(keys.key1).Num(0).PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "P2PK with too much R padding but no DERSIG", 0
+ ).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "P2PK with too much R padding", SCRIPT_VERIFY_DERSIG
+ ).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "P2PK with too much S padding but no DERSIG", 0
+ ).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100"));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "P2PK with too much S padding", SCRIPT_VERIFY_DERSIG
+ ).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100").ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "P2PK with too little R padding but no DERSIG", 0
+ ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "P2PK with too little R padding", SCRIPT_VERIFY_DERSIG
+ ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with bad sig with too much R padding but no DERSIG", 0
+ ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with bad sig with too much R padding", SCRIPT_VERIFY_DERSIG
+ ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10).ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with too much R padding but no DERSIG", 0
+ ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with too much R padding", SCRIPT_VERIFY_DERSIG
+ ).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").ScriptError(SCRIPT_ERR_SIG_DER));
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "BIP66 example 1, without DERSIG", 0
+ ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "BIP66 example 1, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
+ "BIP66 example 2, without DERSIG", 0
+ ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
+ "BIP66 example 2, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "BIP66 example 3, without DERSIG", 0
+ ).Num(0).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "BIP66 example 3, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(0).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
+ "BIP66 example 4, without DERSIG", 0
+ ).Num(0));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
+ "BIP66 example 4, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(0));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "BIP66 example 5, without DERSIG", 0
+ ).Num(1).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
+ "BIP66 example 5, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(1).ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
+ "BIP66 example 6, without DERSIG", 0
+ ).Num(1));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
+ "BIP66 example 6, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(1).ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
+ "BIP66 example 7, without DERSIG", 0
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
+ "BIP66 example 7, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2).ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
+ "BIP66 example 8, without DERSIG", 0
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
+ "BIP66 example 8, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2).ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
+ "BIP66 example 9, without DERSIG", 0
+ ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
+ "BIP66 example 9, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
+ "BIP66 example 10, without DERSIG", 0
+ ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
+ "BIP66 example 10, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").ScriptError(SCRIPT_ERR_SIG_DER));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
+ "BIP66 example 11, without DERSIG", 0
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
+ "BIP66 example 11, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
+ "BIP66 example 12, without DERSIG", 0
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
+ "BIP66 example 12, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
+ "P2PK with multi-byte hashtype, without DERSIG", 0
+ ).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101"));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
+ "P2PK with multi-byte hashtype, with DERSIG", SCRIPT_VERIFY_DERSIG
+ ).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101").ScriptError(SCRIPT_ERR_SIG_DER));
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
+ "P2PK with high S but no LOW_S", 0
+ ).PushSig(keys.key2, SIGHASH_ALL, 32, 33));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
+ "P2PK with high S", SCRIPT_VERIFY_LOW_S
+ ).PushSig(keys.key2, SIGHASH_ALL, 32, 33).ScriptError(SCRIPT_ERR_SIG_HIGH_S));
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG,
+ "P2PK with hybrid pubkey but no STRICTENC", 0
+ ).PushSig(keys.key0, SIGHASH_ALL));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG,
+ "P2PK with hybrid pubkey", SCRIPT_VERIFY_STRICTENC
+ ).PushSig(keys.key0, SIGHASH_ALL).ScriptError(SCRIPT_ERR_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with hybrid pubkey but no STRICTENC", 0
+ ).PushSig(keys.key0, SIGHASH_ALL).ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with hybrid pubkey", SCRIPT_VERIFY_STRICTENC
+ ).PushSig(keys.key0, SIGHASH_ALL).ScriptError(SCRIPT_ERR_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with invalid hybrid pubkey but no STRICTENC", 0
+ ).PushSig(keys.key0, SIGHASH_ALL).DamagePush(10));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with invalid hybrid pubkey", SCRIPT_VERIFY_STRICTENC
+ ).PushSig(keys.key0, SIGHASH_ALL).DamagePush(10).ScriptError(SCRIPT_ERR_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
+ "1-of-2 with the second 1 hybrid pubkey and no STRICTENC", 0
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL));
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
+ "1-of-2 with the second 1 hybrid pubkey", SCRIPT_VERIFY_STRICTENC
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL));
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0H) << OP_2 << OP_CHECKMULTISIG,
+ "1-of-2 with the first 1 hybrid pubkey", SCRIPT_VERIFY_STRICTENC
+ ).Num(0).PushSig(keys.key1, SIGHASH_ALL).ScriptError(SCRIPT_ERR_PUBKEYTYPE));
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
+ "P2PK with undefined hashtype but no STRICTENC", 0
+ ).PushSig(keys.key1, 5));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
+ "P2PK with undefined hashtype", SCRIPT_VERIFY_STRICTENC
+ ).PushSig(keys.key1, 5).ScriptError(SCRIPT_ERR_SIG_HASHTYPE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with invalid sig and undefined hashtype but no STRICTENC", 0
+ ).PushSig(keys.key1, 5).DamagePush(10));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG << OP_NOT,
+ "P2PK NOT with invalid sig and undefined hashtype", SCRIPT_VERIFY_STRICTENC
+ ).PushSig(keys.key1, 5).DamagePush(10).ScriptError(SCRIPT_ERR_SIG_HASHTYPE));
+
+ tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
+ "3-of-3 with nonzero dummy but no NULLDUMMY", 0
+ ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2));
+ tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG,
+ "3-of-3 with nonzero dummy", SCRIPT_VERIFY_NULLDUMMY
+ ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).ScriptError(SCRIPT_ERR_SIG_NULLDUMMY));
+ tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG << OP_NOT,
+ "3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY", 0
+ ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).DamagePush(10));
+ tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_3 << OP_CHECKMULTISIG << OP_NOT,
+ "3-of-3 NOT with invalid sig with nonzero dummy", SCRIPT_VERIFY_NULLDUMMY
+ ).Num(1).PushSig(keys.key0).PushSig(keys.key1).PushSig(keys.key2).DamagePush(10).ScriptError(SCRIPT_ERR_SIG_NULLDUMMY));
+
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
+ "2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY", 0
+ ).Num(0).PushSig(keys.key1).Add(CScript() << OP_DUP));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
+ "2-of-2 with two identical keys and sigs pushed using OP_DUP", SCRIPT_VERIFY_SIGPUSHONLY
+ ).Num(0).PushSig(keys.key1).Add(CScript() << OP_DUP).ScriptError(SCRIPT_ERR_SIG_PUSHONLY));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
+ "P2SH(P2PK) with non-push scriptSig but no P2SH or SIGPUSHONLY", 0, true
+ ).PushSig(keys.key2).Add(CScript() << OP_NOP8).PushRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
+ "P2PK with non-push scriptSig but with P2SH validation", 0
+ ).PushSig(keys.key2).Add(CScript() << OP_NOP8));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
+ "P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY", SCRIPT_VERIFY_P2SH, true
+ ).PushSig(keys.key2).Add(CScript() << OP_NOP8).PushRedeem().ScriptError(SCRIPT_ERR_SIG_PUSHONLY));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
+ "P2SH(P2PK) with non-push scriptSig but not P2SH", SCRIPT_VERIFY_SIGPUSHONLY, true
+ ).PushSig(keys.key2).Add(CScript() << OP_NOP8).PushRedeem().ScriptError(SCRIPT_ERR_SIG_PUSHONLY));
+ tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG,
+ "2-of-2 with two identical keys and sigs pushed", SCRIPT_VERIFY_SIGPUSHONLY
+ ).Num(0).PushSig(keys.key1).PushSig(keys.key1));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2PK with unnecessary input but no CLEANSTACK", SCRIPT_VERIFY_P2SH
+ ).Num(11).PushSig(keys.key0));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2PK with unnecessary input", SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH
+ ).Num(11).PushSig(keys.key0).ScriptError(SCRIPT_ERR_CLEANSTACK));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2SH with unnecessary input but no CLEANSTACK", SCRIPT_VERIFY_P2SH, true
+ ).Num(11).PushSig(keys.key0).PushRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2SH with unnecessary input", SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH, true
+ ).Num(11).PushSig(keys.key0).PushRedeem().ScriptError(SCRIPT_ERR_CLEANSTACK));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2SH with CLEANSTACK", SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH, true
+ ).PushSig(keys.key0).PushRedeem());
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "Basic P2WSH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
+ 0, 1).PushWitSig(keys.key0).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "Basic P2WPKH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH,
+ 0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "Basic P2SH(P2WSH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
+ 0, 1).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "Basic P2SH(P2WPKH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_PKH,
+ 0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
+ "Basic P2WSH with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH
+ ).PushWitSig(keys.key0).PushWitRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
+ "Basic P2WPKH with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
+ ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
+ "Basic P2SH(P2WSH) with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH
+ ).PushWitSig(keys.key0).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
+ "Basic P2SH(P2WPKH) with the wrong key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_PKH
+ ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
+ "Basic P2WSH with the wrong key but no WITNESS", SCRIPT_VERIFY_P2SH, false, WITNESS_SH
+ ).PushWitSig(keys.key0).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
+ "Basic P2WPKH with the wrong key but no WITNESS", SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
+ ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG,
+ "Basic P2SH(P2WSH) with the wrong key but no WITNESS", SCRIPT_VERIFY_P2SH, true, WITNESS_SH
+ ).PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
+ "Basic P2SH(P2WPKH) with the wrong key but no WITNESS", SCRIPT_VERIFY_P2SH, true, WITNESS_PKH
+ ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "Basic P2WSH with wrong value", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
+ 0, 0).PushWitSig(keys.key0, 1).PushWitRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "Basic P2WPKH with wrong value", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH,
+ 0, 0).PushWitSig(keys.key0, 1).Push(keys.pubkey0).AsWit().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "Basic P2SH(P2WSH) with wrong value", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
+ 0, 0).PushWitSig(keys.key0, 1).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "Basic P2SH(P2WPKH) with wrong value", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_PKH,
+ 0, 0).PushWitSig(keys.key0, 1).Push(keys.pubkey0).AsWit().PushRedeem().ScriptError(SCRIPT_ERR_EVAL_FALSE));
+
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "P2WPKH with future witness version", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH |
+ SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM, false, WITNESS_PKH, 1
+ ).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().ScriptError(SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM));
+ {
+ CScript witscript = CScript() << ToByteVector(keys.pubkey0);
+ uint256 hash;
+ CSHA256().Write(&witscript[0], witscript.size()).Finalize(hash.begin());
+ vector<unsigned char> hashBytes = ToByteVector(hash);
+ hashBytes.pop_back();
+ tests.push_back(TestBuilder(CScript() << OP_0 << hashBytes,
+ "P2WPKH with wrong witness program length", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false
+ ).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().ScriptError(SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH));
+ }
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2WSH with empty witness", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH
+ ).ScriptError(SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY));
+ {
+ CScript witscript = CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG;
+ tests.push_back(TestBuilder(witscript,
+ "P2WSH with witness program mismatch", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH
+ ).PushWitSig(keys.key0).Push(witscript).DamagePush(0).AsWit().ScriptError(SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH));
+ }
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "P2WPKH with witness program mismatch", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
+ ).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().Push("0").AsWit().ScriptError(SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "P2WPKH with non-empty scriptSig", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_PKH
+ ).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().Num(11).ScriptError(SCRIPT_ERR_WITNESS_MALLEATED));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1),
+ "P2SH(P2WPKH) with superfluous push in scriptSig", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_PKH
+ ).PushWitSig(keys.key0).Push(keys.pubkey1).AsWit().Num(11).PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_MALLEATED_P2SH));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "P2PK with witness", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH
+ ).PushSig(keys.key0).Push("0").AsWit().ScriptError(SCRIPT_ERR_WITNESS_UNEXPECTED));
+
+ // Compressed keys should pass SCRIPT_VERIFY_WITNESS_PUBKEYTYPE
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG,
+ "Basic P2WSH with compressed key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
+ 0, 1).PushWitSig(keys.key0C).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C),
+ "Basic P2WPKH with compressed key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_PKH,
+ 0, 1).PushWitSig(keys.key0C).Push(keys.pubkey0C).AsWit());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG,
+ "Basic P2SH(P2WSH) with compressed key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
+ 0, 1).PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C),
+ "Basic P2SH(P2WPKH) with compressed key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_PKH,
+ 0, 1).PushWitSig(keys.key0C).Push(keys.pubkey0C).AsWit().PushRedeem());
+
+ // Testing uncompressed key in witness with SCRIPT_VERIFY_WITNESS_PUBKEYTYPE
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "Basic P2WSH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
+ 0, 1).PushWitSig(keys.key0).PushWitRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "Basic P2WPKH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_PKH,
+ 0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
+ "Basic P2SH(P2WSH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
+ 0, 1).PushWitSig(keys.key0).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
+ "Basic P2SH(P2WPKH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_PKH,
+ 0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+
+ // P2WSH 1-of-2 multisig with compressed keys
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with compressed keys", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG with compressed keys", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with compressed keys", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG with compressed keys", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem());
+
+ // P2WSH 1-of-2 multisig with first key uncompressed
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG first key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+ // P2WSH 1-of-2 multisig with second key uncompressed
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG second key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem().PushRedeem());
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+ tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
+ "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
+ 0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
+
+ std::set<std::string> tests_set;
{
- 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)));
+ UniValue json_tests = read_json(std::string(json_tests::script_tests, json_tests::script_tests + sizeof(json_tests::script_tests)));
- for (unsigned int idx = 0; idx < json_good.size(); idx++) {
- const UniValue& tv = json_good[idx];
- tests_good.insert(tv.get_array().write());
- }
- for (unsigned int idx = 0; idx < json_bad.size(); idx++) {
- const UniValue& tv = json_bad[idx];
- tests_bad.insert(tv.get_array().write());
+ for (unsigned int idx = 0; idx < json_tests.size(); idx++) {
+ const UniValue& tv = json_tests[idx];
+ tests_set.insert(JSONPrettyPrint(tv.get_array()));
}
}
- std::string strGood;
- std::string strBad;
+ std::string strGen;
- BOOST_FOREACH(TestBuilder& test, good) {
- test.Test(true);
- std::string str = test.GetJSON().write();
+ BOOST_FOREACH(TestBuilder& test, tests) {
+ test.Test();
+ std::string str = JSONPrettyPrint(test.GetJSON());
#ifndef UPDATE_JSON_TESTS
- if (tests_good.count(str) == 0) {
+ if (tests_set.count(str) == 0) {
BOOST_CHECK_MESSAGE(false, "Missing auto script_valid test: " + test.GetComment());
}
#endif
- strGood += str + ",\n";
- }
- BOOST_FOREACH(TestBuilder& test, bad) {
- test.Test(false);
- 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());
- }
-#endif
- strBad += str + ",\n";
+ strGen += str + ",\n";
}
#ifdef UPDATE_JSON_TESTS
- FILE* valid = fopen("script_valid.json.gen", "w");
- fputs(strGood.c_str(), valid);
- fclose(valid);
- FILE* invalid = fopen("script_invalid.json.gen", "w");
- fputs(strBad.c_str(), invalid);
- fclose(invalid);
+ FILE* file = fopen("script_tests.json.gen", "w");
+ fputs(strGen.c_str(), file);
+ fclose(file);
#endif
}
-BOOST_AUTO_TEST_CASE(script_valid)
+BOOST_AUTO_TEST_CASE(script_json_test)
{
- // Read tests from test/data/script_valid.json
+ // Read tests from test/data/script_tests.json
// Format is an array of arrays
- // Inner arrays are [ "scriptSig", "scriptPubKey", "flags" ]
+ // Inner arrays are [ ["wit"..., nValue]?, "scriptSig", "scriptPubKey", "flags", "expected_scripterror" ]
// ... where scriptSig and scriptPubKey are stringified
// scripts.
- UniValue tests = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
+ // If a witness is given, then the last value in the array should be the
+ // amount (nValue) to use in the crediting tx
+ UniValue tests = read_json(std::string(json_tests::script_tests, json_tests::script_tests + sizeof(json_tests::script_tests)));
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) {
- BOOST_ERROR("Bad test: " << strTest);
+ CScriptWitness witness;
+ CAmount nValue = 0;
+ unsigned int pos = 0;
+ if (test.size() > 0 && test[pos].isArray()) {
+ unsigned int i=0;
+ for (i = 0; i < test[pos].size()-1; i++) {
+ witness.stack.push_back(ParseHex(test[pos][i].get_str()));
}
- continue;
+ nValue = AmountFromValue(test[pos][i]);
+ pos++;
}
- string scriptSigString = test[0].get_str();
- CScript scriptSig = ParseScript(scriptSigString);
- string scriptPubKeyString = test[1].get_str();
- CScript scriptPubKey = ParseScript(scriptPubKeyString);
- unsigned int scriptflags = ParseScriptFlags(test[2].get_str());
-
- DoTest(scriptPubKey, scriptSig, scriptflags, true, strTest);
- }
-}
-
-BOOST_AUTO_TEST_CASE(script_invalid)
-{
- // Scripts that should evaluate as invalid
- UniValue tests = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
-
- 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() < 4 + pos) // Allow size > 3; extra stuff ignored (useful for comments)
{
if (test.size() != 1) {
BOOST_ERROR("Bad test: " << strTest);
}
continue;
}
- string scriptSigString = test[0].get_str();
+ string scriptSigString = test[pos++].get_str();
CScript scriptSig = ParseScript(scriptSigString);
- string scriptPubKeyString = test[1].get_str();
+ string scriptPubKeyString = test[pos++].get_str();
CScript scriptPubKey = ParseScript(scriptPubKeyString);
- unsigned int scriptflags = ParseScriptFlags(test[2].get_str());
+ unsigned int scriptflags = ParseScriptFlags(test[pos++].get_str());
+ int scriptError = ParseScriptError(test[pos++].get_str());
- DoTest(scriptPubKey, scriptSig, scriptflags, false, strTest);
+ DoTest(scriptPubKey, scriptSig, witness, scriptflags, strTest, scriptError, nValue);
}
}
@@ -692,21 +1004,21 @@ BOOST_AUTO_TEST_CASE(script_PushData)
ScriptError err;
vector<vector<unsigned char> > directStack;
- BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), &err));
+ BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
vector<vector<unsigned char> > pushdata1Stack;
- BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), &err));
+ BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err));
BOOST_CHECK(pushdata1Stack == directStack);
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
vector<vector<unsigned char> > pushdata2Stack;
- BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), &err));
+ BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err));
BOOST_CHECK(pushdata2Stack == directStack);
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
vector<vector<unsigned char> > pushdata4Stack;
- BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), &err));
+ BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), SCRIPT_VERIFY_P2SH, BaseSignatureChecker(), SIGVERSION_BASE, &err));
BOOST_CHECK(pushdata4Stack == directStack);
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
}
@@ -714,7 +1026,7 @@ BOOST_AUTO_TEST_CASE(script_PushData)
CScript
sign_multisig(CScript scriptPubKey, std::vector<CKey> keys, CTransaction transaction)
{
- uint256 hash = SignatureHash(scriptPubKey, transaction, 0, SIGHASH_ALL);
+ uint256 hash = SignatureHash(scriptPubKey, transaction, 0, SIGHASH_ALL, 0, SIGVERSION_BASE);
CScript result;
//
@@ -755,21 +1067,21 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12)
scriptPubKey12 << OP_1 << ToByteVector(key1.GetPubKey()) << ToByteVector(key2.GetPubKey()) << OP_2 << OP_CHECKMULTISIG;
CMutableTransaction txFrom12 = BuildCreditingTransaction(scriptPubKey12);
- CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), txFrom12);
+ CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom12);
CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12);
- BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err));
+ BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, NULL, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
txTo12.vout[0].nValue = 2;
- BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err));
+ BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, NULL, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12);
- BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err));
+ BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, NULL, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12);
- BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err));
+ BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, NULL, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
}
@@ -786,65 +1098,66 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23)
scriptPubKey23 << OP_2 << ToByteVector(key1.GetPubKey()) << ToByteVector(key2.GetPubKey()) << ToByteVector(key3.GetPubKey()) << OP_3 << OP_CHECKMULTISIG;
CMutableTransaction txFrom23 = BuildCreditingTransaction(scriptPubKey23);
- CMutableTransaction txTo23 = BuildSpendingTransaction(CScript(), txFrom23);
+ CMutableTransaction txTo23 = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom23);
std::vector<CKey> keys;
keys.push_back(key1); keys.push_back(key2);
CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
keys.clear();
keys.push_back(key1); keys.push_back(key3);
CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
keys.clear();
keys.push_back(key2); keys.push_back(key3);
CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
keys.clear();
keys.push_back(key2); keys.push_back(key2); // Can't re-use sig
CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
keys.clear();
keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order
CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
keys.clear();
keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order
CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
keys.clear();
keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys
CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
keys.clear();
keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys
CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
keys.clear(); // Must have signatures
CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23);
- BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
+ BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, NULL, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err));
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
}
BOOST_AUTO_TEST_CASE(script_combineSigs)
{
// Test the CombineSignatures function
+ CAmount amount = 0;
CBasicKeyStore keystore;
vector<CKey> keys;
vector<CPubKey> pubkeys;
@@ -858,66 +1171,66 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
}
CMutableTransaction txFrom = BuildCreditingTransaction(GetScriptForDestination(keys[0].GetPubKey().GetID()));
- CMutableTransaction txTo = BuildSpendingTransaction(CScript(), txFrom);
+ CMutableTransaction txTo = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom);
CScript& scriptPubKey = txFrom.vout[0].scriptPubKey;
CScript& scriptSig = txTo.vin[0].scriptSig;
- CScript empty;
- CScript combined = CombineSignatures(scriptPubKey, txTo, 0, empty, empty);
- BOOST_CHECK(combined.empty());
+ SignatureData empty;
+ SignatureData combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, empty);
+ BOOST_CHECK(combined.scriptSig.empty());
// Single signature case:
- SignSignature(keystore, txFrom, txTo, 0); // changes scriptSig
- combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty);
- BOOST_CHECK(combined == scriptSig);
- combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig);
- BOOST_CHECK(combined == scriptSig);
+ SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL); // changes scriptSig
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
+ BOOST_CHECK(combined.scriptSig == scriptSig);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
+ BOOST_CHECK(combined.scriptSig == scriptSig);
CScript scriptSigCopy = scriptSig;
// Signing again will give a different, valid signature:
- SignSignature(keystore, txFrom, txTo, 0);
- combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig);
- BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig);
+ SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
+ BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig);
// P2SH, single-signature case:
CScript pkSingle; pkSingle << ToByteVector(keys[0].GetPubKey()) << OP_CHECKSIG;
keystore.AddCScript(pkSingle);
scriptPubKey = GetScriptForDestination(CScriptID(pkSingle));
- SignSignature(keystore, txFrom, txTo, 0);
- combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty);
- BOOST_CHECK(combined == scriptSig);
- combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig);
- BOOST_CHECK(combined == scriptSig);
+ SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
+ BOOST_CHECK(combined.scriptSig == scriptSig);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
+ BOOST_CHECK(combined.scriptSig == scriptSig);
scriptSigCopy = scriptSig;
- SignSignature(keystore, txFrom, txTo, 0);
- combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig);
- BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig);
+ SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
+ BOOST_CHECK(combined.scriptSig == scriptSigCopy || combined.scriptSig == scriptSig);
// dummy scriptSigCopy with placeholder, should always choose non-placeholder:
- scriptSigCopy = CScript() << OP_0 << vector<unsigned char>(pkSingle.begin(), pkSingle.end());
- combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig);
- BOOST_CHECK(combined == scriptSig);
- combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, scriptSigCopy);
- BOOST_CHECK(combined == scriptSig);
+ scriptSigCopy = CScript() << OP_0 << std::vector<unsigned char>(pkSingle.begin(), pkSingle.end());
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSigCopy), SignatureData(scriptSig));
+ BOOST_CHECK(combined.scriptSig == scriptSig);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), SignatureData(scriptSigCopy));
+ BOOST_CHECK(combined.scriptSig == scriptSig);
// Hardest case: Multisig 2-of-3
scriptPubKey = GetScriptForMultisig(2, pubkeys);
keystore.AddCScript(scriptPubKey);
- SignSignature(keystore, txFrom, txTo, 0);
- combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty);
- BOOST_CHECK(combined == scriptSig);
- combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig);
- BOOST_CHECK(combined == scriptSig);
+ SignSignature(keystore, txFrom, txTo, 0, SIGHASH_ALL);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(scriptSig), empty);
+ BOOST_CHECK(combined.scriptSig == scriptSig);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), empty, SignatureData(scriptSig));
+ BOOST_CHECK(combined.scriptSig == scriptSig);
// A couple of partially-signed versions:
vector<unsigned char> sig1;
- uint256 hash1 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_ALL);
+ uint256 hash1 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_ALL, 0, SIGVERSION_BASE);
BOOST_CHECK(keys[0].Sign(hash1, sig1));
sig1.push_back(SIGHASH_ALL);
vector<unsigned char> sig2;
- uint256 hash2 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_NONE);
+ uint256 hash2 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_NONE, 0, SIGVERSION_BASE);
BOOST_CHECK(keys[1].Sign(hash2, sig2));
sig2.push_back(SIGHASH_NONE);
vector<unsigned char> sig3;
- uint256 hash3 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_SINGLE);
+ uint256 hash3 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_SINGLE, 0, SIGVERSION_BASE);
BOOST_CHECK(keys[2].Sign(hash3, sig3));
sig3.push_back(SIGHASH_SINGLE);
@@ -933,22 +1246,22 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
CScript complete13 = CScript() << OP_0 << sig1 << sig3;
CScript complete23 = CScript() << OP_0 << sig2 << sig3;
- combined = CombineSignatures(scriptPubKey, txTo, 0, partial1a, partial1b);
- BOOST_CHECK(combined == partial1a);
- combined = CombineSignatures(scriptPubKey, txTo, 0, partial1a, partial2a);
- BOOST_CHECK(combined == complete12);
- combined = CombineSignatures(scriptPubKey, txTo, 0, partial2a, partial1a);
- BOOST_CHECK(combined == complete12);
- combined = CombineSignatures(scriptPubKey, txTo, 0, partial1b, partial2b);
- BOOST_CHECK(combined == complete12);
- combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial1b);
- BOOST_CHECK(combined == complete13);
- combined = CombineSignatures(scriptPubKey, txTo, 0, partial2a, partial3a);
- BOOST_CHECK(combined == complete23);
- combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial2b);
- BOOST_CHECK(combined == complete23);
- combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial3a);
- BOOST_CHECK(combined == partial3c);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial1b));
+ BOOST_CHECK(combined.scriptSig == partial1a);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1a), SignatureData(partial2a));
+ BOOST_CHECK(combined.scriptSig == complete12);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial1a));
+ BOOST_CHECK(combined.scriptSig == complete12);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial1b), SignatureData(partial2b));
+ BOOST_CHECK(combined.scriptSig == complete12);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial1b));
+ BOOST_CHECK(combined.scriptSig == complete13);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial2a), SignatureData(partial3a));
+ BOOST_CHECK(combined.scriptSig == complete23);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial2b));
+ BOOST_CHECK(combined.scriptSig == complete23);
+ combined = CombineSignatures(scriptPubKey, MutableTransactionSignatureChecker(&txTo, 0, amount), SignatureData(partial3b), SignatureData(partial3a));
+ BOOST_CHECK(combined.scriptSig == partial3c);
}
BOOST_AUTO_TEST_CASE(script_standard_push)
@@ -958,7 +1271,7 @@ BOOST_AUTO_TEST_CASE(script_standard_push)
CScript script;
script << i;
BOOST_CHECK_MESSAGE(script.IsPushOnly(), "Number " << i << " is not pure push.");
- BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Number " << i << " push is not minimal data.");
+ BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, NULL, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Number " << i << " push is not minimal data.");
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
}
@@ -967,7 +1280,7 @@ BOOST_AUTO_TEST_CASE(script_standard_push)
CScript script;
script << data;
BOOST_CHECK_MESSAGE(script.IsPushOnly(), "Length " << i << " is not pure push.");
- BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Length " << i << " push is not minimal data.");
+ BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, NULL, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Length " << i << " push is not minimal data.");
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
}
}
@@ -985,10 +1298,10 @@ BOOST_AUTO_TEST_CASE(script_IsPushOnly_on_invalid_scripts)
BOOST_AUTO_TEST_CASE(script_GetScriptAsm)
{
- BOOST_CHECK_EQUAL("OP_NOP2", ScriptToAsmStr(CScript() << OP_NOP2, true));
- BOOST_CHECK_EQUAL("OP_NOP2", ScriptToAsmStr(CScript() << OP_CHECKLOCKTIMEVERIFY, true));
- BOOST_CHECK_EQUAL("OP_NOP2", ScriptToAsmStr(CScript() << OP_NOP2));
- BOOST_CHECK_EQUAL("OP_NOP2", ScriptToAsmStr(CScript() << OP_CHECKLOCKTIMEVERIFY));
+ BOOST_CHECK_EQUAL("OP_CHECKLOCKTIMEVERIFY", ScriptToAsmStr(CScript() << OP_NOP2, true));
+ BOOST_CHECK_EQUAL("OP_CHECKLOCKTIMEVERIFY", ScriptToAsmStr(CScript() << OP_CHECKLOCKTIMEVERIFY, true));
+ BOOST_CHECK_EQUAL("OP_CHECKLOCKTIMEVERIFY", ScriptToAsmStr(CScript() << OP_NOP2));
+ BOOST_CHECK_EQUAL("OP_CHECKLOCKTIMEVERIFY", ScriptToAsmStr(CScript() << OP_CHECKLOCKTIMEVERIFY));
string derSig("304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c5090");
string pubKey("03b0da749730dc9b4b1f4a14d6902877a92541f5368778853d9c4a0cb7802dcfb2");
@@ -1013,4 +1326,121 @@ BOOST_AUTO_TEST_CASE(script_GetScriptAsm)
BOOST_CHECK_EQUAL(derSig + "83 " + pubKey, ScriptToAsmStr(CScript() << ToByteVector(ParseHex(derSig + "83")) << vchPubKey));
}
+static CScript
+ScriptFromHex(const char* hex)
+{
+ std::vector<unsigned char> data = ParseHex(hex);
+ return CScript(data.begin(), data.end());
+}
+
+
+BOOST_AUTO_TEST_CASE(script_FindAndDelete)
+{
+ // Exercise the FindAndDelete functionality
+ CScript s;
+ CScript d;
+ CScript expect;
+
+ s = CScript() << OP_1 << OP_2;
+ d = CScript(); // delete nothing should be a no-op
+ expect = s;
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0);
+ BOOST_CHECK(s == expect);
+
+ s = CScript() << OP_1 << OP_2 << OP_3;
+ d = CScript() << OP_2;
+ expect = CScript() << OP_1 << OP_3;
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
+ BOOST_CHECK(s == expect);
+
+ s = CScript() << OP_3 << OP_1 << OP_3 << OP_3 << OP_4 << OP_3;
+ d = CScript() << OP_3;
+ expect = CScript() << OP_1 << OP_4;
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 4);
+ BOOST_CHECK(s == expect);
+
+ s = ScriptFromHex("0302ff03"); // PUSH 0x02ff03 onto stack
+ d = ScriptFromHex("0302ff03");
+ expect = CScript();
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
+ BOOST_CHECK(s == expect);
+
+ s = ScriptFromHex("0302ff030302ff03"); // PUSH 0x2ff03 PUSH 0x2ff03
+ d = ScriptFromHex("0302ff03");
+ expect = CScript();
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2);
+ BOOST_CHECK(s == expect);
+
+ s = ScriptFromHex("0302ff030302ff03");
+ d = ScriptFromHex("02");
+ expect = s; // FindAndDelete matches entire opcodes
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0);
+ BOOST_CHECK(s == expect);
+
+ s = ScriptFromHex("0302ff030302ff03");
+ d = ScriptFromHex("ff");
+ expect = s;
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0);
+ BOOST_CHECK(s == expect);
+
+ // This is an odd edge case: strip of the push-three-bytes
+ // prefix, leaving 02ff03 which is push-two-bytes:
+ s = ScriptFromHex("0302ff030302ff03");
+ d = ScriptFromHex("03");
+ expect = CScript() << ParseHex("ff03") << ParseHex("ff03");
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2);
+ BOOST_CHECK(s == expect);
+
+ // Byte sequence that spans multiple opcodes:
+ s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
+ d = ScriptFromHex("feed51");
+ expect = s;
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); // doesn't match 'inside' opcodes
+ BOOST_CHECK(s == expect);
+
+ s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
+ d = ScriptFromHex("02feed51");
+ expect = ScriptFromHex("69");
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
+ BOOST_CHECK(s == expect);
+
+ s = ScriptFromHex("516902feed5169");
+ d = ScriptFromHex("feed51");
+ expect = s;
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0);
+ BOOST_CHECK(s == expect);
+
+ s = ScriptFromHex("516902feed5169");
+ d = ScriptFromHex("02feed51");
+ expect = ScriptFromHex("516969");
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
+ BOOST_CHECK(s == expect);
+
+ s = CScript() << OP_0 << OP_0 << OP_1 << OP_1;
+ d = CScript() << OP_0 << OP_1;
+ expect = CScript() << OP_0 << OP_1; // FindAndDelete is single-pass
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
+ BOOST_CHECK(s == expect);
+
+ s = CScript() << OP_0 << OP_0 << OP_1 << OP_0 << OP_1 << OP_1;
+ d = CScript() << OP_0 << OP_1;
+ expect = CScript() << OP_0 << OP_1; // FindAndDelete is single-pass
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2);
+ BOOST_CHECK(s == expect);
+
+ // Another weird edge case:
+ // End with invalid push (not enough data)...
+ s = ScriptFromHex("0003feed");
+ d = ScriptFromHex("03feed"); // ... can remove the invalid push
+ expect = ScriptFromHex("00");
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
+ BOOST_CHECK(s == expect);
+
+ s = ScriptFromHex("0003feed");
+ d = ScriptFromHex("00");
+ expect = ScriptFromHex("03feed");
+ BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
+ BOOST_CHECK(s == expect);
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/scriptnum10.h b/src/test/scriptnum10.h
index 00419746b7..94dd58526c 100644
--- a/src/test/scriptnum10.h
+++ b/src/test/scriptnum10.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
diff --git a/src/test/scriptnum_tests.cpp b/src/test/scriptnum_tests.cpp
index 2405ab3ffc..6b6689c7d3 100644
--- a/src/test/scriptnum_tests.cpp
+++ b/src/test/scriptnum_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
diff --git a/src/test/serialize_tests.cpp b/src/test/serialize_tests.cpp
index cc8f2b788d..bec2c7459d 100644
--- a/src/test/serialize_tests.cpp
+++ b/src/test/serialize_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
@@ -160,6 +160,27 @@ BOOST_AUTO_TEST_CASE(varints)
}
}
+BOOST_AUTO_TEST_CASE(varints_bitpatterns)
+{
+ CDataStream ss(SER_DISK, 0);
+ ss << VARINT(0); BOOST_CHECK_EQUAL(HexStr(ss), "00"); ss.clear();
+ ss << VARINT(0x7f); BOOST_CHECK_EQUAL(HexStr(ss), "7f"); ss.clear();
+ ss << VARINT((int8_t)0x7f); BOOST_CHECK_EQUAL(HexStr(ss), "7f"); ss.clear();
+ ss << VARINT(0x80); BOOST_CHECK_EQUAL(HexStr(ss), "8000"); ss.clear();
+ ss << VARINT((uint8_t)0x80); BOOST_CHECK_EQUAL(HexStr(ss), "8000"); ss.clear();
+ ss << VARINT(0x1234); BOOST_CHECK_EQUAL(HexStr(ss), "a334"); ss.clear();
+ ss << VARINT((int16_t)0x1234); BOOST_CHECK_EQUAL(HexStr(ss), "a334"); ss.clear();
+ ss << VARINT(0xffff); BOOST_CHECK_EQUAL(HexStr(ss), "82fe7f"); ss.clear();
+ ss << VARINT((uint16_t)0xffff); BOOST_CHECK_EQUAL(HexStr(ss), "82fe7f"); ss.clear();
+ ss << VARINT(0x123456); BOOST_CHECK_EQUAL(HexStr(ss), "c7e756"); ss.clear();
+ ss << VARINT((int32_t)0x123456); BOOST_CHECK_EQUAL(HexStr(ss), "c7e756"); ss.clear();
+ ss << VARINT(0x80123456U); BOOST_CHECK_EQUAL(HexStr(ss), "86ffc7e756"); ss.clear();
+ ss << VARINT((uint32_t)0x80123456U); BOOST_CHECK_EQUAL(HexStr(ss), "86ffc7e756"); ss.clear();
+ ss << VARINT(0xffffffff); BOOST_CHECK_EQUAL(HexStr(ss), "8efefefe7f"); ss.clear();
+ ss << VARINT(0x7fffffffffffffffLL); BOOST_CHECK_EQUAL(HexStr(ss), "fefefefefefefefe7f"); ss.clear();
+ ss << VARINT(0xffffffffffffffffULL); BOOST_CHECK_EQUAL(HexStr(ss), "80fefefefefefefefe7f"); ss.clear();
+}
+
BOOST_AUTO_TEST_CASE(compactsize)
{
CDataStream ss(SER_DISK, 0);
diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp
index 6fca64d5da..4a48347b70 100644
--- a/src/test/sighash_tests.cpp
+++ b/src/test/sighash_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2013 The Bitcoin Core developers
+// Copyright (c) 2013-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.
@@ -82,7 +82,7 @@ uint256 static SignatureHashOld(CScript scriptCode, const CTransaction& txTo, un
}
// Serialize and hash
- CHashWriter ss(SER_GETHASH, 0);
+ CHashWriter ss(SER_GETHASH, SERIALIZE_TRANSACTION_NO_WITNESS);
ss << txTmp << nHashType;
return ss.GetHash();
}
@@ -143,7 +143,7 @@ BOOST_AUTO_TEST_CASE(sighash_test)
uint256 sh, sho;
sho = SignatureHashOld(scriptCode, txTo, nIn, nHashType);
- sh = SignatureHash(scriptCode, txTo, nIn, nHashType);
+ sh = SignatureHash(scriptCode, txTo, nIn, nHashType, 0, SIGVERSION_BASE);
#if defined(PRINT_SIGHASH_JSON)
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
ss << txTo;
@@ -195,7 +195,6 @@ BOOST_AUTO_TEST_CASE(sighash_from_data)
nHashType = test[3].get_int();
sigHashHex = test[4].get_str();
- uint256 sh;
CDataStream stream(ParseHex(raw_tx), SER_NETWORK, PROTOCOL_VERSION);
stream >> tx;
@@ -210,7 +209,7 @@ BOOST_AUTO_TEST_CASE(sighash_from_data)
continue;
}
- sh = SignatureHash(scriptCode, tx, nIn, nHashType);
+ sh = SignatureHash(scriptCode, tx, nIn, nHashType, 0, SIGVERSION_BASE);
BOOST_CHECK_MESSAGE(sh.GetHex() == sigHashHex, strTest);
}
}
diff --git a/src/test/sigopcount_tests.cpp b/src/test/sigopcount_tests.cpp
index ea2b9b795f..e8a63ae60c 100644
--- a/src/test/sigopcount_tests.cpp
+++ b/src/test/sigopcount_tests.cpp
@@ -1,7 +1,8 @@
-// Copyright (c) 2012-2013 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.
+#include "main.h"
#include "pubkey.h"
#include "key.h"
#include "script/script.h"
@@ -64,4 +65,180 @@ BOOST_AUTO_TEST_CASE(GetSigOpCount)
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig2), 3U);
}
+/**
+ * Verifies script execution of the zeroth scriptPubKey of tx output and
+ * zeroth scriptSig and witness of tx input.
+ */
+ScriptError VerifyWithFlag(const CTransaction& output, const CMutableTransaction& input, int flags)
+{
+ ScriptError error;
+ CTransaction inputi(input);
+ bool ret = VerifyScript(inputi.vin[0].scriptSig, output.vout[0].scriptPubKey, inputi.wit.vtxinwit.size() > 0 ? &inputi.wit.vtxinwit[0].scriptWitness : NULL, flags, TransactionSignatureChecker(&inputi, 0, output.vout[0].nValue), &error);
+ BOOST_CHECK((ret == true) == (error == SCRIPT_ERR_OK));
+
+ return error;
+}
+
+/**
+ * Builds a creationTx from scriptPubKey and a spendingTx from scriptSig
+ * and witness such that spendingTx spends output zero of creationTx.
+ * Also inserts creationTx's output into the coins view.
+ */
+void BuildTxs(CMutableTransaction& spendingTx, CCoinsViewCache& coins, CMutableTransaction& creationTx, const CScript& scriptPubKey, const CScript& scriptSig, const CTxInWitness& witness)
+{
+ creationTx.nVersion = 1;
+ creationTx.vin.resize(1);
+ creationTx.vin[0].prevout.SetNull();
+ creationTx.vin[0].scriptSig = CScript();
+ creationTx.wit.vtxinwit.resize(1);
+ creationTx.vout.resize(1);
+ creationTx.vout[0].nValue = 1;
+ creationTx.vout[0].scriptPubKey = scriptPubKey;
+
+ spendingTx.nVersion = 1;
+ spendingTx.vin.resize(1);
+ spendingTx.vin[0].prevout.hash = creationTx.GetHash();
+ spendingTx.vin[0].prevout.n = 0;
+ spendingTx.vin[0].scriptSig = scriptSig;
+ spendingTx.wit.vtxinwit.resize(1);
+ spendingTx.wit.vtxinwit[0] = witness;
+ spendingTx.vout.resize(1);
+ spendingTx.vout[0].nValue = 1;
+ spendingTx.vout[0].scriptPubKey = CScript();
+
+ coins.ModifyCoins(creationTx.GetHash())->FromTx(creationTx, 0);
+}
+
+BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
+{
+ // Transaction creates outputs
+ CMutableTransaction creationTx;
+ // Transaction that spends outputs and whose
+ // sig op cost is going to be tested
+ CMutableTransaction spendingTx;
+
+ // Create utxo set
+ CCoinsView coinsDummy;
+ CCoinsViewCache coins(&coinsDummy);
+ // Create key
+ CKey key;
+ key.MakeNewKey(true);
+ CPubKey pubkey = key.GetPubKey();
+ // Default flags
+ int flags = SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH;
+
+ // Multisig script (legacy counting)
+ {
+ CScript scriptPubKey = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
+ // Do not use a valid signature to avoid using wallet operations.
+ CScript scriptSig = CScript() << OP_0 << OP_0;
+
+ BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, CTxInWitness());
+ // Legacy counting only includes signature operations in scriptSigs and scriptPubKeys
+ // of a transaction and does not take the actual executed sig operations into account.
+ // spendingTx in itself does not contain a signature operation.
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 0);
+ // creationTx contains two signature operations in its scriptPubKey, but legacy counting
+ // is not accurate.
+ assert(GetTransactionSigOpCost(CTransaction(creationTx), coins, flags) == MAX_PUBKEYS_PER_MULTISIG * WITNESS_SCALE_FACTOR);
+ // Sanity check: script verification fails because of an invalid signature.
+ assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
+ }
+
+ // Multisig nested in P2SH
+ {
+ CScript redeemScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
+ CScript scriptPubKey = GetScriptForDestination(CScriptID(redeemScript));
+ CScript scriptSig = CScript() << OP_0 << OP_0 << ToByteVector(redeemScript);
+
+ BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, CTxInWitness());
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2 * WITNESS_SCALE_FACTOR);
+ assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
+ }
+
+ // P2WPKH witness program
+ {
+ CScript p2pk = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
+ CScript scriptPubKey = GetScriptForWitness(p2pk);
+ CScript scriptSig = CScript();
+ CTxInWitness witness;
+ CScriptWitness scriptWitness;
+ scriptWitness.stack.push_back(vector<unsigned char>(0));
+ scriptWitness.stack.push_back(vector<unsigned char>(0));
+ witness.scriptWitness = scriptWitness;
+
+
+ BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, witness);
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 1);
+ // No signature operations if we don't verify the witness.
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags & ~SCRIPT_VERIFY_WITNESS) == 0);
+ assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_EQUALVERIFY);
+
+ // The sig op cost for witness version != 0 is zero.
+ assert(scriptPubKey[0] == 0x00);
+ scriptPubKey[0] = 0x51;
+ BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, witness);
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 0);
+ scriptPubKey[0] = 0x00;
+ BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, witness);
+
+ // The witness of a coinbase transaction is not taken into account.
+ spendingTx.vin[0].prevout.SetNull();
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 0);
+ }
+
+ // P2WPKH nested in P2SH
+ {
+ CScript p2pk = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
+ CScript scriptSig = GetScriptForWitness(p2pk);
+ CScript scriptPubKey = GetScriptForDestination(CScriptID(scriptSig));
+ scriptSig = CScript() << ToByteVector(scriptSig);
+ CTxInWitness witness;
+ CScriptWitness scriptWitness;
+ scriptWitness.stack.push_back(vector<unsigned char>(0));
+ scriptWitness.stack.push_back(vector<unsigned char>(0));
+ witness.scriptWitness = scriptWitness;
+
+ BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, witness);
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 1);
+ assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_EQUALVERIFY);
+ }
+
+ // P2WSH witness program
+ {
+ CScript witnessScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
+ CScript scriptPubKey = GetScriptForWitness(witnessScript);
+ CScript scriptSig = CScript();
+ CTxInWitness witness;
+ CScriptWitness scriptWitness;
+ scriptWitness.stack.push_back(vector<unsigned char>(0));
+ scriptWitness.stack.push_back(vector<unsigned char>(0));
+ scriptWitness.stack.push_back(vector<unsigned char>(witnessScript.begin(), witnessScript.end()));
+ witness.scriptWitness = scriptWitness;
+
+ BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, witness);
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2);
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags & ~SCRIPT_VERIFY_WITNESS) == 0);
+ assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
+ }
+
+ // P2WSH nested in P2SH
+ {
+ CScript witnessScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
+ CScript redeemScript = GetScriptForWitness(witnessScript);
+ CScript scriptPubKey = GetScriptForDestination(CScriptID(redeemScript));
+ CScript scriptSig = CScript() << ToByteVector(redeemScript);
+ CTxInWitness witness;
+ CScriptWitness scriptWitness;
+ scriptWitness.stack.push_back(vector<unsigned char>(0));
+ scriptWitness.stack.push_back(vector<unsigned char>(0));
+ scriptWitness.stack.push_back(vector<unsigned char>(witnessScript.begin(), witnessScript.end()));
+ witness.scriptWitness = scriptWitness;
+
+ BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, witness);
+ assert(GetTransactionSigOpCost(CTransaction(spendingTx), coins, flags) == 2);
+ assert(VerifyWithFlag(creationTx, spendingTx, flags) == SCRIPT_ERR_CHECKMULTISIGVERIFY);
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/skiplist_tests.cpp b/src/test/skiplist_tests.cpp
index a904e3862f..f14b902fe1 100644
--- a/src/test/skiplist_tests.cpp
+++ b/src/test/skiplist_tests.cpp
@@ -1,4 +1,4 @@
-// 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.
diff --git a/src/test/streams_tests.cpp b/src/test/streams_tests.cpp
index 0ed8f363d7..34f501e867 100644
--- a/src/test/streams_tests.cpp
+++ b/src/test/streams_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2013 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.
diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp
index 2147dbb065..02843d8525 100644
--- a/src/test/test_bitcoin.cpp
+++ b/src/test/test_bitcoin.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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.
@@ -17,18 +17,16 @@
#include "txdb.h"
#include "txmempool.h"
#include "ui_interface.h"
-#include "util.h"
-#ifdef ENABLE_WALLET
-#include "wallet/db.h"
-#include "wallet/wallet.h"
-#endif
+#include "rpc/server.h"
+#include "rpc/register.h"
+
+#include "test/testutil.h"
#include <boost/filesystem.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/thread.hpp>
-CClientUIInterface uiInterface; // Declared but not defined in ui_interface.h
-CWallet* pwalletMain;
+std::unique_ptr<CConnman> g_connman;
extern bool fPrintToConsole;
extern void noui_connect();
@@ -47,31 +45,35 @@ BasicTestingSetup::BasicTestingSetup(const std::string& chainName)
BasicTestingSetup::~BasicTestingSetup()
{
ECC_Stop();
+ g_connman.reset();
}
TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(chainName)
{
const CChainParams& chainparams = Params();
-#ifdef ENABLE_WALLET
- bitdb.MakeMock();
-#endif
+ // Ideally we'd move all the RPC tests to the functional testing framework
+ // instead of unit tests, but for now we need these here.
+
+ RegisterAllCoreRPCCommands(tableRPC);
ClearDatadirCache();
pathTemp = GetTempPath() / strprintf("test_bitcoin_%lu_%i", (unsigned long)GetTime(), (int)(GetRand(100000)));
boost::filesystem::create_directories(pathTemp);
mapArgs["-datadir"] = pathTemp.string();
+ mempool.setSanityCheck(1.0);
pblocktree = new CBlockTreeDB(1 << 20, true);
pcoinsdbview = new CCoinsViewDB(1 << 23, true);
pcoinsTip = new CCoinsViewCache(pcoinsdbview);
InitBlockIndex(chainparams);
-#ifdef ENABLE_WALLET
- bool fFirstRun;
- pwalletMain = new CWallet("wallet.dat");
- pwalletMain->LoadWallet(fFirstRun);
- RegisterValidationInterface(pwalletMain);
-#endif
+ {
+ CValidationState state;
+ bool ok = ActivateBestChain(state, chainparams);
+ BOOST_CHECK(ok);
+ }
nScriptCheckThreads = 3;
for (int i=0; i < nScriptCheckThreads-1; i++)
threadGroup.create_thread(&ThreadScriptCheck);
+ g_connman = std::unique_ptr<CConnman>(new CConnman(0x1337, 0x1337)); // Deterministic randomness for tests.
+ connman = g_connman.get();
RegisterNodeSignals(GetNodeSignals());
}
@@ -80,19 +82,10 @@ TestingSetup::~TestingSetup()
UnregisterNodeSignals(GetNodeSignals());
threadGroup.interrupt_all();
threadGroup.join_all();
-#ifdef ENABLE_WALLET
- UnregisterValidationInterface(pwalletMain);
- delete pwalletMain;
- pwalletMain = NULL;
-#endif
UnloadBlockIndex();
delete pcoinsTip;
delete pcoinsdbview;
delete pblocktree;
-#ifdef ENABLE_WALLET
- bitdb.Flush(true);
- bitdb.Reset();
-#endif
boost::filesystem::remove_all(pathTemp);
}
@@ -117,7 +110,7 @@ CBlock
TestChain100Setup::CreateAndProcessBlock(const std::vector<CMutableTransaction>& txns, const CScript& scriptPubKey)
{
const CChainParams& chainparams = Params();
- CBlockTemplate *pblocktemplate = CreateNewBlock(chainparams, scriptPubKey);
+ CBlockTemplate *pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey);
CBlock& block = pblocktemplate->block;
// Replace mempool-selected txns with just coinbase plus passed-in txns:
@@ -131,7 +124,7 @@ TestChain100Setup::CreateAndProcessBlock(const std::vector<CMutableTransaction>&
while (!CheckProofOfWork(block.GetHash(), block.nBits, chainparams.GetConsensus())) ++block.nNonce;
CValidationState state;
- ProcessNewBlock(state, chainparams, NULL, &block, true, NULL);
+ ProcessNewBlock(state, chainparams, NULL, &block, true, NULL, connman);
CBlock result = block;
delete pblocktemplate;
@@ -145,12 +138,16 @@ TestChain100Setup::~TestChain100Setup()
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(CMutableTransaction &tx, CTxMemPool *pool) {
CTransaction txn(tx);
- bool hasNoDependencies = pool ? pool->HasNoInputsOf(tx) : hadNoDependencies;
+ return FromTx(txn, pool);
+}
+
+CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(CTransaction &txn, CTxMemPool *pool) {
+ bool hasNoDependencies = pool ? pool->HasNoInputsOf(txn) : hadNoDependencies;
// Hack to assume either its completely dependent on other mempool txs or not at all
CAmount inChainValue = hasNoDependencies ? txn.GetValueOut() : 0;
return CTxMemPoolEntry(txn, nFee, nTime, dPriority, nHeight,
- hasNoDependencies, inChainValue, spendsCoinbase, sigOpCount);
+ hasNoDependencies, inChainValue, spendsCoinbase, sigOpCost, lp);
}
void Shutdown(void* parg)
diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h
index 273bfdd7f4..9819a7097d 100644
--- a/src/test/test_bitcoin.h
+++ b/src/test/test_bitcoin.h
@@ -1,3 +1,7 @@
+// 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_TEST_TEST_BITCOIN_H
#define BITCOIN_TEST_TEST_BITCOIN_H
@@ -5,6 +9,7 @@
#include "key.h"
#include "pubkey.h"
#include "txdb.h"
+#include "txmempool.h"
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
@@ -20,13 +25,14 @@ struct BasicTestingSetup {
};
/** Testing setup that configures a complete environment.
- * Included are data directory, coins database, script check threads
- * and wallet (if enabled) setup.
+ * Included are data directory, coins database, script check threads setup.
*/
+class CConnman;
struct TestingSetup: public BasicTestingSetup {
CCoinsViewDB *pcoinsdbview;
boost::filesystem::path pathTemp;
boost::thread_group threadGroup;
+ CConnman* connman;
TestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
~TestingSetup();
@@ -66,13 +72,15 @@ struct TestMemPoolEntryHelper
unsigned int nHeight;
bool hadNoDependencies;
bool spendsCoinbase;
- unsigned int sigOpCount;
-
+ unsigned int sigOpCost;
+ LockPoints lp;
+
TestMemPoolEntryHelper() :
nFee(0), nTime(0), dPriority(0.0), nHeight(1),
- hadNoDependencies(false), spendsCoinbase(false), sigOpCount(1) { }
+ hadNoDependencies(false), spendsCoinbase(false), sigOpCost(4) { }
CTxMemPoolEntry FromTx(CMutableTransaction &tx, CTxMemPool *pool = NULL);
+ CTxMemPoolEntry FromTx(CTransaction &tx, CTxMemPool *pool = NULL);
// Change the default value
TestMemPoolEntryHelper &Fee(CAmount _fee) { nFee = _fee; return *this; }
@@ -81,6 +89,6 @@ struct TestMemPoolEntryHelper
TestMemPoolEntryHelper &Height(unsigned int _height) { nHeight = _height; return *this; }
TestMemPoolEntryHelper &HadNoDependencies(bool _hnd) { hadNoDependencies = _hnd; return *this; }
TestMemPoolEntryHelper &SpendsCoinbase(bool _flag) { spendsCoinbase = _flag; return *this; }
- TestMemPoolEntryHelper &SigOps(unsigned int _sigops) { sigOpCount = _sigops; return *this; }
+ TestMemPoolEntryHelper &SigOpsCost(unsigned int _sigopsCost) { sigOpCost = _sigopsCost; return *this; }
};
#endif
diff --git a/src/test/testutil.cpp b/src/test/testutil.cpp
new file mode 100644
index 0000000000..304cffb798
--- /dev/null
+++ b/src/test/testutil.cpp
@@ -0,0 +1,33 @@
+// Copyright (c) 2009-2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "testutil.h"
+
+#ifdef WIN32
+#include <shlobj.h>
+#endif
+
+#include <boost/filesystem.hpp>
+
+boost::filesystem::path GetTempPath() {
+#if BOOST_FILESYSTEM_VERSION == 3
+ return boost::filesystem::temp_directory_path();
+#else
+ // TODO: remove when we don't support filesystem v2 anymore
+ boost::filesystem::path path;
+#ifdef WIN32
+ char pszPath[MAX_PATH] = "";
+
+ if (GetTempPathA(MAX_PATH, pszPath))
+ path = boost::filesystem::path(pszPath);
+#else
+ path = boost::filesystem::path("/tmp");
+#endif
+ if (path.empty() || !boost::filesystem::is_directory(path)) {
+ LogPrintf("GetTempPath(): failed to find temp path\n");
+ return boost::filesystem::path("");
+ }
+ return path;
+#endif
+}
diff --git a/src/test/testutil.h b/src/test/testutil.h
new file mode 100644
index 0000000000..5875dc50e6
--- /dev/null
+++ b/src/test/testutil.h
@@ -0,0 +1,15 @@
+// Copyright (c) 2009-2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+/**
+ * Utility functions shared by unit tests
+ */
+#ifndef BITCOIN_TEST_TESTUTIL_H
+#define BITCOIN_TEST_TESTUTIL_H
+
+#include <boost/filesystem/path.hpp>
+
+boost::filesystem::path GetTempPath();
+
+#endif // BITCOIN_TEST_TESTUTIL_H
diff --git a/src/test/timedata_tests.cpp b/src/test/timedata_tests.cpp
index 887cfb4761..1224ff8454 100644
--- a/src/test/timedata_tests.cpp
+++ b/src/test/timedata_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
//
diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp
index fb0df1aff4..34d9547f3d 100644
--- a/src/test/transaction_tests.cpp
+++ b/src/test/transaction_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// Copyright (c) 2011-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -7,6 +7,7 @@
#include "test/test_bitcoin.h"
#include "clientversion.h"
+#include "checkqueue.h"
#include "consensus/validation.h"
#include "core_io.h"
#include "key.h"
@@ -14,7 +15,9 @@
#include "main.h" // For CheckTransaction
#include "policy/policy.h"
#include "script/script.h"
+#include "script/sign.h"
#include "script/script_error.h"
+#include "script/standard.h"
#include "utilstrencodings.h"
#include <map>
@@ -25,11 +28,14 @@
#include <boost/assign/list_of.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/assign/list_of.hpp>
+#include <boost/foreach.hpp>
#include <univalue.h>
using namespace std;
+typedef vector<unsigned char> valtype;
+
// In script_tests.cpp
extern UniValue read_json(const std::string& jsondata);
@@ -44,7 +50,13 @@ static std::map<string, unsigned int> mapFlagNames = boost::assign::map_list_of
(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("CHECKLOCKTIMEVERIFY"), (unsigned int)SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY);
+ (string("MINIMALIF"), (unsigned int)SCRIPT_VERIFY_MINIMALIF)
+ (string("NULLFAIL"), (unsigned int)SCRIPT_VERIFY_NULLFAIL)
+ (string("CHECKLOCKTIMEVERIFY"), (unsigned int)SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY)
+ (string("CHECKSEQUENCEVERIFY"), (unsigned int)SCRIPT_VERIFY_CHECKSEQUENCEVERIFY)
+ (string("WITNESS"), (unsigned int)SCRIPT_VERIFY_WITNESS)
+ (string("DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"), (unsigned int)SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM)
+ (string("WITNESS_PUBKEYTYPE"), (unsigned int)SCRIPT_VERIFY_WITNESS_PUBKEYTYPE);
unsigned int ParseScriptFlags(string strFlags)
{
@@ -107,6 +119,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
}
map<COutPoint, CScript> mapprevOutScriptPubKeys;
+ map<COutPoint, int64_t> mapprevOutValues;
UniValue inputs = test[0].get_array();
bool fValid = true;
for (unsigned int inpIdx = 0; inpIdx < inputs.size(); inpIdx++) {
@@ -117,13 +130,17 @@ BOOST_AUTO_TEST_CASE(tx_valid)
break;
}
UniValue vinput = input.get_array();
- if (vinput.size() != 3)
+ if (vinput.size() < 3 || vinput.size() > 4)
{
fValid = false;
break;
}
-
- mapprevOutScriptPubKeys[COutPoint(uint256S(vinput[0].get_str()), vinput[1].get_int())] = ParseScript(vinput[2].get_str());
+ COutPoint outpoint(uint256S(vinput[0].get_str()), vinput[1].get_int());
+ mapprevOutScriptPubKeys[outpoint] = ParseScript(vinput[2].get_str());
+ if (vinput.size() >= 4)
+ {
+ mapprevOutValues[outpoint] = vinput[3].get_int64();
+ }
}
if (!fValid)
{
@@ -140,6 +157,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
BOOST_CHECK_MESSAGE(CheckTransaction(tx, state), strTest);
BOOST_CHECK(state.IsValid());
+ PrecomputedTransactionData txdata(tx);
for (unsigned int i = 0; i < tx.vin.size(); i++)
{
if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout))
@@ -148,9 +166,14 @@ BOOST_AUTO_TEST_CASE(tx_valid)
break;
}
+ CAmount amount = 0;
+ if (mapprevOutValues.count(tx.vin[i].prevout)) {
+ amount = mapprevOutValues[tx.vin[i].prevout];
+ }
unsigned int verify_flags = ParseScriptFlags(test[2].get_str());
+ const CScriptWitness *witness = (i < tx.wit.vtxinwit.size()) ? &tx.wit.vtxinwit[i].scriptWitness : NULL;
BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout],
- verify_flags, TransactionSignatureChecker(&tx, i), &err),
+ witness, verify_flags, TransactionSignatureChecker(&tx, i, amount, txdata), &err),
strTest);
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
}
@@ -182,6 +205,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
}
map<COutPoint, CScript> mapprevOutScriptPubKeys;
+ map<COutPoint, int64_t> mapprevOutValues;
UniValue inputs = test[0].get_array();
bool fValid = true;
for (unsigned int inpIdx = 0; inpIdx < inputs.size(); inpIdx++) {
@@ -192,13 +216,17 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
break;
}
UniValue vinput = input.get_array();
- if (vinput.size() != 3)
+ if (vinput.size() < 3 || vinput.size() > 4)
{
fValid = false;
break;
}
-
- mapprevOutScriptPubKeys[COutPoint(uint256S(vinput[0].get_str()), vinput[1].get_int())] = ParseScript(vinput[2].get_str());
+ COutPoint outpoint(uint256S(vinput[0].get_str()), vinput[1].get_int());
+ mapprevOutScriptPubKeys[outpoint] = ParseScript(vinput[2].get_str());
+ if (vinput.size() >= 4)
+ {
+ mapprevOutValues[outpoint] = vinput[3].get_int64();
+ }
}
if (!fValid)
{
@@ -207,13 +235,14 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
}
string transaction = test[1].get_str();
- CDataStream stream(ParseHex(transaction), SER_NETWORK, PROTOCOL_VERSION);
+ CDataStream stream(ParseHex(transaction), SER_NETWORK, PROTOCOL_VERSION );
CTransaction tx;
stream >> tx;
CValidationState state;
fValid = CheckTransaction(tx, state) && state.IsValid();
+ PrecomputedTransactionData txdata(tx);
for (unsigned int i = 0; i < tx.vin.size() && fValid; i++)
{
if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout))
@@ -223,8 +252,13 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
}
unsigned int verify_flags = ParseScriptFlags(test[2].get_str());
+ CAmount amount = 0;
+ if (mapprevOutValues.count(tx.vin[i].prevout)) {
+ amount = mapprevOutValues[tx.vin[i].prevout];
+ }
+ const CScriptWitness *witness = (i < tx.wit.vtxinwit.size()) ? &tx.wit.vtxinwit[i].scriptWitness : NULL;
fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout],
- verify_flags, TransactionSignatureChecker(&tx, i), &err);
+ witness, verify_flags, TransactionSignatureChecker(&tx, i, amount, txdata), &err);
}
BOOST_CHECK_MESSAGE(!fValid, strTest);
BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err));
@@ -310,14 +344,340 @@ BOOST_AUTO_TEST_CASE(test_Get)
BOOST_CHECK(AreInputsStandard(t1, coins));
BOOST_CHECK_EQUAL(coins.GetValueIn(t1), (50+21+22)*CENT);
+}
+
+void CreateCreditAndSpend(const CKeyStore& keystore, const CScript& outscript, CTransaction& output, CMutableTransaction& input, bool success = true)
+{
+ CMutableTransaction outputm;
+ outputm.nVersion = 1;
+ outputm.vin.resize(1);
+ outputm.vin[0].prevout.SetNull();
+ outputm.vin[0].scriptSig = CScript();
+ outputm.wit.vtxinwit.resize(1);
+ outputm.vout.resize(1);
+ outputm.vout[0].nValue = 1;
+ outputm.vout[0].scriptPubKey = outscript;
+ CDataStream ssout(SER_NETWORK, PROTOCOL_VERSION);
+ ssout << outputm;
+ ssout >> output;
+ assert(output.vin.size() == 1);
+ assert(output.vin[0] == outputm.vin[0]);
+ assert(output.vout.size() == 1);
+ assert(output.vout[0] == outputm.vout[0]);
+ assert(output.wit.vtxinwit.size() == 0);
+
+ CMutableTransaction inputm;
+ inputm.nVersion = 1;
+ inputm.vin.resize(1);
+ inputm.vin[0].prevout.hash = output.GetHash();
+ inputm.vin[0].prevout.n = 0;
+ inputm.wit.vtxinwit.resize(1);
+ inputm.vout.resize(1);
+ inputm.vout[0].nValue = 1;
+ inputm.vout[0].scriptPubKey = CScript();
+ bool ret = SignSignature(keystore, output, inputm, 0, SIGHASH_ALL);
+ assert(ret == success);
+ CDataStream ssin(SER_NETWORK, PROTOCOL_VERSION);
+ ssin << inputm;
+ ssin >> input;
+ assert(input.vin.size() == 1);
+ assert(input.vin[0] == inputm.vin[0]);
+ assert(input.vout.size() == 1);
+ assert(input.vout[0] == inputm.vout[0]);
+ if (inputm.wit.IsNull()) {
+ assert(input.wit.IsNull());
+ } else {
+ assert(!input.wit.IsNull());
+ assert(input.wit.vtxinwit.size() == 1);
+ assert(input.wit.vtxinwit[0].scriptWitness.stack == inputm.wit.vtxinwit[0].scriptWitness.stack);
+ }
+}
+
+void CheckWithFlag(const CTransaction& output, const CMutableTransaction& input, int flags, bool success)
+{
+ ScriptError error;
+ CTransaction inputi(input);
+ bool ret = VerifyScript(inputi.vin[0].scriptSig, output.vout[0].scriptPubKey, inputi.wit.vtxinwit.size() > 0 ? &inputi.wit.vtxinwit[0].scriptWitness : NULL, flags, TransactionSignatureChecker(&inputi, 0, output.vout[0].nValue), &error);
+ assert(ret == success);
+}
+
+static CScript PushAll(const vector<valtype>& values)
+{
+ CScript result;
+ BOOST_FOREACH(const valtype& v, values) {
+ if (v.size() == 0) {
+ result << OP_0;
+ } else if (v.size() == 1 && v[0] >= 1 && v[0] <= 16) {
+ result << CScript::EncodeOP_N(v[0]);
+ } else {
+ result << v;
+ }
+ }
+ return result;
+}
+
+void ReplaceRedeemScript(CScript& script, const CScript& redeemScript)
+{
+ vector<valtype> stack;
+ EvalScript(stack, script, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE);
+ assert(stack.size() > 0);
+ stack.back() = std::vector<unsigned char>(redeemScript.begin(), redeemScript.end());
+ script = PushAll(stack);
+}
+
+BOOST_AUTO_TEST_CASE(test_big_witness_transaction) {
+ CMutableTransaction mtx;
+ mtx.nVersion = 1;
+
+ CKey key;
+ key.MakeNewKey(true); // Need to use compressed keys in segwit or the signing will fail
+ CBasicKeyStore keystore;
+ keystore.AddKeyPubKey(key, key.GetPubKey());
+ CKeyID hash = key.GetPubKey().GetID();
+ CScript scriptPubKey = CScript() << OP_0 << std::vector<unsigned char>(hash.begin(), hash.end());
+
+ vector<int> sigHashes;
+ sigHashes.push_back(SIGHASH_NONE | SIGHASH_ANYONECANPAY);
+ sigHashes.push_back(SIGHASH_SINGLE | SIGHASH_ANYONECANPAY);
+ sigHashes.push_back(SIGHASH_ALL | SIGHASH_ANYONECANPAY);
+ sigHashes.push_back(SIGHASH_NONE);
+ sigHashes.push_back(SIGHASH_SINGLE);
+ sigHashes.push_back(SIGHASH_ALL);
+
+ // create a big transaction of 4500 inputs signed by the same key
+ for(uint32_t ij = 0; ij < 4500; ij++) {
+ uint32_t i = mtx.vin.size();
+ uint256 prevId;
+ prevId.SetHex("0000000000000000000000000000000000000000000000000000000000000100");
+ COutPoint outpoint(prevId, i);
+
+ mtx.vin.resize(mtx.vin.size() + 1);
+ mtx.vin[i].prevout = outpoint;
+ mtx.vin[i].scriptSig = CScript();
+
+ mtx.vout.resize(mtx.vout.size() + 1);
+ mtx.vout[i].nValue = 1000;
+ mtx.vout[i].scriptPubKey = CScript() << OP_1;
+ }
+
+ // sign all inputs
+ for(uint32_t i = 0; i < mtx.vin.size(); i++) {
+ bool hashSigned = SignSignature(keystore, scriptPubKey, mtx, i, 1000, sigHashes.at(i % sigHashes.size()));
+ assert(hashSigned);
+ }
+
+ CTransaction tx;
+ CDataStream ssout(SER_NETWORK, PROTOCOL_VERSION);
+ WithOrVersion(&ssout, 0) << mtx;
+ WithOrVersion(&ssout, 0) >> tx;
+
+ // check all inputs concurrently, with the cache
+ PrecomputedTransactionData txdata(tx);
+ boost::thread_group threadGroup;
+ CCheckQueue<CScriptCheck> scriptcheckqueue(128);
+ CCheckQueueControl<CScriptCheck> control(&scriptcheckqueue);
+
+ for (int i=0; i<20; i++)
+ threadGroup.create_thread(boost::bind(&CCheckQueue<CScriptCheck>::Thread, boost::ref(scriptcheckqueue)));
+
+ CCoins coins;
+ coins.nVersion = 1;
+ coins.fCoinBase = false;
+ for(uint32_t i = 0; i < mtx.vin.size(); i++) {
+ CTxOut txout;
+ txout.nValue = 1000;
+ txout.scriptPubKey = scriptPubKey;
+ coins.vout.push_back(txout);
+ }
- // Adding extra junk to the scriptSig should make it non-standard:
- t1.vin[0].scriptSig << OP_11;
- BOOST_CHECK(!AreInputsStandard(t1, coins));
+ for(uint32_t i = 0; i < mtx.vin.size(); i++) {
+ std::vector<CScriptCheck> vChecks;
+ CScriptCheck check(coins, tx, i, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false, &txdata);
+ vChecks.push_back(CScriptCheck());
+ check.swap(vChecks.back());
+ control.Add(vChecks);
+ }
+
+ bool controlCheck = control.Wait();
+ assert(controlCheck);
- // ... as should not having enough:
- t1.vin[0].scriptSig = CScript();
- BOOST_CHECK(!AreInputsStandard(t1, coins));
+ threadGroup.interrupt_all();
+ threadGroup.join_all();
+}
+
+BOOST_AUTO_TEST_CASE(test_witness)
+{
+ CBasicKeyStore keystore, keystore2;
+ CKey key1, key2, key3, key1L, key2L;
+ CPubKey pubkey1, pubkey2, pubkey3, pubkey1L, pubkey2L;
+ key1.MakeNewKey(true);
+ key2.MakeNewKey(true);
+ key3.MakeNewKey(true);
+ key1L.MakeNewKey(false);
+ key2L.MakeNewKey(false);
+ pubkey1 = key1.GetPubKey();
+ pubkey2 = key2.GetPubKey();
+ pubkey3 = key3.GetPubKey();
+ pubkey1L = key1L.GetPubKey();
+ pubkey2L = key2L.GetPubKey();
+ keystore.AddKeyPubKey(key1, pubkey1);
+ keystore.AddKeyPubKey(key2, pubkey2);
+ keystore.AddKeyPubKey(key1L, pubkey1L);
+ keystore.AddKeyPubKey(key2L, pubkey2L);
+ CScript scriptPubkey1, scriptPubkey2, scriptPubkey1L, scriptPubkey2L, scriptMulti;
+ scriptPubkey1 << ToByteVector(pubkey1) << OP_CHECKSIG;
+ scriptPubkey2 << ToByteVector(pubkey2) << OP_CHECKSIG;
+ scriptPubkey1L << ToByteVector(pubkey1L) << OP_CHECKSIG;
+ scriptPubkey2L << ToByteVector(pubkey2L) << OP_CHECKSIG;
+ std::vector<CPubKey> oneandthree;
+ oneandthree.push_back(pubkey1);
+ oneandthree.push_back(pubkey3);
+ scriptMulti = GetScriptForMultisig(2, oneandthree);
+ keystore.AddCScript(scriptPubkey1);
+ keystore.AddCScript(scriptPubkey2);
+ keystore.AddCScript(scriptPubkey1L);
+ keystore.AddCScript(scriptPubkey2L);
+ keystore.AddCScript(scriptMulti);
+ keystore.AddCScript(GetScriptForWitness(scriptPubkey1));
+ keystore.AddCScript(GetScriptForWitness(scriptPubkey2));
+ keystore.AddCScript(GetScriptForWitness(scriptPubkey1L));
+ keystore.AddCScript(GetScriptForWitness(scriptPubkey2L));
+ keystore.AddCScript(GetScriptForWitness(scriptMulti));
+ keystore2.AddCScript(scriptMulti);
+ keystore2.AddCScript(GetScriptForWitness(scriptMulti));
+ keystore2.AddKeyPubKey(key3, pubkey3);
+
+ CTransaction output1, output2;
+ CMutableTransaction input1, input2;
+ SignatureData sigdata;
+
+ // Normal pay-to-compressed-pubkey.
+ CreateCreditAndSpend(keystore, scriptPubkey1, output1, input1);
+ CreateCreditAndSpend(keystore, scriptPubkey2, output2, input2);
+ CheckWithFlag(output1, input1, 0, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+ CheckWithFlag(output1, input2, 0, false);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
+
+ // P2SH pay-to-compressed-pubkey.
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptPubkey1)), output1, input1);
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptPubkey2)), output2, input2);
+ ReplaceRedeemScript(input2.vin[0].scriptSig, scriptPubkey1);
+ CheckWithFlag(output1, input1, 0, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+ CheckWithFlag(output1, input2, 0, true);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
+
+ // Witness pay-to-compressed-pubkey (v0).
+ CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey1), output1, input1);
+ CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey2), output2, input2);
+ CheckWithFlag(output1, input1, 0, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+ CheckWithFlag(output1, input2, 0, true);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
+
+ // P2SH witness pay-to-compressed-pubkey (v0).
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptPubkey1))), output1, input1);
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptPubkey2))), output2, input2);
+ ReplaceRedeemScript(input2.vin[0].scriptSig, GetScriptForWitness(scriptPubkey1));
+ CheckWithFlag(output1, input1, 0, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+ CheckWithFlag(output1, input2, 0, true);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
+
+ // Normal pay-to-uncompressed-pubkey.
+ CreateCreditAndSpend(keystore, scriptPubkey1L, output1, input1);
+ CreateCreditAndSpend(keystore, scriptPubkey2L, output2, input2);
+ CheckWithFlag(output1, input1, 0, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+ CheckWithFlag(output1, input2, 0, false);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
+
+ // P2SH pay-to-uncompressed-pubkey.
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptPubkey1L)), output1, input1);
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptPubkey2L)), output2, input2);
+ ReplaceRedeemScript(input2.vin[0].scriptSig, scriptPubkey1L);
+ CheckWithFlag(output1, input1, 0, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+ CheckWithFlag(output1, input2, 0, true);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false);
+ CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
+
+ // Signing disabled for witness pay-to-uncompressed-pubkey (v1).
+ CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey1L), output1, input1, false);
+ CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey2L), output2, input2, false);
+
+ // Signing disabled for P2SH witness pay-to-uncompressed-pubkey (v1).
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptPubkey1L))), output1, input1, false);
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptPubkey2L))), output2, input2, false);
+
+ // Normal 2-of-2 multisig
+ CreateCreditAndSpend(keystore, scriptMulti, output1, input1, false);
+ CheckWithFlag(output1, input1, 0, false);
+ CreateCreditAndSpend(keystore2, scriptMulti, output2, input2, false);
+ CheckWithFlag(output2, input2, 0, false);
+ BOOST_CHECK(output1 == output2);
+ UpdateTransaction(input1, 0, CombineSignatures(output1.vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1.vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+
+ // P2SH 2-of-2 multisig
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptMulti)), output1, input1, false);
+ CheckWithFlag(output1, input1, 0, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, false);
+ CreateCreditAndSpend(keystore2, GetScriptForDestination(CScriptID(scriptMulti)), output2, input2, false);
+ CheckWithFlag(output2, input2, 0, true);
+ CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, false);
+ BOOST_CHECK(output1 == output2);
+ UpdateTransaction(input1, 0, CombineSignatures(output1.vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1.vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+
+ // Witness 2-of-2 multisig
+ CreateCreditAndSpend(keystore, GetScriptForWitness(scriptMulti), output1, input1, false);
+ CheckWithFlag(output1, input1, 0, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
+ CreateCreditAndSpend(keystore2, GetScriptForWitness(scriptMulti), output2, input2, false);
+ CheckWithFlag(output2, input2, 0, true);
+ CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
+ BOOST_CHECK(output1 == output2);
+ UpdateTransaction(input1, 0, CombineSignatures(output1.vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1.vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
+
+ // P2SH witness 2-of-2 multisig
+ CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptMulti))), output1, input1, false);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
+ CreateCreditAndSpend(keystore2, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptMulti))), output2, input2, false);
+ CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, true);
+ CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
+ BOOST_CHECK(output1 == output2);
+ UpdateTransaction(input1, 0, CombineSignatures(output1.vout[0].scriptPubKey, MutableTransactionSignatureChecker(&input1, 0, output1.vout[0].nValue), DataFromTransaction(input1, 0), DataFromTransaction(input2, 0)));
+ CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true);
+ CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
}
BOOST_AUTO_TEST_CASE(test_IsStandard)
diff --git a/src/test/txvalidationcache_tests.cpp b/src/test/txvalidationcache_tests.cpp
index 9b8e1c088b..76e4e7a4be 100644
--- a/src/test/txvalidationcache_tests.cpp
+++ b/src/test/txvalidationcache_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -23,7 +23,7 @@ ToMemPool(CMutableTransaction& tx)
LOCK(cs_main);
CValidationState state;
- return AcceptToMemoryPool(mempool, state, tx, false, NULL, true, false);
+ return AcceptToMemoryPool(mempool, state, tx, false, NULL, true, 0);
}
BOOST_FIXTURE_TEST_CASE(tx_mempool_block_doublespend, TestChain100Setup)
@@ -48,7 +48,7 @@ BOOST_FIXTURE_TEST_CASE(tx_mempool_block_doublespend, TestChain100Setup)
// Sign:
std::vector<unsigned char> vchSig;
- uint256 hash = SignatureHash(scriptPubKey, spends[i], 0, SIGHASH_ALL);
+ uint256 hash = SignatureHash(scriptPubKey, spends[i], 0, SIGHASH_ALL, 0, SIGVERSION_BASE);
BOOST_CHECK(coinbaseKey.Sign(hash, vchSig));
vchSig.push_back((unsigned char)SIGHASH_ALL);
spends[i].vin[0].scriptSig << vchSig;
diff --git a/src/test/uint256_tests.cpp b/src/test/uint256_tests.cpp
index 426d296a9a..da0a3d73e0 100644
--- a/src/test/uint256_tests.cpp
+++ b/src/test/uint256_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2013 The Bitcoin Core developers
+// 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 "arith_uint256.h"
diff --git a/src/test/univalue_tests.cpp b/src/test/univalue_tests.cpp
index 945c1acbeb..45d480c816 100644
--- a/src/test/univalue_tests.cpp
+++ b/src/test/univalue_tests.cpp
@@ -1,4 +1,5 @@
// Copyright 2014 BitPay, Inc.
+// 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.
diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp
index 997dc31931..efd4498747 100644
--- a/src/test/util_tests.cpp
+++ b/src/test/util_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2014 The Bitcoin Core developers
+// 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.
@@ -60,6 +60,10 @@ BOOST_AUTO_TEST_CASE(util_ParseHex)
result = ParseHex("12 34 56 78");
BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ // Leading space must be supported (used in CDBEnv::Salvage)
+ result = ParseHex(" 89 34 56 78");
+ BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+
// Stop parsing at invalid value
result = ParseHex("1234 invalid 1234");
BOOST_CHECK(result.size() == 2 && result[0] == 0x12 && result[1] == 0x34);
@@ -196,6 +200,8 @@ BOOST_AUTO_TEST_CASE(util_ParseMoney)
BOOST_CHECK_EQUAL(ret, COIN*10);
BOOST_CHECK(ParseMoney("1.00", ret));
BOOST_CHECK_EQUAL(ret, COIN);
+ BOOST_CHECK(ParseMoney("1", ret));
+ BOOST_CHECK_EQUAL(ret, COIN);
BOOST_CHECK(ParseMoney("0.1", ret));
BOOST_CHECK_EQUAL(ret, COIN/10);
BOOST_CHECK(ParseMoney("0.01", ret));
@@ -215,6 +221,9 @@ BOOST_AUTO_TEST_CASE(util_ParseMoney)
// Attempted 63 bit overflow should fail
BOOST_CHECK(!ParseMoney("92233720368.54775808", ret));
+
+ // Parsing negative amounts must fail
+ BOOST_CHECK(!ParseMoney("-1", ret));
}
BOOST_AUTO_TEST_CASE(util_IsHex)
@@ -234,11 +243,7 @@ BOOST_AUTO_TEST_CASE(util_IsHex)
BOOST_AUTO_TEST_CASE(util_seed_insecure_rand)
{
- int i;
- int count=0;
-
seed_insecure_rand(true);
-
for (int mod=2;mod<11;mod++)
{
int mask = 1;
@@ -247,10 +252,9 @@ BOOST_AUTO_TEST_CASE(util_seed_insecure_rand)
//mask is 2^ceil(log2(mod))-1
while(mask<mod-1)mask=(mask<<1)+1;
- count = 0;
+ int count = 0;
//How often does it get a zero from the uniform range [0,mod)?
- for (i=0;i<10000;i++)
- {
+ for (int i = 0; i < 10000; i++) {
uint32_t rval;
do{
rval=insecure_rand()&mask;
@@ -367,6 +371,69 @@ BOOST_AUTO_TEST_CASE(test_ParseInt64)
BOOST_CHECK(!ParseInt64("32482348723847471234", NULL));
}
+BOOST_AUTO_TEST_CASE(test_ParseUInt32)
+{
+ uint32_t n;
+ // Valid values
+ BOOST_CHECK(ParseUInt32("1234", NULL));
+ BOOST_CHECK(ParseUInt32("0", &n) && n == 0);
+ BOOST_CHECK(ParseUInt32("1234", &n) && n == 1234);
+ BOOST_CHECK(ParseUInt32("01234", &n) && n == 1234); // no octal
+ BOOST_CHECK(ParseUInt32("2147483647", &n) && n == 2147483647);
+ BOOST_CHECK(ParseUInt32("2147483648", &n) && n == (uint32_t)2147483648);
+ BOOST_CHECK(ParseUInt32("4294967295", &n) && n == (uint32_t)4294967295);
+ // Invalid values
+ BOOST_CHECK(!ParseUInt32("", &n));
+ BOOST_CHECK(!ParseUInt32(" 1", &n)); // no padding inside
+ BOOST_CHECK(!ParseUInt32(" -1", &n));
+ BOOST_CHECK(!ParseUInt32("1 ", &n));
+ BOOST_CHECK(!ParseUInt32("1a", &n));
+ BOOST_CHECK(!ParseUInt32("aap", &n));
+ BOOST_CHECK(!ParseUInt32("0x1", &n)); // no hex
+ BOOST_CHECK(!ParseUInt32("0x1", &n)); // no hex
+ const char test_bytes[] = {'1', 0, '1'};
+ std::string teststr(test_bytes, sizeof(test_bytes));
+ BOOST_CHECK(!ParseUInt32(teststr, &n)); // no embedded NULs
+ // Overflow and underflow
+ BOOST_CHECK(!ParseUInt32("-2147483648", &n));
+ BOOST_CHECK(!ParseUInt32("4294967296", &n));
+ BOOST_CHECK(!ParseUInt32("-1234", &n));
+ BOOST_CHECK(!ParseUInt32("-32482348723847471234", NULL));
+ BOOST_CHECK(!ParseUInt32("32482348723847471234", NULL));
+}
+
+BOOST_AUTO_TEST_CASE(test_ParseUInt64)
+{
+ uint64_t n;
+ // Valid values
+ BOOST_CHECK(ParseUInt64("1234", NULL));
+ BOOST_CHECK(ParseUInt64("0", &n) && n == 0LL);
+ BOOST_CHECK(ParseUInt64("1234", &n) && n == 1234LL);
+ BOOST_CHECK(ParseUInt64("01234", &n) && n == 1234LL); // no octal
+ BOOST_CHECK(ParseUInt64("2147483647", &n) && n == 2147483647LL);
+ BOOST_CHECK(ParseUInt64("9223372036854775807", &n) && n == 9223372036854775807ULL);
+ BOOST_CHECK(ParseUInt64("9223372036854775808", &n) && n == 9223372036854775808ULL);
+ BOOST_CHECK(ParseUInt64("18446744073709551615", &n) && n == 18446744073709551615ULL);
+ // Invalid values
+ BOOST_CHECK(!ParseUInt64("", &n));
+ BOOST_CHECK(!ParseUInt64(" 1", &n)); // no padding inside
+ BOOST_CHECK(!ParseUInt64(" -1", &n));
+ BOOST_CHECK(!ParseUInt64("1 ", &n));
+ BOOST_CHECK(!ParseUInt64("1a", &n));
+ BOOST_CHECK(!ParseUInt64("aap", &n));
+ BOOST_CHECK(!ParseUInt64("0x1", &n)); // no hex
+ const char test_bytes[] = {'1', 0, '1'};
+ std::string teststr(test_bytes, sizeof(test_bytes));
+ BOOST_CHECK(!ParseUInt64(teststr, &n)); // no embedded NULs
+ // Overflow and underflow
+ BOOST_CHECK(!ParseUInt64("-9223372036854775809", NULL));
+ BOOST_CHECK(!ParseUInt64("18446744073709551616", NULL));
+ BOOST_CHECK(!ParseUInt64("-32482348723847471234", NULL));
+ BOOST_CHECK(!ParseUInt64("-2147483648", &n));
+ BOOST_CHECK(!ParseUInt64("-9223372036854775808", &n));
+ BOOST_CHECK(!ParseUInt64("-1234", &n));
+}
+
BOOST_AUTO_TEST_CASE(test_ParseDouble)
{
double n;
@@ -399,12 +466,27 @@ BOOST_AUTO_TEST_CASE(test_FormatParagraph)
{
BOOST_CHECK_EQUAL(FormatParagraph("", 79, 0), "");
BOOST_CHECK_EQUAL(FormatParagraph("test", 79, 0), "test");
- BOOST_CHECK_EQUAL(FormatParagraph(" test", 79, 0), "test");
+ BOOST_CHECK_EQUAL(FormatParagraph(" test", 79, 0), " test");
BOOST_CHECK_EQUAL(FormatParagraph("test test", 79, 0), "test test");
BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 0), "test\ntest");
- BOOST_CHECK_EQUAL(FormatParagraph("testerde test ", 4, 0), "testerde\ntest");
+ BOOST_CHECK_EQUAL(FormatParagraph("testerde test", 4, 0), "testerde\ntest");
BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 4), "test\n test");
- BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string. This is a second sentence in the very long test string."), "This is a very long test string. This is a second sentence in the very long\ntest string.");
+
+ // Make sure we don't indent a fully-new line following a too-long line ending
+ BOOST_CHECK_EQUAL(FormatParagraph("test test\nabc", 4, 4), "test\n test\nabc");
+
+ BOOST_CHECK_EQUAL(FormatParagraph("This_is_a_very_long_test_string_without_any_spaces_so_it_should_just_get_returned_as_is_despite_the_length until it gets here", 79), "This_is_a_very_long_test_string_without_any_spaces_so_it_should_just_get_returned_as_is_despite_the_length\nuntil it gets here");
+
+ // Test wrap length is exact
+ BOOST_CHECK_EQUAL(FormatParagraph("a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p", 79), "a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\nf g h i j k l m n o p");
+ BOOST_CHECK_EQUAL(FormatParagraph("x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p", 79), "x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\nf g h i j k l m n o p");
+ // Indent should be included in length of lines
+ BOOST_CHECK_EQUAL(FormatParagraph("x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e fg h i j k", 79, 4), "x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\n f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e fg\n h i j k");
+
+ BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string. This is a second sentence in the very long test string.", 79), "This is a very long test string. This is a second sentence in the very long\ntest string.");
+ BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string.\nThis is a second sentence in the very long test string. This is a third sentence in the very long test string.", 79), "This is a very long test string.\nThis is a second sentence in the very long test string. This is a third\nsentence in the very long test string.");
+ BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string.\n\nThis is a second sentence in the very long test string. This is a third sentence in the very long test string.", 79), "This is a very long test string.\n\nThis is a second sentence in the very long test string. This is a third\nsentence in the very long test string.");
+ BOOST_CHECK_EQUAL(FormatParagraph("Testing that normal newlines do not get indented.\nLike here.", 79), "Testing that normal newlines do not get indented.\nLike here.");
}
BOOST_AUTO_TEST_CASE(test_FormatSubVersion)
diff --git a/src/test/versionbits_tests.cpp b/src/test/versionbits_tests.cpp
new file mode 100644
index 0000000000..1f86a06a3f
--- /dev/null
+++ b/src/test/versionbits_tests.cpp
@@ -0,0 +1,316 @@
+// 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.
+
+#include "chain.h"
+#include "random.h"
+#include "versionbits.h"
+#include "test/test_bitcoin.h"
+#include "chainparams.h"
+#include "main.h"
+#include "consensus/params.h"
+
+#include <boost/test/unit_test.hpp>
+
+/* Define a virtual block time, one block per 10 minutes after Nov 14 2014, 0:55:36am */
+int32_t TestTime(int nHeight) { return 1415926536 + 600 * nHeight; }
+
+static const Consensus::Params paramsDummy = Consensus::Params();
+
+class TestConditionChecker : public AbstractThresholdConditionChecker
+{
+private:
+ mutable ThresholdConditionCache cache;
+
+public:
+ int64_t BeginTime(const Consensus::Params& params) const { return TestTime(10000); }
+ int64_t EndTime(const Consensus::Params& params) const { return TestTime(20000); }
+ int Period(const Consensus::Params& params) const { return 1000; }
+ int Threshold(const Consensus::Params& params) const { return 900; }
+ bool Condition(const CBlockIndex* pindex, const Consensus::Params& params) const { return (pindex->nVersion & 0x100); }
+
+ ThresholdState GetStateFor(const CBlockIndex* pindexPrev) const { return AbstractThresholdConditionChecker::GetStateFor(pindexPrev, paramsDummy, cache); }
+};
+
+#define CHECKERS 6
+
+class VersionBitsTester
+{
+ // A fake blockchain
+ std::vector<CBlockIndex*> vpblock;
+
+ // 6 independent checkers for the same bit.
+ // The first one performs all checks, the second only 50%, the third only 25%, etc...
+ // This is to test whether lack of cached information leads to the same results.
+ TestConditionChecker checker[CHECKERS];
+
+ // Test counter (to identify failures)
+ int num;
+
+public:
+ VersionBitsTester() : num(0) {}
+
+ VersionBitsTester& Reset() {
+ for (unsigned int i = 0; i < vpblock.size(); i++) {
+ delete vpblock[i];
+ }
+ for (unsigned int i = 0; i < CHECKERS; i++) {
+ checker[i] = TestConditionChecker();
+ }
+ vpblock.clear();
+ return *this;
+ }
+
+ ~VersionBitsTester() {
+ Reset();
+ }
+
+ VersionBitsTester& Mine(unsigned int height, int32_t nTime, int32_t nVersion) {
+ while (vpblock.size() < height) {
+ CBlockIndex* pindex = new CBlockIndex();
+ pindex->nHeight = vpblock.size();
+ pindex->pprev = vpblock.size() > 0 ? vpblock.back() : NULL;
+ pindex->nTime = nTime;
+ pindex->nVersion = nVersion;
+ pindex->BuildSkip();
+ vpblock.push_back(pindex);
+ }
+ return *this;
+ }
+
+ VersionBitsTester& TestDefined() {
+ for (int i = 0; i < CHECKERS; i++) {
+ if ((insecure_rand() & ((1 << i) - 1)) == 0) {
+ BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? NULL : vpblock.back()) == THRESHOLD_DEFINED, strprintf("Test %i for DEFINED", num));
+ }
+ }
+ num++;
+ return *this;
+ }
+
+ VersionBitsTester& TestStarted() {
+ for (int i = 0; i < CHECKERS; i++) {
+ if ((insecure_rand() & ((1 << i) - 1)) == 0) {
+ BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? NULL : vpblock.back()) == THRESHOLD_STARTED, strprintf("Test %i for STARTED", num));
+ }
+ }
+ num++;
+ return *this;
+ }
+
+ VersionBitsTester& TestLockedIn() {
+ for (int i = 0; i < CHECKERS; i++) {
+ if ((insecure_rand() & ((1 << i) - 1)) == 0) {
+ BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? NULL : vpblock.back()) == THRESHOLD_LOCKED_IN, strprintf("Test %i for LOCKED_IN", num));
+ }
+ }
+ num++;
+ return *this;
+ }
+
+ VersionBitsTester& TestActive() {
+ for (int i = 0; i < CHECKERS; i++) {
+ if ((insecure_rand() & ((1 << i) - 1)) == 0) {
+ BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? NULL : vpblock.back()) == THRESHOLD_ACTIVE, strprintf("Test %i for ACTIVE", num));
+ }
+ }
+ num++;
+ return *this;
+ }
+
+ VersionBitsTester& TestFailed() {
+ for (int i = 0; i < CHECKERS; i++) {
+ if ((insecure_rand() & ((1 << i) - 1)) == 0) {
+ BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? NULL : vpblock.back()) == THRESHOLD_FAILED, strprintf("Test %i for FAILED", num));
+ }
+ }
+ num++;
+ return *this;
+ }
+
+ CBlockIndex * Tip() { return vpblock.size() ? vpblock.back() : NULL; }
+};
+
+BOOST_FIXTURE_TEST_SUITE(versionbits_tests, TestingSetup)
+
+BOOST_AUTO_TEST_CASE(versionbits_test)
+{
+ for (int i = 0; i < 64; i++) {
+ // DEFINED -> FAILED
+ VersionBitsTester().TestDefined()
+ .Mine(1, TestTime(1), 0x100).TestDefined()
+ .Mine(11, TestTime(11), 0x100).TestDefined()
+ .Mine(989, TestTime(989), 0x100).TestDefined()
+ .Mine(999, TestTime(20000), 0x100).TestDefined()
+ .Mine(1000, TestTime(20000), 0x100).TestFailed()
+ .Mine(1999, TestTime(30001), 0x100).TestFailed()
+ .Mine(2000, TestTime(30002), 0x100).TestFailed()
+ .Mine(2001, TestTime(30003), 0x100).TestFailed()
+ .Mine(2999, TestTime(30004), 0x100).TestFailed()
+ .Mine(3000, TestTime(30005), 0x100).TestFailed()
+
+ // DEFINED -> STARTED -> FAILED
+ .Reset().TestDefined()
+ .Mine(1, TestTime(1), 0).TestDefined()
+ .Mine(1000, TestTime(10000) - 1, 0x100).TestDefined() // One second more and it would be defined
+ .Mine(2000, TestTime(10000), 0x100).TestStarted() // So that's what happens the next period
+ .Mine(2051, TestTime(10010), 0).TestStarted() // 51 old blocks
+ .Mine(2950, TestTime(10020), 0x100).TestStarted() // 899 new blocks
+ .Mine(3000, TestTime(20000), 0).TestFailed() // 50 old blocks (so 899 out of the past 1000)
+ .Mine(4000, TestTime(20010), 0x100).TestFailed()
+
+ // DEFINED -> STARTED -> FAILED while threshold reached
+ .Reset().TestDefined()
+ .Mine(1, TestTime(1), 0).TestDefined()
+ .Mine(1000, TestTime(10000) - 1, 0x101).TestDefined() // One second more and it would be defined
+ .Mine(2000, TestTime(10000), 0x101).TestStarted() // So that's what happens the next period
+ .Mine(2999, TestTime(30000), 0x100).TestStarted() // 999 new blocks
+ .Mine(3000, TestTime(30000), 0x100).TestFailed() // 1 new block (so 1000 out of the past 1000 are new)
+ .Mine(3999, TestTime(30001), 0).TestFailed()
+ .Mine(4000, TestTime(30002), 0).TestFailed()
+ .Mine(14333, TestTime(30003), 0).TestFailed()
+ .Mine(24000, TestTime(40000), 0).TestFailed()
+
+ // DEFINED -> STARTED -> LOCKEDIN at the last minute -> ACTIVE
+ .Reset().TestDefined()
+ .Mine(1, TestTime(1), 0).TestDefined()
+ .Mine(1000, TestTime(10000) - 1, 0x101).TestDefined() // One second more and it would be defined
+ .Mine(2000, TestTime(10000), 0x101).TestStarted() // So that's what happens the next period
+ .Mine(2050, TestTime(10010), 0x200).TestStarted() // 50 old blocks
+ .Mine(2950, TestTime(10020), 0x100).TestStarted() // 900 new blocks
+ .Mine(2999, TestTime(19999), 0x200).TestStarted() // 49 old blocks
+ .Mine(3000, TestTime(29999), 0x200).TestLockedIn() // 1 old block (so 900 out of the past 1000)
+ .Mine(3999, TestTime(30001), 0).TestLockedIn()
+ .Mine(4000, TestTime(30002), 0).TestActive()
+ .Mine(14333, TestTime(30003), 0).TestActive()
+ .Mine(24000, TestTime(40000), 0).TestActive();
+ }
+
+ // Sanity checks of version bit deployments
+ const Consensus::Params &mainnetParams = Params(CBaseChainParams::MAIN).GetConsensus();
+ for (int i=0; i<(int) Consensus::MAX_VERSION_BITS_DEPLOYMENTS; i++) {
+ uint32_t bitmask = VersionBitsMask(mainnetParams, (Consensus::DeploymentPos)i);
+ // Make sure that no deployment tries to set an invalid bit.
+ BOOST_CHECK_EQUAL(bitmask & ~(uint32_t)VERSIONBITS_TOP_MASK, bitmask);
+
+ // Verify that the deployment windows of different deployment using the
+ // same bit are disjoint.
+ // This test may need modification at such time as a new deployment
+ // is proposed that reuses the bit of an activated soft fork, before the
+ // end time of that soft fork. (Alternatively, the end time of that
+ // activated soft fork could be later changed to be earlier to avoid
+ // overlap.)
+ for (int j=i+1; j<(int) Consensus::MAX_VERSION_BITS_DEPLOYMENTS; j++) {
+ if (VersionBitsMask(mainnetParams, (Consensus::DeploymentPos)j) == bitmask) {
+ BOOST_CHECK(mainnetParams.vDeployments[j].nStartTime > mainnetParams.vDeployments[i].nTimeout ||
+ mainnetParams.vDeployments[i].nStartTime > mainnetParams.vDeployments[j].nTimeout);
+ }
+ }
+ }
+}
+
+BOOST_AUTO_TEST_CASE(versionbits_computeblockversion)
+{
+ // Check that ComputeBlockVersion will set the appropriate bit correctly
+ // on mainnet.
+ const Consensus::Params &mainnetParams = Params(CBaseChainParams::MAIN).GetConsensus();
+
+ // Use the TESTDUMMY deployment for testing purposes.
+ int64_t bit = mainnetParams.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit;
+ int64_t nStartTime = mainnetParams.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime;
+ int64_t nTimeout = mainnetParams.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout;
+
+ assert(nStartTime < nTimeout);
+
+ // In the first chain, test that the bit is set by CBV until it has failed.
+ // In the second chain, test the bit is set by CBV while STARTED and
+ // LOCKED-IN, and then no longer set while ACTIVE.
+ VersionBitsTester firstChain, secondChain;
+
+ // Start generating blocks before nStartTime
+ int64_t nTime = nStartTime - 1;
+
+ // Before MedianTimePast of the chain has crossed nStartTime, the bit
+ // should not be set.
+ CBlockIndex *lastBlock = NULL;
+ lastBlock = firstChain.Mine(2016, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ BOOST_CHECK_EQUAL(ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit), 0);
+
+ // Mine 2011 more blocks at the old time, and check that CBV isn't setting the bit yet.
+ for (int i=1; i<2012; i++) {
+ lastBlock = firstChain.Mine(2016+i, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ // This works because VERSIONBITS_LAST_OLD_BLOCK_VERSION happens
+ // to be 4, and the bit we're testing happens to be bit 28.
+ BOOST_CHECK_EQUAL(ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit), 0);
+ }
+ // Now mine 5 more blocks at the start time -- MTP should not have passed yet, so
+ // CBV should still not yet set the bit.
+ nTime = nStartTime;
+ for (int i=2012; i<=2016; i++) {
+ lastBlock = firstChain.Mine(2016+i, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ BOOST_CHECK_EQUAL(ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit), 0);
+ }
+
+ // Advance to the next period and transition to STARTED,
+ lastBlock = firstChain.Mine(6048, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ // so ComputeBlockVersion should now set the bit,
+ BOOST_CHECK((ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit)) != 0);
+ // and should also be using the VERSIONBITS_TOP_BITS.
+ BOOST_CHECK_EQUAL(ComputeBlockVersion(lastBlock, mainnetParams) & VERSIONBITS_TOP_MASK, VERSIONBITS_TOP_BITS);
+
+ // Check that ComputeBlockVersion will set the bit until nTimeout
+ nTime += 600;
+ int blocksToMine = 4032; // test blocks for up to 2 time periods
+ int nHeight = 6048;
+ // These blocks are all before nTimeout is reached.
+ while (nTime < nTimeout && blocksToMine > 0) {
+ lastBlock = firstChain.Mine(nHeight+1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ BOOST_CHECK((ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit)) != 0);
+ BOOST_CHECK_EQUAL(ComputeBlockVersion(lastBlock, mainnetParams) & VERSIONBITS_TOP_MASK, VERSIONBITS_TOP_BITS);
+ blocksToMine--;
+ nTime += 600;
+ nHeight += 1;
+ };
+
+ nTime = nTimeout;
+ // FAILED is only triggered at the end of a period, so CBV should be setting
+ // the bit until the period transition.
+ for (int i=0; i<2015; i++) {
+ lastBlock = firstChain.Mine(nHeight+1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ BOOST_CHECK((ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit)) != 0);
+ nHeight += 1;
+ }
+ // The next block should trigger no longer setting the bit.
+ lastBlock = firstChain.Mine(nHeight+1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ BOOST_CHECK_EQUAL(ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit), 0);
+
+ // On a new chain:
+ // verify that the bit will be set after lock-in, and then stop being set
+ // after activation.
+ nTime = nStartTime;
+
+ // Mine one period worth of blocks, and check that the bit will be on for the
+ // next period.
+ lastBlock = secondChain.Mine(2016, nStartTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ BOOST_CHECK((ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit)) != 0);
+
+ // Mine another period worth of blocks, signaling the new bit.
+ lastBlock = secondChain.Mine(4032, nStartTime, VERSIONBITS_TOP_BITS | (1<<bit)).Tip();
+ // After one period of setting the bit on each block, it should have locked in.
+ // We keep setting the bit for one more period though, until activation.
+ BOOST_CHECK((ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit)) != 0);
+
+ // Now check that we keep mining the block until the end of this period, and
+ // then stop at the beginning of the next period.
+ lastBlock = secondChain.Mine(6047, nStartTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ BOOST_CHECK((ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit)) != 0);
+ lastBlock = secondChain.Mine(6048, nStartTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
+ BOOST_CHECK_EQUAL(ComputeBlockVersion(lastBlock, mainnetParams) & (1<<bit), 0);
+
+ // Finally, verify that after a soft fork has activated, CBV no longer uses
+ // VERSIONBITS_LAST_OLD_BLOCK_VERSION.
+ //BOOST_CHECK_EQUAL(ComputeBlockVersion(lastBlock, mainnetParams) & VERSIONBITS_TOP_MASK, VERSIONBITS_TOP_BITS);
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/threadsafety.h b/src/threadsafety.h
index d01c50abb6..61e63dbc7a 100644
--- a/src/threadsafety.h
+++ b/src/threadsafety.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2012 The Bitcoin Core developers
+// 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.
diff --git a/src/timedata.cpp b/src/timedata.cpp
index 861c375989..25fc494121 100644
--- a/src/timedata.cpp
+++ b/src/timedata.cpp
@@ -1,10 +1,14 @@
-// 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.
+#if defined(HAVE_CONFIG_H)
+#include "config/bitcoin-config.h"
+#endif
+
#include "timedata.h"
-#include "netbase.h"
+#include "netaddress.h"
#include "sync.h"
#include "ui_interface.h"
#include "util.h"
@@ -79,7 +83,7 @@ void AddTimeData(const CNetAddr& ip, int64_t nOffsetSample)
int64_t nMedian = vTimeOffsets.median();
std::vector<int64_t> vSorted = vTimeOffsets.sorted();
// Only let other nodes change our time by so much
- if (abs64(nMedian) < 70 * 60)
+ if (abs64(nMedian) <= std::max<int64_t>(0, GetArg("-maxtimeadjustment", DEFAULT_MAX_TIME_ADJUSTMENT)))
{
nTimeOffset = nMedian;
}
@@ -99,7 +103,7 @@ void AddTimeData(const CNetAddr& ip, int64_t nOffsetSample)
if (!fMatch)
{
fDone = true;
- string strMessage = _("Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.");
+ string strMessage = strprintf(_("Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly."), _(PACKAGE_NAME));
strMiscWarning = strMessage;
uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING);
}
diff --git a/src/timedata.h b/src/timedata.h
index 2296baf11b..9f2499c85c 100644
--- a/src/timedata.h
+++ b/src/timedata.h
@@ -10,6 +10,8 @@
#include <stdint.h>
#include <vector>
+static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60;
+
class CNetAddr;
/**
diff --git a/src/tinyformat.h b/src/tinyformat.h
index 73d49a1fe4..17f0360c42 100644
--- a/src/tinyformat.h
+++ b/src/tinyformat.h
@@ -67,7 +67,9 @@
// weekday, month, day, hour, min);
// std::cout << date;
//
-// These are the three primary interface functions.
+// These are the three primary interface functions. There is also a
+// convenience function printfln() which appends a newline to the usual result
+// of printf() for super simple logging.
//
//
// User defined format functions
@@ -86,6 +88,18 @@
// defined function bodies, use the macro TINYFORMAT_FOREACH_ARGNUM. For an
// example, see the implementation of printf() at the end of the source file.
//
+// Sometimes it's useful to be able to pass a list of format arguments through
+// to a non-template function. The FormatList class is provided as a way to do
+// this by storing the argument list in a type-opaque way. Continuing the
+// example from above, we construct a FormatList using makeFormatList():
+//
+// FormatListRef formatList = tfm::makeFormatList(weekday, month, day, hour, min);
+//
+// The format list can now be passed into any non-template function and used
+// via a call to the vformat() function:
+//
+// tfm::vformat(std::cout, "%s, %s %d, %.2d:%.2d\n", formatList);
+//
//
// Additional API information
// --------------------------
@@ -113,11 +127,12 @@ namespace tfm = tinyformat;
// Define for C++11 variadic templates which make the code shorter & more
// general. If you don't define this, C++11 support is autodetected below.
-// #define TINYFORMAT_USE_VARIADIC_TEMPLATES
+#define TINYFORMAT_USE_VARIADIC_TEMPLATES
//------------------------------------------------------------------------------
// Implementation details.
+#include <algorithm>
#include <cassert>
#include <iostream>
#include <sstream>
@@ -133,20 +148,20 @@ namespace tfm = tinyformat;
# endif
#endif
-#ifdef __GNUC__
-# define TINYFORMAT_NOINLINE __attribute__((noinline))
-#elif defined(_MSC_VER)
-# define TINYFORMAT_NOINLINE __declspec(noinline)
-#else
-# define TINYFORMAT_NOINLINE
-#endif
-
#if defined(__GLIBCXX__) && __GLIBCXX__ < 20080201
// std::showpos is broken on old libstdc++ as provided with OSX. See
// http://gcc.gnu.org/ml/libstdc++/2007-11/msg00075.html
# define TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND
#endif
+#ifdef __APPLE__
+// Workaround OSX linker warning: xcode uses different default symbol
+// visibilities for static libs vs executables (see issue #25)
+# define TINYFORMAT_HIDDEN __attribute__((visibility("hidden")))
+#else
+# define TINYFORMAT_HIDDEN
+#endif
+
namespace tinyformat {
//------------------------------------------------------------------------------
@@ -247,6 +262,29 @@ struct convertToInt<T,true>
static int invoke(const T& value) { return static_cast<int>(value); }
};
+// Format at most ntrunc characters to the given stream.
+template<typename T>
+inline void formatTruncated(std::ostream& out, const T& value, int ntrunc)
+{
+ std::ostringstream tmp;
+ tmp << value;
+ std::string result = tmp.str();
+ out.write(result.c_str(), (std::min)(ntrunc, static_cast<int>(result.size())));
+}
+#define TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(type) \
+inline void formatTruncated(std::ostream& out, type* value, int ntrunc) \
+{ \
+ std::streamsize len = 0; \
+ while(len < ntrunc && value[len] != 0) \
+ ++len; \
+ out.write(value, len); \
+}
+// Overload for const char* and char*. Could overload for signed & unsigned
+// char too, but these are technically unneeded for printf compatibility.
+TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(const char)
+TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(char)
+#undef TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR
+
} // namespace detail
@@ -255,18 +293,20 @@ struct convertToInt<T,true>
// desired.
-// Format a value into a stream. Called from format() for all types by default.
-//
-// Users may override this for their own types. When this function is called,
-// the stream flags will have been modified according to the format string.
-// The format specification is provided in the range [fmtBegin, fmtEnd).
-//
-// By default, formatValue() uses the usual stream insertion operator
-// operator<< to format the type T, with special cases for the %c and %p
-// conversions.
+/// Format a value into a stream, delegating to operator<< by default.
+///
+/// Users may override this for their own types. When this function is called,
+/// the stream flags will have been modified according to the format string.
+/// The format specification is provided in the range [fmtBegin, fmtEnd). For
+/// truncating conversions, ntrunc is set to the desired maximum number of
+/// characters, for example "%.7s" calls formatValue with ntrunc = 7.
+///
+/// By default, formatValue() uses the usual stream insertion operator
+/// operator<< to format the type T, with special cases for the %c and %p
+/// conversions.
template<typename T>
inline void formatValue(std::ostream& out, const char* /*fmtBegin*/,
- const char* fmtEnd, const T& value)
+ const char* fmtEnd, int ntrunc, const T& value)
{
#ifndef TINYFORMAT_ALLOW_WCHAR_STRINGS
// Since we don't support printing of wchar_t using "%ls", make it fail at
@@ -288,6 +328,12 @@ inline void formatValue(std::ostream& out, const char* /*fmtBegin*/,
#ifdef TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND
else if(detail::formatZeroIntegerWorkaround<T>::invoke(out, value)) /**/;
#endif
+ else if(ntrunc >= 0)
+ {
+ // Take care not to overread C strings in truncating conversions like
+ // "%.4s" where at most 4 characters may be read.
+ detail::formatTruncated(out, value, ntrunc);
+ }
else
out << value;
}
@@ -296,7 +342,7 @@ inline void formatValue(std::ostream& out, const char* /*fmtBegin*/,
// Overloaded version for char types to support printing as an integer
#define TINYFORMAT_DEFINE_FORMATVALUE_CHAR(charType) \
inline void formatValue(std::ostream& out, const char* /*fmtBegin*/, \
- const char* fmtEnd, charType value) \
+ const char* fmtEnd, int /**/, charType value) \
{ \
switch(*(fmtEnd-1)) \
{ \
@@ -435,225 +481,91 @@ cog.outl('#define TINYFORMAT_FOREACH_ARGNUM(m) \\\n ' +
namespace detail {
-// Class holding current position in format string and an output stream into
-// which arguments are formatted.
-class FormatIterator
+// Type-opaque holder for an argument to format(), with associated actions on
+// the type held as explicit function pointers. This allows FormatArg's for
+// each argument to be allocated as a homogenous array inside FormatList
+// whereas a naive implementation based on inheritance does not.
+class FormatArg
{
public:
- // Flags for features not representable with standard stream state
- enum ExtraFormatFlags
- {
- Flag_None = 0,
- Flag_TruncateToPrecision = 1<<0, // truncate length to stream precision()
- Flag_SpacePadPositive = 1<<1, // pad positive values with spaces
- Flag_VariableWidth = 1<<2, // variable field width in arg list
- Flag_VariablePrecision = 1<<3 // variable field precision in arg list
- };
-
- // out is the output stream, fmt is the full format string
- FormatIterator(std::ostream& out, const char* fmt)
- : m_out(out),
- m_fmt(fmt),
- m_extraFlags(Flag_None),
- m_wantWidth(false),
- m_wantPrecision(false),
- m_variableWidth(0),
- m_variablePrecision(0),
- m_origWidth(out.width()),
- m_origPrecision(out.precision()),
- m_origFlags(out.flags()),
- m_origFill(out.fill())
+ FormatArg() {}
+
+ template<typename T>
+ FormatArg(const T& value)
+ : m_value(static_cast<const void*>(&value)),
+ m_formatImpl(&formatImpl<T>),
+ m_toIntImpl(&toIntImpl<T>)
{ }
- // Print remaining part of format string.
- void finish()
+ void format(std::ostream& out, const char* fmtBegin,
+ const char* fmtEnd, int ntrunc) const
{
- // It would be nice if we could do this from the destructor, but we
- // can't if TINFORMAT_ERROR is used to throw an exception!
- m_fmt = printFormatStringLiteral(m_out, m_fmt);
- if(*m_fmt != '\0')
- TINYFORMAT_ERROR("tinyformat: Too many conversion specifiers in format string");
+ m_formatImpl(out, fmtBegin, fmtEnd, ntrunc, m_value);
}
- ~FormatIterator()
+ int toInt() const
{
- // Restore stream state
- m_out.width(m_origWidth);
- m_out.precision(m_origPrecision);
- m_out.flags(m_origFlags);
- m_out.fill(m_origFill);
+ return m_toIntImpl(m_value);
}
- template<typename T>
- void accept(const T& value);
-
private:
- // Parse and return an integer from the string c, as atoi()
- // On return, c is set to one past the end of the integer.
- static int parseIntAndAdvance(const char*& c)
+ template<typename T>
+ TINYFORMAT_HIDDEN static void formatImpl(std::ostream& out, const char* fmtBegin,
+ const char* fmtEnd, int ntrunc, const void* value)
{
- int i = 0;
- for(;*c >= '0' && *c <= '9'; ++c)
- i = 10*i + (*c - '0');
- return i;
+ formatValue(out, fmtBegin, fmtEnd, ntrunc, *static_cast<const T*>(value));
}
- // Format at most truncLen characters of a C string to the given
- // stream. Return true if formatting proceeded (generic version always
- // returns false)
template<typename T>
- static bool formatCStringTruncate(std::ostream& /*out*/, const T& /*value*/,
- std::streamsize /*truncLen*/)
+ TINYFORMAT_HIDDEN static int toIntImpl(const void* value)
{
- return false;
- }
-# define TINYFORMAT_DEFINE_FORMAT_C_STRING_TRUNCATE(type) \
- static bool formatCStringTruncate(std::ostream& out, type* value, \
- std::streamsize truncLen) \
- { \
- std::streamsize len = 0; \
- while(len < truncLen && value[len] != 0) \
- ++len; \
- out.write(value, len); \
- return true; \
- }
- // Overload for const char* and char*. Could overload for signed &
- // unsigned char too, but these are technically unneeded for printf
- // compatibility.
- TINYFORMAT_DEFINE_FORMAT_C_STRING_TRUNCATE(const char)
- TINYFORMAT_DEFINE_FORMAT_C_STRING_TRUNCATE(char)
-# undef TINYFORMAT_DEFINE_FORMAT_C_STRING_TRUNCATE
-
- // Print literal part of format string and return next format spec
- // position.
- //
- // Skips over any occurrences of '%%', printing a literal '%' to the
- // output. The position of the first % character of the next
- // nontrivial format spec is returned, or the end of string.
- static const char* printFormatStringLiteral(std::ostream& out,
- const char* fmt)
- {
- const char* c = fmt;
- for(; true; ++c)
- {
- switch(*c)
- {
- case '\0':
- out.write(fmt, static_cast<std::streamsize>(c - fmt));
- return c;
- case '%':
- out.write(fmt, static_cast<std::streamsize>(c - fmt));
- if(*(c+1) != '%')
- return c;
- // for "%%", tack trailing % onto next literal section.
- fmt = ++c;
- break;
- }
- }
+ return convertToInt<T>::invoke(*static_cast<const T*>(value));
}
- static const char* streamStateFromFormat(std::ostream& out,
- unsigned int& extraFlags,
- const char* fmtStart,
- int variableWidth,
- int variablePrecision);
-
- // Private copy & assign: Kill gcc warnings with -Weffc++
- FormatIterator(const FormatIterator&);
- FormatIterator& operator=(const FormatIterator&);
-
- // Stream, current format string & state
- std::ostream& m_out;
- const char* m_fmt;
- unsigned int m_extraFlags;
- // State machine info for handling of variable width & precision
- bool m_wantWidth;
- bool m_wantPrecision;
- int m_variableWidth;
- int m_variablePrecision;
- // Saved stream state
- std::streamsize m_origWidth;
- std::streamsize m_origPrecision;
- std::ios::fmtflags m_origFlags;
- char m_origFill;
+ const void* m_value;
+ void (*m_formatImpl)(std::ostream& out, const char* fmtBegin,
+ const char* fmtEnd, int ntrunc, const void* value);
+ int (*m_toIntImpl)(const void* value);
};
-// Accept a value for formatting into the internal stream.
-template<typename T>
-TINYFORMAT_NOINLINE // < greatly reduces bloat in optimized builds
-void FormatIterator::accept(const T& value)
+// Parse and return an integer from the string c, as atoi()
+// On return, c is set to one past the end of the integer.
+inline int parseIntAndAdvance(const char*& c)
{
- // Parse the format string
- const char* fmtEnd = 0;
- if(m_extraFlags == Flag_None && !m_wantWidth && !m_wantPrecision)
- {
- m_fmt = printFormatStringLiteral(m_out, m_fmt);
- fmtEnd = streamStateFromFormat(m_out, m_extraFlags, m_fmt, 0, 0);
- m_wantWidth = (m_extraFlags & Flag_VariableWidth) != 0;
- m_wantPrecision = (m_extraFlags & Flag_VariablePrecision) != 0;
- }
- // Consume value as variable width and precision specifier if necessary
- if(m_extraFlags & (Flag_VariableWidth | Flag_VariablePrecision))
- {
- if(m_wantWidth || m_wantPrecision)
- {
- int v = convertToInt<T>::invoke(value);
- if(m_wantWidth)
- {
- m_variableWidth = v;
- m_wantWidth = false;
- }
- else if(m_wantPrecision)
- {
- m_variablePrecision = v;
- m_wantPrecision = false;
- }
- return;
- }
- // If we get here, we've set both the variable precision and width as
- // required and we need to rerun the stream state setup to insert these.
- fmtEnd = streamStateFromFormat(m_out, m_extraFlags, m_fmt,
- m_variableWidth, m_variablePrecision);
- }
+ int i = 0;
+ for(;*c >= '0' && *c <= '9'; ++c)
+ i = 10*i + (*c - '0');
+ return i;
+}
- // Format the value into the stream.
- if(!(m_extraFlags & (Flag_SpacePadPositive | Flag_TruncateToPrecision)))
- formatValue(m_out, m_fmt, fmtEnd, value);
- else
+// Print literal part of format string and return next format spec
+// position.
+//
+// Skips over any occurrences of '%%', printing a literal '%' to the
+// output. The position of the first % character of the next
+// nontrivial format spec is returned, or the end of string.
+inline const char* printFormatStringLiteral(std::ostream& out, const char* fmt)
+{
+ const char* c = fmt;
+ for(;; ++c)
{
- // The following are special cases where there's no direct
- // correspondence between stream formatting and the printf() behaviour.
- // Instead, we simulate the behaviour crudely by formatting into a
- // temporary string stream and munging the resulting string.
- std::ostringstream tmpStream;
- tmpStream.copyfmt(m_out);
- if(m_extraFlags & Flag_SpacePadPositive)
- tmpStream.setf(std::ios::showpos);
- // formatCStringTruncate is required for truncating conversions like
- // "%.4s" where at most 4 characters of the c-string should be read.
- // If we didn't include this special case, we might read off the end.
- if(!( (m_extraFlags & Flag_TruncateToPrecision) &&
- formatCStringTruncate(tmpStream, value, m_out.precision()) ))
- {
- // Not a truncated c-string; just format normally.
- formatValue(tmpStream, m_fmt, fmtEnd, value);
- }
- std::string result = tmpStream.str(); // allocates... yuck.
- if(m_extraFlags & Flag_SpacePadPositive)
+ switch(*c)
{
- for(size_t i = 0, iend = result.size(); i < iend; ++i)
- if(result[i] == '+')
- result[i] = ' ';
+ case '\0':
+ out.write(fmt, c - fmt);
+ return c;
+ case '%':
+ out.write(fmt, c - fmt);
+ if(*(c+1) != '%')
+ return c;
+ // for "%%", tack trailing % onto next literal section.
+ fmt = ++c;
+ break;
+ default:
+ break;
}
- if((m_extraFlags & Flag_TruncateToPrecision) &&
- (int)result.size() > (int)m_out.precision())
- m_out.write(result.c_str(), m_out.precision());
- else
- m_out << result;
}
- m_extraFlags = Flag_None;
- m_fmt = fmtEnd;
}
@@ -663,13 +575,14 @@ void FormatIterator::accept(const T& value)
// with the form "%[flags][width][.precision][length]type".
//
// Formatting options which can't be natively represented using the ostream
-// state are returned in the extraFlags parameter which is a bitwise
-// combination of values from the ExtraFormatFlags enum.
-inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
- unsigned int& extraFlags,
- const char* fmtStart,
- int variableWidth,
- int variablePrecision)
+// state are returned in spacePadPositive (for space padded positive numbers)
+// and ntrunc (for truncating conversions). argIndex is incremented if
+// necessary to pull out variable width and precision . The function returns a
+// pointer to the character after the end of the current format spec.
+inline const char* streamStateFromFormat(std::ostream& out, bool& spacePadPositive,
+ int& ntrunc, const char* fmtStart,
+ const detail::FormatArg* formatters,
+ int& argIndex, int numFormatters)
{
if(*fmtStart != '%')
{
@@ -684,9 +597,9 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
out.unsetf(std::ios::adjustfield | std::ios::basefield |
std::ios::floatfield | std::ios::showbase | std::ios::boolalpha |
std::ios::showpoint | std::ios::showpos | std::ios::uppercase);
- extraFlags = Flag_None;
bool precisionSet = false;
bool widthSet = false;
+ int widthExtra = 0;
const char* c = fmtStart + 1;
// 1) Parse flags
for(;; ++c)
@@ -713,12 +626,15 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
case ' ':
// overridden by show positive sign, '+' flag.
if(!(out.flags() & std::ios::showpos))
- extraFlags |= Flag_SpacePadPositive;
+ spacePadPositive = true;
continue;
case '+':
out.setf(std::ios::showpos);
- extraFlags &= ~Flag_SpacePadPositive;
+ spacePadPositive = false;
+ widthExtra = 1;
continue;
+ default:
+ break;
}
break;
}
@@ -731,15 +647,19 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
if(*c == '*')
{
widthSet = true;
- if(variableWidth < 0)
+ int width = 0;
+ if(argIndex < numFormatters)
+ width = formatters[argIndex++].toInt();
+ else
+ TINYFORMAT_ERROR("tinyformat: Not enough arguments to read variable width");
+ if(width < 0)
{
// negative widths correspond to '-' flag set
out.fill(' ');
out.setf(std::ios::left, std::ios::adjustfield);
- variableWidth = -variableWidth;
+ width = -width;
}
- out.width(variableWidth);
- extraFlags |= Flag_VariableWidth;
+ out.width(width);
++c;
}
// 3) Parse precision
@@ -750,8 +670,10 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
if(*c == '*')
{
++c;
- extraFlags |= Flag_VariablePrecision;
- precision = variablePrecision;
+ if(argIndex < numFormatters)
+ precision = formatters[argIndex++].toInt();
+ else
+ TINYFORMAT_ERROR("tinyformat: Not enough arguments to read variable precision");
}
else
{
@@ -814,7 +736,7 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
break;
case 's':
if(precisionSet)
- extraFlags |= Flag_TruncateToPrecision;
+ ntrunc = static_cast<int>(out.precision());
// Make %s print booleans as "true" and "false"
out.setf(std::ios::boolalpha);
break;
@@ -826,6 +748,8 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
TINYFORMAT_ERROR("tinyformat: Conversion spec incorrectly "
"terminated by end of string");
return c;
+ default:
+ break;
}
if(intConversion && precisionSet && !widthSet)
{
@@ -833,7 +757,7 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
// padded with zeros on the left). This isn't really supported by the
// iostreams, but we can approximately simulate it with the width if
// the width isn't otherwise used.
- out.width(out.precision());
+ out.width(out.precision() + widthExtra);
out.setf(std::ios::internal, std::ios::adjustfield);
out.fill('0');
}
@@ -841,170 +765,282 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out,
}
-
//------------------------------------------------------------------------------
-// Private format function on top of which the public interface is implemented.
-// We enforce a mimimum of one value to be formatted to prevent bugs looking like
-//
-// const char* myStr = "100% broken";
-// printf(myStr); // Parses % as a format specifier
-#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES
-
-template<typename T1>
-void format(FormatIterator& fmtIter, const T1& value1)
+inline void formatImpl(std::ostream& out, const char* fmt,
+ const detail::FormatArg* formatters,
+ int numFormatters)
{
- fmtIter.accept(value1);
- fmtIter.finish();
+ // Saved stream state
+ std::streamsize origWidth = out.width();
+ std::streamsize origPrecision = out.precision();
+ std::ios::fmtflags origFlags = out.flags();
+ char origFill = out.fill();
+
+ for (int argIndex = 0; argIndex < numFormatters; ++argIndex)
+ {
+ // Parse the format string
+ fmt = printFormatStringLiteral(out, fmt);
+ bool spacePadPositive = false;
+ int ntrunc = -1;
+ const char* fmtEnd = streamStateFromFormat(out, spacePadPositive, ntrunc, fmt,
+ formatters, argIndex, numFormatters);
+ if (argIndex >= numFormatters)
+ {
+ // Check args remain after reading any variable width/precision
+ TINYFORMAT_ERROR("tinyformat: Not enough format arguments");
+ return;
+ }
+ const FormatArg& arg = formatters[argIndex];
+ // Format the arg into the stream.
+ if(!spacePadPositive)
+ arg.format(out, fmt, fmtEnd, ntrunc);
+ else
+ {
+ // The following is a special case with no direct correspondence
+ // between stream formatting and the printf() behaviour. Simulate
+ // it crudely by formatting into a temporary string stream and
+ // munging the resulting string.
+ std::ostringstream tmpStream;
+ tmpStream.copyfmt(out);
+ tmpStream.setf(std::ios::showpos);
+ arg.format(tmpStream, fmt, fmtEnd, ntrunc);
+ std::string result = tmpStream.str(); // allocates... yuck.
+ for(size_t i = 0, iend = result.size(); i < iend; ++i)
+ if(result[i] == '+') result[i] = ' ';
+ out << result;
+ }
+ fmt = fmtEnd;
+ }
+
+ // Print remaining part of format string.
+ fmt = printFormatStringLiteral(out, fmt);
+ if(*fmt != '\0')
+ TINYFORMAT_ERROR("tinyformat: Too many conversion specifiers in format string");
+
+ // Restore stream state
+ out.width(origWidth);
+ out.precision(origPrecision);
+ out.flags(origFlags);
+ out.fill(origFill);
}
-// General version for C++11
-template<typename T1, typename... Args>
-void format(FormatIterator& fmtIter, const T1& value1, const Args&... args)
+} // namespace detail
+
+
+/// List of template arguments format(), held in a type-opaque way.
+///
+/// A const reference to FormatList (typedef'd as FormatListRef) may be
+/// conveniently used to pass arguments to non-template functions: All type
+/// information has been stripped from the arguments, leaving just enough of a
+/// common interface to perform formatting as required.
+class FormatList
{
- fmtIter.accept(value1);
- format(fmtIter, args...);
-}
+ public:
+ FormatList(detail::FormatArg* formatters, int N)
+ : m_formatters(formatters), m_N(N) { }
-#else
+ friend void vformat(std::ostream& out, const char* fmt,
+ const FormatList& list);
-inline void format(FormatIterator& fmtIter)
+ private:
+ const detail::FormatArg* m_formatters;
+ int m_N;
+};
+
+/// Reference to type-opaque format list for passing to vformat()
+typedef const FormatList& FormatListRef;
+
+
+namespace detail {
+
+// Format list subclass with fixed storage to avoid dynamic allocation
+template<int N>
+class FormatListN : public FormatList
{
- fmtIter.finish();
-}
+ public:
+#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES
+ template<typename... Args>
+ FormatListN(const Args&... args)
+ : FormatList(&m_formatterStore[0], N),
+ m_formatterStore { FormatArg(args)... }
+ { static_assert(sizeof...(args) == N, "Number of args must be N"); }
+#else // C++98 version
+ void init(int) {}
+# define TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR(n) \
+ \
+ template<TINYFORMAT_ARGTYPES(n)> \
+ FormatListN(TINYFORMAT_VARARGS(n)) \
+ : FormatList(&m_formatterStore[0], n) \
+ { assert(n == N); init(0, TINYFORMAT_PASSARGS(n)); } \
+ \
+ template<TINYFORMAT_ARGTYPES(n)> \
+ void init(int i, TINYFORMAT_VARARGS(n)) \
+ { \
+ m_formatterStore[i] = FormatArg(v1); \
+ init(i+1 TINYFORMAT_PASSARGS_TAIL(n)); \
+ }
-// General version for C++98
-#define TINYFORMAT_MAKE_FORMAT_DETAIL(n) \
-template<TINYFORMAT_ARGTYPES(n)> \
-void format(detail::FormatIterator& fmtIter, TINYFORMAT_VARARGS(n)) \
-{ \
- fmtIter.accept(v1); \
- format(fmtIter TINYFORMAT_PASSARGS_TAIL(n)); \
-}
+ TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR)
+# undef TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR
+#endif
-TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMAT_DETAIL)
-#undef TINYFORMAT_MAKE_FORMAT_DETAIL
+ private:
+ FormatArg m_formatterStore[N];
+};
-#endif // End C++98 variadic template emulation for format()
+// Special 0-arg version - MSVC says zero-sized C array in struct is nonstandard
+template<> class FormatListN<0> : public FormatList
+{
+ public: FormatListN() : FormatList(0, 0) {}
+};
} // namespace detail
//------------------------------------------------------------------------------
-// Implement all the main interface functions here in terms of detail::format()
+// Primary API functions
#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES
-// C++11 - the simple case
-template<typename T1, typename... Args>
-void format(std::ostream& out, const char* fmt, const T1& v1, const Args&... args)
+/// Make type-agnostic format list from list of template arguments.
+///
+/// The exact return type of this function is an implementation detail and
+/// shouldn't be relied upon. Instead it should be stored as a FormatListRef:
+///
+/// FormatListRef formatList = makeFormatList( /*...*/ );
+template<typename... Args>
+detail::FormatListN<sizeof...(Args)> makeFormatList(const Args&... args)
{
- detail::FormatIterator fmtIter(out, fmt);
- format(fmtIter, v1, args...);
+ return detail::FormatListN<sizeof...(args)>(args...);
}
-template<typename T1, typename... Args>
-std::string format(const char* fmt, const T1& v1, const Args&... args)
+#else // C++98 version
+
+inline detail::FormatListN<0> makeFormatList()
+{
+ return detail::FormatListN<0>();
+}
+#define TINYFORMAT_MAKE_MAKEFORMATLIST(n) \
+template<TINYFORMAT_ARGTYPES(n)> \
+detail::FormatListN<n> makeFormatList(TINYFORMAT_VARARGS(n)) \
+{ \
+ return detail::FormatListN<n>(TINYFORMAT_PASSARGS(n)); \
+}
+TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_MAKEFORMATLIST)
+#undef TINYFORMAT_MAKE_MAKEFORMATLIST
+
+#endif
+
+/// Format list of arguments to the stream according to the given format string.
+///
+/// The name vformat() is chosen for the semantic similarity to vprintf(): the
+/// list of format arguments is held in a single function argument.
+inline void vformat(std::ostream& out, const char* fmt, FormatListRef list)
+{
+ detail::formatImpl(out, fmt, list.m_formatters, list.m_N);
+}
+
+
+#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES
+
+/// Format list of arguments to the stream according to given format string.
+template<typename... Args>
+void format(std::ostream& out, const char* fmt, const Args&... args)
+{
+ vformat(out, fmt, makeFormatList(args...));
+}
+
+/// Format list of arguments according to the given format string and return
+/// the result as a string.
+template<typename... Args>
+std::string format(const char* fmt, const Args&... args)
{
std::ostringstream oss;
- format(oss, fmt, v1, args...);
+ format(oss, fmt, args...);
return oss.str();
}
-template<typename T1, typename... Args>
-std::string format(const std::string &fmt, const T1& v1, const Args&... args)
+/// Format list of arguments to std::cout, according to the given format string
+template<typename... Args>
+void printf(const char* fmt, const Args&... args)
+{
+ format(std::cout, fmt, args...);
+}
+
+template<typename... Args>
+void printfln(const char* fmt, const Args&... args)
+{
+ format(std::cout, fmt, args...);
+ std::cout << '\n';
+}
+
+#else // C++98 version
+
+inline void format(std::ostream& out, const char* fmt)
+{
+ vformat(out, fmt, makeFormatList());
+}
+
+inline std::string format(const char* fmt)
{
std::ostringstream oss;
- format(oss, fmt.c_str(), v1, args...);
+ format(oss, fmt);
return oss.str();
}
-template<typename T1, typename... Args>
-void printf(const char* fmt, const T1& v1, const Args&... args)
+inline void printf(const char* fmt)
{
- format(std::cout, fmt, v1, args...);
+ format(std::cout, fmt);
}
-#else
+inline void printfln(const char* fmt)
+{
+ format(std::cout, fmt);
+ std::cout << '\n';
+}
-// C++98 - define the interface functions using the wrapping macros
#define TINYFORMAT_MAKE_FORMAT_FUNCS(n) \
\
template<TINYFORMAT_ARGTYPES(n)> \
void format(std::ostream& out, const char* fmt, TINYFORMAT_VARARGS(n)) \
{ \
- tinyformat::detail::FormatIterator fmtIter(out, fmt); \
- tinyformat::detail::format(fmtIter, TINYFORMAT_PASSARGS(n)); \
+ vformat(out, fmt, makeFormatList(TINYFORMAT_PASSARGS(n))); \
} \
\
template<TINYFORMAT_ARGTYPES(n)> \
std::string format(const char* fmt, TINYFORMAT_VARARGS(n)) \
{ \
std::ostringstream oss; \
- tinyformat::format(oss, fmt, TINYFORMAT_PASSARGS(n)); \
+ format(oss, fmt, TINYFORMAT_PASSARGS(n)); \
return oss.str(); \
} \
\
template<TINYFORMAT_ARGTYPES(n)> \
-std::string format(const std::string &fmt, TINYFORMAT_VARARGS(n)) \
+void printf(const char* fmt, TINYFORMAT_VARARGS(n)) \
{ \
- std::ostringstream oss; \
- tinyformat::format(oss, fmt.c_str(), TINYFORMAT_PASSARGS(n)); \
- return oss.str(); \
+ format(std::cout, fmt, TINYFORMAT_PASSARGS(n)); \
} \
\
template<TINYFORMAT_ARGTYPES(n)> \
-void printf(const char* fmt, TINYFORMAT_VARARGS(n)) \
+void printfln(const char* fmt, TINYFORMAT_VARARGS(n)) \
{ \
- tinyformat::format(std::cout, fmt, TINYFORMAT_PASSARGS(n)); \
+ format(std::cout, fmt, TINYFORMAT_PASSARGS(n)); \
+ std::cout << '\n'; \
}
TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMAT_FUNCS)
#undef TINYFORMAT_MAKE_FORMAT_FUNCS
-#endif
-
-//------------------------------------------------------------------------------
-// Define deprecated wrapping macro for backward compatibility in tinyformat
-// 1.x. Will be removed in version 2!
-#define TINYFORMAT_WRAP_FORMAT_EXTRA_ARGS
-#define TINYFORMAT_WRAP_FORMAT_N(n, returnType, funcName, funcDeclSuffix, \
- bodyPrefix, streamName, bodySuffix) \
-template<TINYFORMAT_ARGTYPES(n)> \
-returnType funcName(TINYFORMAT_WRAP_FORMAT_EXTRA_ARGS const char* fmt, \
- TINYFORMAT_VARARGS(n)) funcDeclSuffix \
-{ \
- bodyPrefix \
- tinyformat::format(streamName, fmt, TINYFORMAT_PASSARGS(n)); \
- bodySuffix \
-} \
-
-#define TINYFORMAT_WRAP_FORMAT(returnType, funcName, funcDeclSuffix, \
- bodyPrefix, streamName, bodySuffix) \
-inline \
-returnType funcName(TINYFORMAT_WRAP_FORMAT_EXTRA_ARGS const char* fmt \
- ) funcDeclSuffix \
-{ \
- bodyPrefix \
- tinyformat::detail::FormatIterator(streamName, fmt).finish(); \
- bodySuffix \
-} \
-TINYFORMAT_WRAP_FORMAT_N(1 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(2 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(3 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(4 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(5 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(6 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(7 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(8 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(9 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(10, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(11, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(12, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(13, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(14, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(15, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
-TINYFORMAT_WRAP_FORMAT_N(16, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \
+#endif
+// Added for Bitcoin Core
+template<typename... Args>
+std::string format(const std::string &fmt, const Args&... args)
+{
+ std::ostringstream oss;
+ format(oss, fmt.c_str(), args...);
+ return oss.str();
+}
} // namespace tinyformat
diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp
index 8eccc81e30..1ca6b46566 100644
--- a/src/torcontrol.cpp
+++ b/src/torcontrol.cpp
@@ -1,5 +1,10 @@
+// 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 "torcontrol.h"
#include "utilstrencodings.h"
+#include "netbase.h"
#include "net.h"
#include "util.h"
#include "crypto/hmac_sha256.h"
@@ -79,7 +84,7 @@ public:
/**
* Connect to a Tor control port.
* target is address of the form host:port.
- * connected is the handler that is called when connection is succesfully established.
+ * connected is the handler that is called when connection is successfully established.
* disconnected is a handler that is called when the connection is broken.
* Return true on success.
*/
@@ -117,8 +122,8 @@ private:
static void eventcb(struct bufferevent *bev, short what, void *ctx);
};
-TorControlConnection::TorControlConnection(struct event_base *base):
- base(base), b_conn(0)
+TorControlConnection::TorControlConnection(struct event_base *_base):
+ base(_base), b_conn(0)
{
}
@@ -177,7 +182,7 @@ void TorControlConnection::eventcb(struct bufferevent *bev, short what, void *ct
{
TorControlConnection *self = (TorControlConnection*)ctx;
if (what & BEV_EVENT_CONNECTED) {
- LogPrint("tor", "tor: Succesfully connected!\n");
+ LogPrint("tor", "tor: Successfully connected!\n");
self->connected(*self);
} else if (what & (BEV_EVENT_EOF|BEV_EVENT_ERROR)) {
if (what & BEV_EVENT_ERROR)
@@ -189,7 +194,7 @@ void TorControlConnection::eventcb(struct bufferevent *bev, short what, void *ct
}
}
-bool TorControlConnection::Connect(const std::string &target, const ConnectionCB& connected, const ConnectionCB& disconnected)
+bool TorControlConnection::Connect(const std::string &target, const ConnectionCB& _connected, const ConnectionCB& _disconnected)
{
if (b_conn)
Disconnect();
@@ -208,8 +213,8 @@ bool TorControlConnection::Connect(const std::string &target, const ConnectionCB
return false;
bufferevent_setcb(b_conn, TorControlConnection::readcb, NULL, TorControlConnection::eventcb, this);
bufferevent_enable(b_conn, EV_READ|EV_WRITE);
- this->connected = connected;
- this->disconnected = disconnected;
+ this->connected = _connected;
+ this->disconnected = _disconnected;
// Finally, connect to target
if (bufferevent_socket_connect(b_conn, (struct sockaddr*)&connect_to_addr, connect_to_addrlen) < 0) {
@@ -303,7 +308,7 @@ static std::map<std::string,std::string> ParseTorReplyMapping(const std::string
/** Read full contents of a file and return them in a std::string.
* Returns a pair <status, string>.
- * If an error occured, status will be false, otherwise status will be true and the data will be returned in string.
+ * If an error occurred, status will be false, otherwise status will be true and the data will be returned in string.
*
* @param maxsize Puts a maximum size limit on the file that is read. If the file is larger than this, truncated data
* (with len > maxsize) will be returned.
@@ -380,7 +385,7 @@ private:
void authchallenge_cb(TorControlConnection& conn, const TorControlReply& reply);
/** Callback for PROTOCOLINFO result */
void protocolinfo_cb(TorControlConnection& conn, const TorControlReply& reply);
- /** Callback after succesful connection */
+ /** Callback after successful connection */
void connected_cb(TorControlConnection& conn);
/** Callback after connection lost or failed connection attempt */
void disconnected_cb(TorControlConnection& conn);
@@ -389,15 +394,18 @@ private:
static void reconnect_cb(evutil_socket_t fd, short what, void *arg);
};
-TorController::TorController(struct event_base* base, const std::string& target):
- base(base),
- target(target), conn(base), reconnect(true), reconnect_ev(0),
+TorController::TorController(struct event_base* _base, const std::string& _target):
+ base(_base),
+ target(_target), conn(base), reconnect(true), reconnect_ev(0),
reconnect_timeout(RECONNECT_TIMEOUT_START)
{
+ reconnect_ev = event_new(base, -1, 0, reconnect_cb, this);
+ if (!reconnect_ev)
+ LogPrintf("tor: Failed to create event for reconnection: out of memory?\n");
// Start connection attempts immediately
- if (!conn.Connect(target, boost::bind(&TorController::connected_cb, this, _1),
+ if (!conn.Connect(_target, boost::bind(&TorController::connected_cb, this, _1),
boost::bind(&TorController::disconnected_cb, this, _1) )) {
- LogPrintf("tor: Initiating connection to Tor control port %s failed\n", target);
+ LogPrintf("tor: Initiating connection to Tor control port %s failed\n", _target);
}
// Read service private key if cached
std::pair<bool,std::string> pkf = ReadBinaryFile(GetPrivateKeyFile());
@@ -409,17 +417,19 @@ TorController::TorController(struct event_base* base, const std::string& target)
TorController::~TorController()
{
- if (reconnect_ev)
- event_del(reconnect_ev);
+ if (reconnect_ev) {
+ event_free(reconnect_ev);
+ reconnect_ev = 0;
+ }
if (service.IsValid()) {
RemoveLocal(service);
}
}
-void TorController::add_onion_cb(TorControlConnection& conn, const TorControlReply& reply)
+void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint("tor", "tor: ADD_ONION succesful\n");
+ LogPrint("tor", "tor: ADD_ONION successful\n");
BOOST_FOREACH(const std::string &s, reply.lines) {
std::map<std::string,std::string> m = ParseTorReplyMapping(s);
std::map<std::string,std::string>::iterator i;
@@ -428,9 +438,8 @@ void TorController::add_onion_cb(TorControlConnection& conn, const TorControlRep
if ((i = m.find("PrivateKey")) != m.end())
private_key = i->second;
}
-
- service = CService(service_id+".onion", GetListenPort(), false);
- LogPrintf("tor: Got service ID %s, advertizing service %s\n", service_id, service.ToString());
+ service = LookupNumeric(std::string(service_id+".onion").c_str(), GetListenPort());
+ LogPrintf("tor: Got service ID %s, advertising service %s\n", service_id, service.ToString());
if (WriteBinaryFile(GetPrivateKeyFile(), private_key)) {
LogPrint("tor", "tor: Cached service private key to %s\n", GetPrivateKeyFile());
} else {
@@ -445,17 +454,18 @@ void TorController::add_onion_cb(TorControlConnection& conn, const TorControlRep
}
}
-void TorController::auth_cb(TorControlConnection& conn, const TorControlReply& reply)
+void TorController::auth_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint("tor", "tor: Authentication succesful\n");
+ LogPrint("tor", "tor: Authentication successful\n");
// Now that we know Tor is running setup the proxy for onion addresses
// if -onion isn't set to something else.
if (GetArg("-onion", "") == "") {
- proxyType addrOnion = proxyType(CService("127.0.0.1", 9050), true);
+ CService resolved(LookupNumeric("127.0.0.1", 9050));
+ proxyType addrOnion = proxyType(resolved, true);
SetProxy(NET_TOR, addrOnion);
- SetReachable(NET_TOR);
+ SetLimited(NET_TOR, false);
}
// Finally - now create the service
@@ -464,7 +474,7 @@ void TorController::auth_cb(TorControlConnection& conn, const TorControlReply& r
// Request hidden service, redirect port.
// Note that the 'virtual' port doesn't have to be the same as our internal port, but this is just a convenient
// choice. TODO; refactor the shutdown sequence some day.
- conn.Command(strprintf("ADD_ONION %s Port=%i,127.0.0.1:%i", private_key, GetListenPort(), GetListenPort()),
+ _conn.Command(strprintf("ADD_ONION %s Port=%i,127.0.0.1:%i", private_key, GetListenPort(), GetListenPort()),
boost::bind(&TorController::add_onion_cb, this, _1, _2));
} else {
LogPrintf("tor: Authentication failed\n");
@@ -498,10 +508,10 @@ static std::vector<uint8_t> ComputeResponse(const std::string &key, const std::v
return computedHash;
}
-void TorController::authchallenge_cb(TorControlConnection& conn, const TorControlReply& reply)
+void TorController::authchallenge_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint("tor", "tor: SAFECOOKIE authentication challenge succesful\n");
+ LogPrint("tor", "tor: SAFECOOKIE authentication challenge successful\n");
std::pair<std::string,std::string> l = SplitTorReplyLine(reply.lines[0]);
if (l.first == "AUTHCHALLENGE") {
std::map<std::string,std::string> m = ParseTorReplyMapping(l.second);
@@ -520,7 +530,7 @@ void TorController::authchallenge_cb(TorControlConnection& conn, const TorContro
}
std::vector<uint8_t> computedClientHash = ComputeResponse(TOR_SAFE_CLIENTKEY, cookie, clientNonce, serverNonce);
- conn.Command("AUTHENTICATE " + HexStr(computedClientHash), boost::bind(&TorController::auth_cb, this, _1, _2));
+ _conn.Command("AUTHENTICATE " + HexStr(computedClientHash), boost::bind(&TorController::auth_cb, this, _1, _2));
} else {
LogPrintf("tor: Invalid reply to AUTHCHALLENGE\n");
}
@@ -529,7 +539,7 @@ void TorController::authchallenge_cb(TorControlConnection& conn, const TorContro
}
}
-void TorController::protocolinfo_cb(TorControlConnection& conn, const TorControlReply& reply)
+void TorController::protocolinfo_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
std::set<std::string> methods;
@@ -565,19 +575,27 @@ void TorController::protocolinfo_cb(TorControlConnection& conn, const TorControl
* password: "password"
*/
std::string torpassword = GetArg("-torpassword", "");
- if (methods.count("NULL")) {
+ if (!torpassword.empty()) {
+ if (methods.count("HASHEDPASSWORD")) {
+ LogPrint("tor", "tor: Using HASHEDPASSWORD authentication\n");
+ boost::replace_all(torpassword, "\"", "\\\"");
+ _conn.Command("AUTHENTICATE \"" + torpassword + "\"", boost::bind(&TorController::auth_cb, this, _1, _2));
+ } else {
+ LogPrintf("tor: Password provided with -torpassword, but HASHEDPASSWORD authentication is not available\n");
+ }
+ } else if (methods.count("NULL")) {
LogPrint("tor", "tor: Using NULL authentication\n");
- conn.Command("AUTHENTICATE", boost::bind(&TorController::auth_cb, this, _1, _2));
+ _conn.Command("AUTHENTICATE", boost::bind(&TorController::auth_cb, this, _1, _2));
} else if (methods.count("SAFECOOKIE")) {
// Cookie: hexdump -e '32/1 "%02x""\n"' ~/.tor/control_auth_cookie
LogPrint("tor", "tor: Using SAFECOOKIE authentication, reading cookie authentication from %s\n", cookiefile);
std::pair<bool,std::string> status_cookie = ReadBinaryFile(cookiefile, TOR_COOKIE_SIZE);
if (status_cookie.first && status_cookie.second.size() == TOR_COOKIE_SIZE) {
- // conn.Command("AUTHENTICATE " + HexStr(status_cookie.second), boost::bind(&TorController::auth_cb, this, _1, _2));
+ // _conn.Command("AUTHENTICATE " + HexStr(status_cookie.second), boost::bind(&TorController::auth_cb, this, _1, _2));
cookie = std::vector<uint8_t>(status_cookie.second.begin(), status_cookie.second.end());
clientNonce = std::vector<uint8_t>(TOR_NONCE_SIZE, 0);
GetRandBytes(&clientNonce[0], TOR_NONCE_SIZE);
- conn.Command("AUTHCHALLENGE SAFECOOKIE " + HexStr(clientNonce), boost::bind(&TorController::authchallenge_cb, this, _1, _2));
+ _conn.Command("AUTHCHALLENGE SAFECOOKIE " + HexStr(clientNonce), boost::bind(&TorController::authchallenge_cb, this, _1, _2));
} else {
if (status_cookie.first) {
LogPrintf("tor: Authentication cookie %s is not exactly %i bytes, as is required by the spec\n", cookiefile, TOR_COOKIE_SIZE);
@@ -586,13 +604,7 @@ void TorController::protocolinfo_cb(TorControlConnection& conn, const TorControl
}
}
} else if (methods.count("HASHEDPASSWORD")) {
- if (!torpassword.empty()) {
- LogPrint("tor", "tor: Using HASHEDPASSWORD authentication\n");
- boost::replace_all(torpassword, "\"", "\\\"");
- conn.Command("AUTHENTICATE \"" + torpassword + "\"", boost::bind(&TorController::auth_cb, this, _1, _2));
- } else {
- LogPrintf("tor: Password authentication required, but no password provided with -torpassword\n");
- }
+ LogPrintf("tor: The only supported authentication mechanism left is password, but no password provided with -torpassword\n");
} else {
LogPrintf("tor: No supported authentication method\n");
}
@@ -601,29 +613,29 @@ void TorController::protocolinfo_cb(TorControlConnection& conn, const TorControl
}
}
-void TorController::connected_cb(TorControlConnection& conn)
+void TorController::connected_cb(TorControlConnection& _conn)
{
reconnect_timeout = RECONNECT_TIMEOUT_START;
// First send a PROTOCOLINFO command to figure out what authentication is expected
- if (!conn.Command("PROTOCOLINFO 1", boost::bind(&TorController::protocolinfo_cb, this, _1, _2)))
+ if (!_conn.Command("PROTOCOLINFO 1", boost::bind(&TorController::protocolinfo_cb, this, _1, _2)))
LogPrintf("tor: Error sending initial protocolinfo command\n");
}
-void TorController::disconnected_cb(TorControlConnection& conn)
+void TorController::disconnected_cb(TorControlConnection& _conn)
{
- // Stop advertizing service when disconnected
+ // Stop advertising service when disconnected
if (service.IsValid())
RemoveLocal(service);
service = CService();
if (!reconnect)
return;
- LogPrint("tor", "tor: Disconnected from Tor control port %s, trying to reconnect\n", target);
+ LogPrint("tor", "tor: Not connected to Tor control port %s, trying to reconnect\n", target);
// Single-shot timer for reconnect. Use exponential backoff.
struct timeval time = MillisToTimeval(int64_t(reconnect_timeout * 1000.0));
- reconnect_ev = event_new(base, -1, 0, reconnect_cb, this);
- event_add(reconnect_ev, &time);
+ if (reconnect_ev)
+ event_add(reconnect_ev, &time);
reconnect_timeout *= RECONNECT_TIMEOUT_EXP;
}
diff --git a/src/txdb.cpp b/src/txdb.cpp
index cd76c0155c..4f11c7b951 100644
--- a/src/txdb.cpp
+++ b/src/txdb.cpp
@@ -1,14 +1,12 @@
// Copyright (c) 2009-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 "txdb.h"
-#include "chain.h"
#include "chainparams.h"
#include "hash.h"
-#include "main.h"
#include "pow.h"
#include "uint256.h"
@@ -49,7 +47,7 @@ uint256 CCoinsViewDB::GetBestBlock() const {
}
bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) {
- CDBBatch batch(&db.GetObfuscateKey());
+ CDBBatch batch(db);
size_t count = 0;
size_t changed = 0;
for (CCoinsMap::iterator it = mapCoins.begin(); it != mapCoins.end();) {
@@ -94,54 +92,52 @@ bool CBlockTreeDB::ReadLastBlockFile(int &nFile) {
return Read(DB_LAST_BLOCK, nFile);
}
-bool CCoinsViewDB::GetStats(CCoinsStats &stats) const {
+CCoinsViewCursor *CCoinsViewDB::Cursor() const
+{
+ CCoinsViewDBCursor *i = new CCoinsViewDBCursor(const_cast<CDBWrapper*>(&db)->NewIterator(), GetBestBlock());
/* It seems that there are no "const iterators" for LevelDB. Since we
only need read operations on it, use a const-cast to get around
that restriction. */
- boost::scoped_ptr<CDBIterator> pcursor(const_cast<CDBWrapper*>(&db)->NewIterator());
- pcursor->Seek(DB_COINS);
+ i->pcursor->Seek(DB_COINS);
+ // Cache key of first record
+ i->pcursor->GetKey(i->keyTmp);
+ return i;
+}
- CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
- stats.hashBlock = GetBestBlock();
- ss << stats.hashBlock;
- CAmount nTotalAmount = 0;
- while (pcursor->Valid()) {
- boost::this_thread::interruption_point();
- std::pair<char, uint256> key;
- CCoins coins;
- if (pcursor->GetKey(key) && key.first == DB_COINS) {
- if (pcursor->GetValue(coins)) {
- stats.nTransactions++;
- for (unsigned int i=0; i<coins.vout.size(); i++) {
- const CTxOut &out = coins.vout[i];
- if (!out.IsNull()) {
- stats.nTransactionOutputs++;
- ss << VARINT(i+1);
- ss << out;
- nTotalAmount += out.nValue;
- }
- }
- stats.nSerializedSize += 32 + pcursor->GetValueSize();
- ss << VARINT(0);
- } else {
- return error("CCoinsViewDB::GetStats() : unable to read value");
- }
- } else {
- break;
- }
- pcursor->Next();
- }
- {
- LOCK(cs_main);
- stats.nHeight = mapBlockIndex.find(stats.hashBlock)->second->nHeight;
+bool CCoinsViewDBCursor::GetKey(uint256 &key) const
+{
+ // Return cached key
+ if (keyTmp.first == DB_COINS) {
+ key = keyTmp.second;
+ return true;
}
- stats.hashSerialized = ss.GetHash();
- stats.nTotalAmount = nTotalAmount;
- return true;
+ return false;
+}
+
+bool CCoinsViewDBCursor::GetValue(CCoins &coins) const
+{
+ return pcursor->GetValue(coins);
+}
+
+unsigned int CCoinsViewDBCursor::GetValueSize() const
+{
+ return pcursor->GetValueSize();
+}
+
+bool CCoinsViewDBCursor::Valid() const
+{
+ return keyTmp.first == DB_COINS;
+}
+
+void CCoinsViewDBCursor::Next()
+{
+ pcursor->Next();
+ if (!pcursor->Valid() || !pcursor->GetKey(keyTmp))
+ keyTmp.first = 0; // Invalidate cached key after last record so that Valid() and GetKey() return false
}
bool CBlockTreeDB::WriteBatchSync(const std::vector<std::pair<int, const CBlockFileInfo*> >& fileInfo, int nLastFile, const std::vector<const CBlockIndex*>& blockinfo) {
- CDBBatch batch(&GetObfuscateKey());
+ CDBBatch batch(*this);
for (std::vector<std::pair<int, const CBlockFileInfo*> >::const_iterator it=fileInfo.begin(); it != fileInfo.end(); it++) {
batch.Write(make_pair(DB_BLOCK_FILES, it->first), *it->second);
}
@@ -157,7 +153,7 @@ bool CBlockTreeDB::ReadTxIndex(const uint256 &txid, CDiskTxPos &pos) {
}
bool CBlockTreeDB::WriteTxIndex(const std::vector<std::pair<uint256, CDiskTxPos> >&vect) {
- CDBBatch batch(&GetObfuscateKey());
+ CDBBatch batch(*this);
for (std::vector<std::pair<uint256,CDiskTxPos> >::const_iterator it=vect.begin(); it!=vect.end(); it++)
batch.Write(make_pair(DB_TXINDEX, it->first), it->second);
return WriteBatch(batch);
@@ -175,9 +171,9 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) {
return true;
}
-bool CBlockTreeDB::LoadBlockIndexGuts()
+bool CBlockTreeDB::LoadBlockIndexGuts(boost::function<CBlockIndex*(const uint256&)> insertBlockIndex)
{
- boost::scoped_ptr<CDBIterator> pcursor(NewIterator());
+ std::unique_ptr<CDBIterator> pcursor(NewIterator());
pcursor->Seek(make_pair(DB_BLOCK_INDEX, uint256()));
@@ -189,8 +185,8 @@ bool CBlockTreeDB::LoadBlockIndexGuts()
CDiskBlockIndex diskindex;
if (pcursor->GetValue(diskindex)) {
// Construct block index object
- CBlockIndex* pindexNew = InsertBlockIndex(diskindex.GetBlockHash());
- pindexNew->pprev = InsertBlockIndex(diskindex.hashPrev);
+ CBlockIndex* pindexNew = insertBlockIndex(diskindex.GetBlockHash());
+ pindexNew->pprev = insertBlockIndex(diskindex.hashPrev);
pindexNew->nHeight = diskindex.nHeight;
pindexNew->nFile = diskindex.nFile;
pindexNew->nDataPos = diskindex.nDataPos;
diff --git a/src/txdb.h b/src/txdb.h
index 586ab55d0d..adb3f66327 100644
--- a/src/txdb.h
+++ b/src/txdb.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -8,23 +8,58 @@
#include "coins.h"
#include "dbwrapper.h"
+#include "chain.h"
#include <map>
#include <string>
#include <utility>
#include <vector>
-class CBlockFileInfo;
+#include <boost/function.hpp>
+
class CBlockIndex;
-struct CDiskTxPos;
+class CCoinsViewDBCursor;
class uint256;
//! -dbcache default (MiB)
-static const int64_t nDefaultDbCache = 100;
-//! max. -dbcache in (MiB)
+static const int64_t nDefaultDbCache = 300;
+//! max. -dbcache (MiB)
static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 16384 : 1024;
-//! min. -dbcache in (MiB)
+//! min. -dbcache (MiB)
static const int64_t nMinDbCache = 4;
+//! Max memory allocated to block tree DB specific cache, if no -txindex (MiB)
+static const int64_t nMaxBlockDBCache = 2;
+//! Max memory allocated to block tree DB specific cache, if -txindex (MiB)
+// Unlike for the UTXO database, for the txindex scenario the leveldb cache make
+// a meaningful difference: https://github.com/bitcoin/bitcoin/pull/8273#issuecomment-229601991
+static const int64_t nMaxBlockDBAndTxIndexCache = 1024;
+//! Max memory allocated to coin DB specific cache (MiB)
+static const int64_t nMaxCoinsDBCache = 8;
+
+struct CDiskTxPos : public CDiskBlockPos
+{
+ unsigned int nTxOffset; // after header
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ READWRITE(*(CDiskBlockPos*)this);
+ READWRITE(VARINT(nTxOffset));
+ }
+
+ CDiskTxPos(const CDiskBlockPos &blockIn, unsigned int nTxOffsetIn) : CDiskBlockPos(blockIn.nFile, blockIn.nPos), nTxOffset(nTxOffsetIn) {
+ }
+
+ CDiskTxPos() {
+ SetNull();
+ }
+
+ void SetNull() {
+ CDiskBlockPos::SetNull();
+ nTxOffset = 0;
+ }
+};
/** CCoinsView backed by the coin database (chainstate/) */
class CCoinsViewDB : public CCoinsView
@@ -38,7 +73,29 @@ public:
bool HaveCoins(const uint256 &txid) const;
uint256 GetBestBlock() const;
bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock);
- bool GetStats(CCoinsStats &stats) const;
+ CCoinsViewCursor *Cursor() const;
+};
+
+/** Specialization of CCoinsViewCursor to iterate over a CCoinsViewDB */
+class CCoinsViewDBCursor: public CCoinsViewCursor
+{
+public:
+ ~CCoinsViewDBCursor() {}
+
+ bool GetKey(uint256 &key) const;
+ bool GetValue(CCoins &coins) const;
+ unsigned int GetValueSize() const;
+
+ bool Valid() const;
+ void Next();
+
+private:
+ CCoinsViewDBCursor(CDBIterator* pcursorIn, const uint256 &hashBlockIn):
+ CCoinsViewCursor(hashBlockIn), pcursor(pcursorIn) {}
+ std::unique_ptr<CDBIterator> pcursor;
+ std::pair<char, uint256> keyTmp;
+
+ friend class CCoinsViewDB;
};
/** Access to the block database (blocks/index/) */
@@ -59,7 +116,7 @@ public:
bool WriteTxIndex(const std::vector<std::pair<uint256, CDiskTxPos> > &list);
bool WriteFlag(const std::string &name, bool fValue);
bool ReadFlag(const std::string &name, bool &fValue);
- bool LoadBlockIndexGuts();
+ bool LoadBlockIndexGuts(boost::function<CBlockIndex*(const uint256&)> insertBlockIndex);
};
#endif // BITCOIN_TXDB_H
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index fea5da8029..15fa6fbca3 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -9,6 +9,7 @@
#include "consensus/consensus.h"
#include "consensus/validation.h"
#include "main.h"
+#include "policy/policy.h"
#include "policy/fees.h"
#include "streams.h"
#include "timedata.h"
@@ -22,22 +23,27 @@ using namespace std;
CTxMemPoolEntry::CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee,
int64_t _nTime, double _entryPriority, unsigned int _entryHeight,
bool poolHasNoInputsOf, CAmount _inChainInputValue,
- bool _spendsCoinbase, unsigned int _sigOps):
- tx(_tx), nFee(_nFee), nTime(_nTime), entryPriority(_entryPriority), entryHeight(_entryHeight),
+ bool _spendsCoinbase, int64_t _sigOpsCost, LockPoints lp):
+ tx(std::make_shared<CTransaction>(_tx)), nFee(_nFee), nTime(_nTime), entryPriority(_entryPriority), entryHeight(_entryHeight),
hadNoDependencies(poolHasNoInputsOf), inChainInputValue(_inChainInputValue),
- spendsCoinbase(_spendsCoinbase), sigOpCount(_sigOps)
+ spendsCoinbase(_spendsCoinbase), sigOpCost(_sigOpsCost), lockPoints(lp)
{
- nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
- nModSize = tx.CalculateModifiedSize(nTxSize);
- nUsageSize = RecursiveDynamicUsage(tx);
+ nTxWeight = GetTransactionWeight(_tx);
+ nModSize = _tx.CalculateModifiedSize(GetTxSize());
+ nUsageSize = RecursiveDynamicUsage(*tx) + memusage::DynamicUsage(tx);
nCountWithDescendants = 1;
- nSizeWithDescendants = nTxSize;
- nFeesWithDescendants = nFee;
- CAmount nValueIn = tx.GetValueOut()+nFee;
+ nSizeWithDescendants = GetTxSize();
+ nModFeesWithDescendants = nFee;
+ CAmount nValueIn = _tx.GetValueOut()+nFee;
assert(inChainInputValue <= nValueIn);
feeDelta = 0;
+
+ nCountWithAncestors = 1;
+ nSizeWithAncestors = GetTxSize();
+ nModFeesWithAncestors = nFee;
+ nSigOpCostWithAncestors = sigOpCost;
}
CTxMemPoolEntry::CTxMemPoolEntry(const CTxMemPoolEntry& other)
@@ -57,27 +63,31 @@ CTxMemPoolEntry::GetPriority(unsigned int currentHeight) const
void CTxMemPoolEntry::UpdateFeeDelta(int64_t newFeeDelta)
{
+ nModFeesWithDescendants += newFeeDelta - feeDelta;
+ nModFeesWithAncestors += newFeeDelta - feeDelta;
feeDelta = newFeeDelta;
}
+void CTxMemPoolEntry::UpdateLockPoints(const LockPoints& lp)
+{
+ lockPoints = lp;
+}
+
+size_t CTxMemPoolEntry::GetTxSize() const
+{
+ return GetVirtualTransactionSize(nTxWeight, sigOpCost);
+}
+
// Update the given tx for any in-mempool descendants.
// Assumes that setMemPoolChildren is correct for the given tx and all
// descendants.
-bool CTxMemPool::UpdateForDescendants(txiter updateIt, int maxDescendantsToVisit, cacheMap &cachedDescendants, const std::set<uint256> &setExclude)
+void CTxMemPool::UpdateForDescendants(txiter updateIt, cacheMap &cachedDescendants, const std::set<uint256> &setExclude)
{
- // Track the number of entries (outside setExclude) that we'd need to visit
- // (will bail out if it exceeds maxDescendantsToVisit)
- int nChildrenToVisit = 0;
-
setEntries stageEntries, setAllDescendants;
stageEntries = GetMemPoolChildren(updateIt);
while (!stageEntries.empty()) {
const txiter cit = *stageEntries.begin();
- if (cit->IsDirty()) {
- // Don't consider any more children if any descendant is dirty
- return false;
- }
setAllDescendants.insert(cit);
stageEntries.erase(cit);
const setEntries &setChildren = GetMemPoolChildren(cit);
@@ -87,22 +97,11 @@ bool CTxMemPool::UpdateForDescendants(txiter updateIt, int maxDescendantsToVisit
// We've already calculated this one, just add the entries for this set
// but don't traverse again.
BOOST_FOREACH(const txiter cacheEntry, cacheIt->second) {
- // update visit count only for new child transactions
- // (outside of setExclude and stageEntries)
- if (setAllDescendants.insert(cacheEntry).second &&
- !setExclude.count(cacheEntry->GetTx().GetHash()) &&
- !stageEntries.count(cacheEntry)) {
- nChildrenToVisit++;
- }
+ setAllDescendants.insert(cacheEntry);
}
} else if (!setAllDescendants.count(childEntry)) {
- // Schedule for later processing and update our visit count
- if (stageEntries.insert(childEntry).second && !setExclude.count(childEntry->GetTx().GetHash())) {
- nChildrenToVisit++;
- }
- }
- if (nChildrenToVisit > maxDescendantsToVisit) {
- return false;
+ // Schedule for later processing
+ stageEntries.insert(childEntry);
}
}
}
@@ -114,19 +113,21 @@ bool CTxMemPool::UpdateForDescendants(txiter updateIt, int maxDescendantsToVisit
BOOST_FOREACH(txiter cit, setAllDescendants) {
if (!setExclude.count(cit->GetTx().GetHash())) {
modifySize += cit->GetTxSize();
- modifyFee += cit->GetFee();
+ modifyFee += cit->GetModifiedFee();
modifyCount++;
cachedDescendants[updateIt].insert(cit);
+ // Update ancestor state for each descendant
+ mapTx.modify(cit, update_ancestor_state(updateIt->GetTxSize(), updateIt->GetModifiedFee(), 1, updateIt->GetSigOpCost()));
}
}
mapTx.modify(updateIt, update_descendant_state(modifySize, modifyFee, modifyCount));
- return true;
}
// vHashesToUpdate is the set of transaction hashes from a disconnected block
// which has been re-added to the mempool.
// for each entry, look for descendants that are outside hashesToUpdate, and
// add fee/size information for such descendants to the parent.
+// for each such descendant, also update the ancestor state to include the parent.
void CTxMemPool::UpdateTransactionsFromBlock(const std::vector<uint256> &vHashesToUpdate)
{
LOCK(cs);
@@ -152,11 +153,11 @@ void CTxMemPool::UpdateTransactionsFromBlock(const std::vector<uint256> &vHashes
if (it == mapTx.end()) {
continue;
}
- std::map<COutPoint, CInPoint>::iterator iter = mapNextTx.lower_bound(COutPoint(hash, 0));
+ auto iter = mapNextTx.lower_bound(COutPoint(hash, 0));
// First calculate the children, and update setMemPoolChildren to
// include them, and update their setMemPoolParents to include this tx.
- for (; iter != mapNextTx.end() && iter->first.hash == hash; ++iter) {
- const uint256 &childHash = iter->second.ptx->GetHash();
+ for (; iter != mapNextTx.end() && iter->first->hash == hash; ++iter) {
+ const uint256 &childHash = iter->second->GetHash();
txiter childIter = mapTx.find(childHash);
assert(childIter != mapTx.end());
// We can skip updating entries we've encountered before or that
@@ -166,14 +167,11 @@ void CTxMemPool::UpdateTransactionsFromBlock(const std::vector<uint256> &vHashes
UpdateParent(childIter, it, true);
}
}
- if (!UpdateForDescendants(it, 100, mapMemPoolDescendantsToUpdate, setAlreadyIncluded)) {
- // Mark as dirty if we can't do the calculation.
- mapTx.modify(it, set_dirty());
- }
+ UpdateForDescendants(it, mapMemPoolDescendantsToUpdate, setAlreadyIncluded);
}
}
-bool CTxMemPool::CalculateMemPoolAncestors(const CTxMemPoolEntry &entry, setEntries &setAncestors, uint64_t limitAncestorCount, uint64_t limitAncestorSize, uint64_t limitDescendantCount, uint64_t limitDescendantSize, std::string &errString, bool fSearchForParents /* = true */)
+bool CTxMemPool::CalculateMemPoolAncestors(const CTxMemPoolEntry &entry, setEntries &setAncestors, uint64_t limitAncestorCount, uint64_t limitAncestorSize, uint64_t limitDescendantCount, uint64_t limitDescendantSize, std::string &errString, bool fSearchForParents /* = true */) const
{
setEntries parentHashes;
const CTransaction &tx = entry.GetTx();
@@ -244,12 +242,26 @@ void CTxMemPool::UpdateAncestorsOf(bool add, txiter it, setEntries &setAncestors
}
const int64_t updateCount = (add ? 1 : -1);
const int64_t updateSize = updateCount * it->GetTxSize();
- const CAmount updateFee = updateCount * it->GetFee();
+ const CAmount updateFee = updateCount * it->GetModifiedFee();
BOOST_FOREACH(txiter ancestorIt, setAncestors) {
mapTx.modify(ancestorIt, update_descendant_state(updateSize, updateFee, updateCount));
}
}
+void CTxMemPool::UpdateEntryForAncestors(txiter it, const setEntries &setAncestors)
+{
+ int64_t updateCount = setAncestors.size();
+ int64_t updateSize = 0;
+ CAmount updateFee = 0;
+ int64_t updateSigOpsCost = 0;
+ BOOST_FOREACH(txiter ancestorIt, setAncestors) {
+ updateSize += ancestorIt->GetTxSize();
+ updateFee += ancestorIt->GetModifiedFee();
+ updateSigOpsCost += ancestorIt->GetSigOpCost();
+ }
+ mapTx.modify(it, update_ancestor_state(updateSize, updateFee, updateCount, updateSigOpsCost));
+}
+
void CTxMemPool::UpdateChildrenForRemoval(txiter it)
{
const setEntries &setMemPoolChildren = GetMemPoolChildren(it);
@@ -258,11 +270,30 @@ void CTxMemPool::UpdateChildrenForRemoval(txiter it)
}
}
-void CTxMemPool::UpdateForRemoveFromMempool(const setEntries &entriesToRemove)
+void CTxMemPool::UpdateForRemoveFromMempool(const setEntries &entriesToRemove, bool updateDescendants)
{
// For each entry, walk back all ancestors and decrement size associated with this
// transaction
const uint64_t nNoLimit = std::numeric_limits<uint64_t>::max();
+ if (updateDescendants) {
+ // updateDescendants should be true whenever we're not recursively
+ // removing a tx and all its descendants, eg when a transaction is
+ // confirmed in a block.
+ // Here we only update statistics and not data in mapLinks (which
+ // we need to preserve until we're finished with all operations that
+ // need to traverse the mempool).
+ BOOST_FOREACH(txiter removeIt, entriesToRemove) {
+ setEntries setDescendants;
+ CalculateDescendants(removeIt, setDescendants);
+ setDescendants.erase(removeIt); // don't update state for self
+ int64_t modifySize = -((int64_t)removeIt->GetTxSize());
+ CAmount modifyFee = -removeIt->GetModifiedFee();
+ int modifySigOps = -removeIt->GetSigOpCost();
+ BOOST_FOREACH(txiter dit, setDescendants) {
+ mapTx.modify(dit, update_ancestor_state(modifySize, modifyFee, -1, modifySigOps));
+ }
+ }
+ }
BOOST_FOREACH(txiter removeIt, entriesToRemove) {
setEntries setAncestors;
const CTxMemPoolEntry &entry = *removeIt;
@@ -286,10 +317,7 @@ void CTxMemPool::UpdateForRemoveFromMempool(const setEntries &entriesToRemove)
// transactions as the set of things to update for removal.
CalculateMemPoolAncestors(entry, setAncestors, nNoLimit, nNoLimit, nNoLimit, nNoLimit, dummy, false);
// Note that UpdateAncestorsOf severs the child links that point to
- // removeIt in the entries for the parents of removeIt. This is
- // fine since we don't need to use the mempool children of any entries
- // to walk back over our ancestors (but we do need the mempool
- // parents!)
+ // removeIt in the entries for the parents of removeIt.
UpdateAncestorsOf(false, removeIt, setAncestors);
}
// After updating all the ancestor sizes, we can now sever the link between each
@@ -300,23 +328,24 @@ void CTxMemPool::UpdateForRemoveFromMempool(const setEntries &entriesToRemove)
}
}
-void CTxMemPoolEntry::SetDirty()
+void CTxMemPoolEntry::UpdateDescendantState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount)
{
- nCountWithDescendants = 0;
- nSizeWithDescendants = nTxSize;
- nFeesWithDescendants = nFee;
+ nSizeWithDescendants += modifySize;
+ assert(int64_t(nSizeWithDescendants) > 0);
+ nModFeesWithDescendants += modifyFee;
+ nCountWithDescendants += modifyCount;
+ assert(int64_t(nCountWithDescendants) > 0);
}
-void CTxMemPoolEntry::UpdateState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount)
+void CTxMemPoolEntry::UpdateAncestorState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount, int modifySigOps)
{
- if (!IsDirty()) {
- nSizeWithDescendants += modifySize;
- assert(int64_t(nSizeWithDescendants) > 0);
- nFeesWithDescendants += modifyFee;
- assert(nFeesWithDescendants >= 0);
- nCountWithDescendants += modifyCount;
- assert(int64_t(nCountWithDescendants) > 0);
- }
+ nSizeWithAncestors += modifySize;
+ assert(int64_t(nSizeWithAncestors) > 0);
+ nModFeesWithAncestors += modifyFee;
+ nCountWithAncestors += modifyCount;
+ assert(int64_t(nCountWithAncestors) > 0);
+ nSigOpCostWithAncestors += modifySigOps;
+ assert(int(nSigOpCostWithAncestors) >= 0);
}
CTxMemPool::CTxMemPool(const CFeeRate& _minReasonableRelayFee) :
@@ -342,11 +371,11 @@ void CTxMemPool::pruneSpent(const uint256 &hashTx, CCoins &coins)
{
LOCK(cs);
- std::map<COutPoint, CInPoint>::iterator it = mapNextTx.lower_bound(COutPoint(hashTx, 0));
+ auto it = mapNextTx.lower_bound(COutPoint(hashTx, 0));
// iterate over all COutPoints in mapNextTx whose hash equals the provided hashTx
- while (it != mapNextTx.end() && it->first.hash == hashTx) {
- coins.Spend(it->first.n); // and remove those outputs from coins
+ while (it != mapNextTx.end() && it->first->hash == hashTx) {
+ coins.Spend(it->first->n); // and remove those outputs from coins
it++;
}
}
@@ -372,6 +401,17 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry,
indexed_transaction_set::iterator newit = mapTx.insert(entry).first;
mapLinks.insert(make_pair(newit, TxLinks()));
+ // Update transaction for any feeDelta created by PrioritiseTransaction
+ // TODO: refactor so that the fee delta is calculated before inserting
+ // into mapTx.
+ std::map<uint256, std::pair<double, CAmount> >::const_iterator pos = mapDeltas.find(hash);
+ if (pos != mapDeltas.end()) {
+ const std::pair<double, CAmount> &deltas = pos->second;
+ if (deltas.second) {
+ mapTx.modify(newit, update_fee_delta(deltas.second));
+ }
+ }
+
// Update cachedInnerUsage to include contained transaction's usage.
// (When we update the entry for in-mempool parents, memory usage will be
// further updated.)
@@ -380,7 +420,7 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry,
const CTransaction& tx = newit->GetTx();
std::set<uint256> setParentTransactions;
for (unsigned int i = 0; i < tx.vin.size(); i++) {
- mapNextTx[tx.vin[i].prevout] = CInPoint(&tx, i);
+ mapNextTx.insert(std::make_pair(&tx.vin[i].prevout, &tx));
setParentTransactions.insert(tx.vin[i].prevout.hash);
}
// Don't bother worrying about child transactions of this one.
@@ -398,20 +438,15 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry,
}
}
UpdateAncestorsOf(true, newit, setAncestors);
-
- // Update transaction's score for any feeDelta created by PrioritiseTransaction
- std::map<uint256, std::pair<double, CAmount> >::const_iterator pos = mapDeltas.find(hash);
- if (pos != mapDeltas.end()) {
- const std::pair<double, CAmount> &deltas = pos->second;
- if (deltas.second) {
- mapTx.modify(newit, update_fee_delta(deltas.second));
- }
- }
+ UpdateEntryForAncestors(newit, setAncestors);
nTransactionsUpdated++;
totalTxSize += entry.GetTxSize();
minerPolicyEstimator->processTransaction(entry, fCurrentEstimate);
+ vTxHashes.emplace_back(tx.GetWitnessHash(), newit);
+ newit->vTxHashesIdx = vTxHashes.size() - 1;
+
return true;
}
@@ -421,6 +456,15 @@ void CTxMemPool::removeUnchecked(txiter it)
BOOST_FOREACH(const CTxIn& txin, it->GetTx().vin)
mapNextTx.erase(txin.prevout);
+ if (vTxHashes.size() > 1) {
+ vTxHashes[it->vTxHashesIdx] = std::move(vTxHashes.back());
+ vTxHashes[it->vTxHashesIdx].second->vTxHashesIdx = it->vTxHashesIdx;
+ vTxHashes.pop_back();
+ if (vTxHashes.size() * 2 < vTxHashes.capacity())
+ vTxHashes.shrink_to_fit();
+ } else
+ vTxHashes.clear();
+
totalTxSize -= it->GetTxSize();
cachedInnerUsage -= it->DynamicMemoryUsage();
cachedInnerUsage -= memusage::DynamicUsage(mapLinks[it].parents) + memusage::DynamicUsage(mapLinks[it].children);
@@ -459,7 +503,7 @@ void CTxMemPool::CalculateDescendants(txiter entryit, setEntries &setDescendants
}
}
-void CTxMemPool::remove(const CTransaction &origTx, std::list<CTransaction>& removed, bool fRecursive)
+void CTxMemPool::removeRecursive(const CTransaction &origTx, std::list<CTransaction>& removed)
{
// Remove transaction from memory pool
{
@@ -468,32 +512,28 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list<CTransaction>& rem
txiter origit = mapTx.find(origTx.GetHash());
if (origit != mapTx.end()) {
txToRemove.insert(origit);
- } else if (fRecursive) {
- // If recursively removing but origTx isn't in the mempool
+ } else {
+ // When recursively removing but origTx isn't in the mempool
// be sure to remove any children that are in the pool. This can
// happen during chain re-orgs if origTx isn't re-accepted into
// the mempool for any reason.
for (unsigned int i = 0; i < origTx.vout.size(); i++) {
- std::map<COutPoint, CInPoint>::iterator it = mapNextTx.find(COutPoint(origTx.GetHash(), i));
+ auto it = mapNextTx.find(COutPoint(origTx.GetHash(), i));
if (it == mapNextTx.end())
continue;
- txiter nextit = mapTx.find(it->second.ptx->GetHash());
+ txiter nextit = mapTx.find(it->second->GetHash());
assert(nextit != mapTx.end());
txToRemove.insert(nextit);
}
}
setEntries setAllRemoves;
- if (fRecursive) {
- BOOST_FOREACH(txiter it, txToRemove) {
- CalculateDescendants(it, setAllRemoves);
- }
- } else {
- setAllRemoves.swap(txToRemove);
+ BOOST_FOREACH(txiter it, txToRemove) {
+ CalculateDescendants(it, setAllRemoves);
}
BOOST_FOREACH(txiter it, setAllRemoves) {
removed.push_back(it->GetTx());
}
- RemoveStaged(setAllRemoves);
+ RemoveStaged(setAllRemoves, false);
}
}
@@ -504,7 +544,11 @@ void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMem
list<CTransaction> transactionsToRemove;
for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) {
const CTransaction& tx = it->GetTx();
- if (!CheckFinalTx(tx, flags)) {
+ LockPoints lp = it->GetLockPoints();
+ bool validLP = TestLockPointValidity(&lp);
+ if (!CheckFinalTx(tx, flags) || !CheckSequenceLocks(tx, flags, &lp, validLP)) {
+ // Note if CheckSequenceLocks fails the LockPoints may still be invalid
+ // So it's critical that we remove the tx and not depend on the LockPoints.
transactionsToRemove.push_back(tx);
} else if (it->GetSpendsCoinbase()) {
BOOST_FOREACH(const CTxIn& txin, tx.vin) {
@@ -519,25 +563,27 @@ void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMem
}
}
}
+ if (!validLP) {
+ mapTx.modify(it, update_lock_points(lp));
+ }
}
BOOST_FOREACH(const CTransaction& tx, transactionsToRemove) {
list<CTransaction> removed;
- remove(tx, removed, true);
+ removeRecursive(tx, removed);
}
}
void CTxMemPool::removeConflicts(const CTransaction &tx, std::list<CTransaction>& removed)
{
// Remove transactions which depend on inputs of tx, recursively
- list<CTransaction> result;
LOCK(cs);
BOOST_FOREACH(const CTxIn &txin, tx.vin) {
- std::map<COutPoint, CInPoint>::iterator it = mapNextTx.find(txin.prevout);
+ auto it = mapNextTx.find(txin.prevout);
if (it != mapNextTx.end()) {
- const CTransaction &txConflict = *it->second.ptx;
+ const CTransaction &txConflict = *it->second;
if (txConflict != tx)
{
- remove(txConflict, removed, true);
+ removeRecursive(txConflict, removed);
ClearPrioritisation(txConflict.GetHash());
}
}
@@ -562,8 +608,12 @@ void CTxMemPool::removeForBlock(const std::vector<CTransaction>& vtx, unsigned i
}
BOOST_FOREACH(const CTransaction& tx, vtx)
{
- std::list<CTransaction> dummy;
- remove(tx, dummy, false);
+ txiter it = mapTx.find(tx.GetHash());
+ if (it != mapTx.end()) {
+ setEntries stage;
+ stage.insert(it);
+ RemoveStaged(stage, true);
+ }
removeConflicts(tx, conflicts);
ClearPrioritisation(tx.GetHash());
}
@@ -606,6 +656,7 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
uint64_t innerUsage = 0;
CCoinsViewCache mempoolDuplicate(const_cast<CCoinsViewCache*>(pcoins));
+ const int64_t nSpendHeight = GetSpendHeight(mempoolDuplicate);
LOCK(cs);
list<const CTxMemPoolEntry*> waitingOnDependants;
@@ -620,6 +671,8 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
innerUsage += memusage::DynamicUsage(links.parents) + memusage::DynamicUsage(links.children);
bool fDependsWait = false;
setEntries setParentCheck;
+ int64_t parentSizes = 0;
+ int64_t parentSigOpCost = 0;
BOOST_FOREACH(const CTxIn &txin, tx.vin) {
// Check that every mempool transaction's inputs refer to available coins, or other mempool tx's.
indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash);
@@ -627,51 +680,67 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
const CTransaction& tx2 = it2->GetTx();
assert(tx2.vout.size() > txin.prevout.n && !tx2.vout[txin.prevout.n].IsNull());
fDependsWait = true;
- setParentCheck.insert(it2);
+ if (setParentCheck.insert(it2).second) {
+ parentSizes += it2->GetTxSize();
+ parentSigOpCost += it2->GetSigOpCost();
+ }
} else {
const CCoins* coins = pcoins->AccessCoins(txin.prevout.hash);
assert(coins && coins->IsAvailable(txin.prevout.n));
}
// Check whether its inputs are marked in mapNextTx.
- std::map<COutPoint, CInPoint>::const_iterator it3 = mapNextTx.find(txin.prevout);
+ auto it3 = mapNextTx.find(txin.prevout);
assert(it3 != mapNextTx.end());
- assert(it3->second.ptx == &tx);
- assert(it3->second.n == i);
+ assert(it3->first == &txin.prevout);
+ assert(it3->second == &tx);
i++;
}
assert(setParentCheck == GetMemPoolParents(it));
+ // Verify ancestor state is correct.
+ setEntries setAncestors;
+ uint64_t nNoLimit = std::numeric_limits<uint64_t>::max();
+ std::string dummy;
+ CalculateMemPoolAncestors(*it, setAncestors, nNoLimit, nNoLimit, nNoLimit, nNoLimit, dummy);
+ uint64_t nCountCheck = setAncestors.size() + 1;
+ uint64_t nSizeCheck = it->GetTxSize();
+ CAmount nFeesCheck = it->GetModifiedFee();
+ int64_t nSigOpCheck = it->GetSigOpCost();
+
+ BOOST_FOREACH(txiter ancestorIt, setAncestors) {
+ nSizeCheck += ancestorIt->GetTxSize();
+ nFeesCheck += ancestorIt->GetModifiedFee();
+ nSigOpCheck += ancestorIt->GetSigOpCost();
+ }
+
+ assert(it->GetCountWithAncestors() == nCountCheck);
+ assert(it->GetSizeWithAncestors() == nSizeCheck);
+ assert(it->GetSigOpCostWithAncestors() == nSigOpCheck);
+ assert(it->GetModFeesWithAncestors() == nFeesCheck);
+
// Check children against mapNextTx
CTxMemPool::setEntries setChildrenCheck;
- std::map<COutPoint, CInPoint>::const_iterator iter = mapNextTx.lower_bound(COutPoint(it->GetTx().GetHash(), 0));
+ auto iter = mapNextTx.lower_bound(COutPoint(it->GetTx().GetHash(), 0));
int64_t childSizes = 0;
- CAmount childFees = 0;
- for (; iter != mapNextTx.end() && iter->first.hash == it->GetTx().GetHash(); ++iter) {
- txiter childit = mapTx.find(iter->second.ptx->GetHash());
+ for (; iter != mapNextTx.end() && iter->first->hash == it->GetTx().GetHash(); ++iter) {
+ txiter childit = mapTx.find(iter->second->GetHash());
assert(childit != mapTx.end()); // mapNextTx points to in-mempool transactions
if (setChildrenCheck.insert(childit).second) {
childSizes += childit->GetTxSize();
- childFees += childit->GetFee();
}
}
assert(setChildrenCheck == GetMemPoolChildren(it));
- // Also check to make sure size/fees is greater than sum with immediate children.
+ // Also check to make sure size is greater than sum with immediate children.
// just a sanity check, not definitive that this calc is correct...
- // also check that the size is less than the size of the entire mempool.
- if (!it->IsDirty()) {
- assert(it->GetSizeWithDescendants() >= childSizes + it->GetTxSize());
- assert(it->GetFeesWithDescendants() >= childFees + it->GetFee());
- } else {
- assert(it->GetSizeWithDescendants() == it->GetTxSize());
- assert(it->GetFeesWithDescendants() == it->GetFee());
- }
- assert(it->GetFeesWithDescendants() >= 0);
+ assert(it->GetSizeWithDescendants() >= childSizes + it->GetTxSize());
if (fDependsWait)
waitingOnDependants.push_back(&(*it));
else {
CValidationState state;
- assert(CheckInputs(tx, state, mempoolDuplicate, false, 0, false, NULL));
- UpdateCoins(tx, state, mempoolDuplicate, 1000000);
+ bool fCheckResult = tx.IsCoinBase() ||
+ Consensus::CheckTxInputs(tx, state, mempoolDuplicate, nSpendHeight);
+ assert(fCheckResult);
+ UpdateCoins(tx, mempoolDuplicate, 1000000);
}
}
unsigned int stepsSinceLastRemove = 0;
@@ -684,42 +753,113 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
stepsSinceLastRemove++;
assert(stepsSinceLastRemove < waitingOnDependants.size());
} else {
- assert(CheckInputs(entry->GetTx(), state, mempoolDuplicate, false, 0, false, NULL));
- UpdateCoins(entry->GetTx(), state, mempoolDuplicate, 1000000);
+ bool fCheckResult = entry->GetTx().IsCoinBase() ||
+ Consensus::CheckTxInputs(entry->GetTx(), state, mempoolDuplicate, nSpendHeight);
+ assert(fCheckResult);
+ UpdateCoins(entry->GetTx(), mempoolDuplicate, 1000000);
stepsSinceLastRemove = 0;
}
}
- for (std::map<COutPoint, CInPoint>::const_iterator it = mapNextTx.begin(); it != mapNextTx.end(); it++) {
- uint256 hash = it->second.ptx->GetHash();
+ for (auto it = mapNextTx.cbegin(); it != mapNextTx.cend(); it++) {
+ uint256 hash = it->second->GetHash();
indexed_transaction_set::const_iterator it2 = mapTx.find(hash);
const CTransaction& tx = it2->GetTx();
assert(it2 != mapTx.end());
- assert(&tx == it->second.ptx);
- assert(tx.vin.size() > it->second.n);
- assert(it->first == it->second.ptx->vin[it->second.n].prevout);
+ assert(&tx == it->second);
}
assert(totalTxSize == checkTotal);
assert(innerUsage == cachedInnerUsage);
}
+bool CTxMemPool::CompareDepthAndScore(const uint256& hasha, const uint256& hashb)
+{
+ LOCK(cs);
+ indexed_transaction_set::const_iterator i = mapTx.find(hasha);
+ if (i == mapTx.end()) return false;
+ indexed_transaction_set::const_iterator j = mapTx.find(hashb);
+ if (j == mapTx.end()) return true;
+ uint64_t counta = i->GetCountWithAncestors();
+ uint64_t countb = j->GetCountWithAncestors();
+ if (counta == countb) {
+ return CompareTxMemPoolEntryByScore()(*i, *j);
+ }
+ return counta < countb;
+}
+
+namespace {
+class DepthAndScoreComparator
+{
+public:
+ bool operator()(const CTxMemPool::indexed_transaction_set::const_iterator& a, const CTxMemPool::indexed_transaction_set::const_iterator& b)
+ {
+ uint64_t counta = a->GetCountWithAncestors();
+ uint64_t countb = b->GetCountWithAncestors();
+ if (counta == countb) {
+ return CompareTxMemPoolEntryByScore()(*a, *b);
+ }
+ return counta < countb;
+ }
+};
+}
+
+std::vector<CTxMemPool::indexed_transaction_set::const_iterator> CTxMemPool::GetSortedDepthAndScore() const
+{
+ std::vector<indexed_transaction_set::const_iterator> iters;
+ AssertLockHeld(cs);
+
+ iters.reserve(mapTx.size());
+
+ for (indexed_transaction_set::iterator mi = mapTx.begin(); mi != mapTx.end(); ++mi) {
+ iters.push_back(mi);
+ }
+ std::sort(iters.begin(), iters.end(), DepthAndScoreComparator());
+ return iters;
+}
+
void CTxMemPool::queryHashes(vector<uint256>& vtxid)
{
+ LOCK(cs);
+ auto iters = GetSortedDepthAndScore();
+
vtxid.clear();
+ vtxid.reserve(mapTx.size());
+
+ for (auto it : iters) {
+ vtxid.push_back(it->GetTx().GetHash());
+ }
+}
+std::vector<TxMempoolInfo> CTxMemPool::infoAll() const
+{
LOCK(cs);
- vtxid.reserve(mapTx.size());
- for (indexed_transaction_set::iterator mi = mapTx.begin(); mi != mapTx.end(); ++mi)
- vtxid.push_back(mi->GetTx().GetHash());
+ auto iters = GetSortedDepthAndScore();
+
+ std::vector<TxMempoolInfo> ret;
+ ret.reserve(mapTx.size());
+ for (auto it : iters) {
+ ret.push_back(TxMempoolInfo{it->GetSharedTx(), it->GetTime(), CFeeRate(it->GetFee(), it->GetTxSize())});
+ }
+
+ return ret;
}
-bool CTxMemPool::lookup(uint256 hash, CTransaction& result) const
+std::shared_ptr<const CTransaction> CTxMemPool::get(const uint256& hash) const
{
LOCK(cs);
indexed_transaction_set::const_iterator i = mapTx.find(hash);
- if (i == mapTx.end()) return false;
- result = i->GetTx();
- return true;
+ if (i == mapTx.end())
+ return nullptr;
+ return i->GetSharedTx();
+}
+
+TxMempoolInfo CTxMemPool::info(const uint256& hash) const
+{
+ LOCK(cs);
+ indexed_transaction_set::const_iterator i = mapTx.find(hash);
+ if (i == mapTx.end())
+ return TxMempoolInfo();
+ return TxMempoolInfo{i->GetSharedTx(), i->GetTime(), CFeeRate(i->GetFee(), i->GetTxSize())};
}
CFeeRate CTxMemPool::estimateFee(int nBlocks) const
@@ -788,6 +928,14 @@ void CTxMemPool::PrioritiseTransaction(const uint256 hash, const string strHash,
txiter it = mapTx.find(hash);
if (it != mapTx.end()) {
mapTx.modify(it, update_fee_delta(deltas.second));
+ // Now update all ancestors' modified fees with descendants
+ setEntries setAncestors;
+ uint64_t nNoLimit = std::numeric_limits<uint64_t>::max();
+ std::string dummy;
+ CalculateMemPoolAncestors(*it, setAncestors, nNoLimit, nNoLimit, nNoLimit, nNoLimit, dummy, false);
+ BOOST_FOREACH(txiter ancestorIt, setAncestors) {
+ mapTx.modify(ancestorIt, update_descendant_state(0, nFeeDelta, 0));
+ }
}
}
LogPrintf("PrioritiseTransaction: %s priority += %f, fee += %d\n", strHash, dPriorityDelta, FormatMoney(nFeeDelta));
@@ -818,15 +966,15 @@ bool CTxMemPool::HasNoInputsOf(const CTransaction &tx) const
return true;
}
-CCoinsViewMemPool::CCoinsViewMemPool(CCoinsView *baseIn, CTxMemPool &mempoolIn) : CCoinsViewBacked(baseIn), mempool(mempoolIn) { }
+CCoinsViewMemPool::CCoinsViewMemPool(CCoinsView* baseIn, const CTxMemPool& mempoolIn) : CCoinsViewBacked(baseIn), mempool(mempoolIn) { }
bool CCoinsViewMemPool::GetCoins(const uint256 &txid, CCoins &coins) const {
// If an entry in the mempool exists, always return that one, as it's guaranteed to never
// conflict with the underlying cache, and it cannot have pruned entries (as it contains full)
// transactions. First checking the underlying cache risks returning a pruned entry instead.
- CTransaction tx;
- if (mempool.lookup(txid, tx)) {
- coins = CCoins(tx, MEMPOOL_HEIGHT);
+ shared_ptr<const CTransaction> ptx = mempool.get(txid);
+ if (ptx) {
+ coins = CCoins(*ptx, MEMPOOL_HEIGHT);
return true;
}
return (base->GetCoins(txid, coins) && !coins.IsPruned());
@@ -838,13 +986,13 @@ bool CCoinsViewMemPool::HaveCoins(const uint256 &txid) const {
size_t CTxMemPool::DynamicMemoryUsage() const {
LOCK(cs);
- // Estimate the overhead of mapTx to be 12 pointers + an allocation, as no exact formula for boost::multi_index_contained is implemented.
- return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 12 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(mapLinks) + cachedInnerUsage;
+ // Estimate the overhead of mapTx to be 15 pointers + an allocation, as no exact formula for boost::multi_index_contained is implemented.
+ return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 15 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(mapLinks) + memusage::DynamicUsage(vTxHashes) + cachedInnerUsage;
}
-void CTxMemPool::RemoveStaged(setEntries &stage) {
+void CTxMemPool::RemoveStaged(setEntries &stage, bool updateDescendants) {
AssertLockHeld(cs);
- UpdateForRemoveFromMempool(stage);
+ UpdateForRemoveFromMempool(stage, updateDescendants);
BOOST_FOREACH(const txiter& it, stage) {
removeUnchecked(it);
}
@@ -852,9 +1000,9 @@ void CTxMemPool::RemoveStaged(setEntries &stage) {
int CTxMemPool::Expire(int64_t time) {
LOCK(cs);
- indexed_transaction_set::nth_index<2>::type::iterator it = mapTx.get<2>().begin();
+ indexed_transaction_set::index<entry_time>::type::iterator it = mapTx.get<entry_time>().begin();
setEntries toremove;
- while (it != mapTx.get<2>().end() && it->GetTime() < time) {
+ while (it != mapTx.get<entry_time>().end() && it->GetTime() < time) {
toremove.insert(mapTx.project<0>(it));
it++;
}
@@ -862,7 +1010,7 @@ int CTxMemPool::Expire(int64_t time) {
BOOST_FOREACH(txiter removeit, toremove) {
CalculateDescendants(removeit, stage);
}
- RemoveStaged(stage);
+ RemoveStaged(stage, false);
return stage.size();
}
@@ -949,14 +1097,14 @@ void CTxMemPool::TrimToSize(size_t sizelimit, std::vector<uint256>* pvNoSpendsRe
unsigned nTxnRemoved = 0;
CFeeRate maxFeeRateRemoved(0);
- while (DynamicMemoryUsage() > sizelimit) {
- indexed_transaction_set::nth_index<1>::type::iterator it = mapTx.get<1>().begin();
+ while (!mapTx.empty() && DynamicMemoryUsage() > sizelimit) {
+ indexed_transaction_set::index<descendant_score>::type::iterator it = mapTx.get<descendant_score>().begin();
// We set the new mempool min fee to the feerate of the removed set, plus the
// "minimum reasonable fee rate" (ie some value under which we consider txn
// to have 0 fee). This way, we don't allow txn to enter mempool with feerate
// equal to txn which were removed with no block in between.
- CFeeRate removed(it->GetFeesWithDescendants(), it->GetSizeWithDescendants());
+ CFeeRate removed(it->GetModFeesWithDescendants(), it->GetSizeWithDescendants());
removed += minReasonableRelayFee;
trackPackageRemoved(removed);
maxFeeRateRemoved = std::max(maxFeeRateRemoved, removed);
@@ -968,17 +1116,17 @@ void CTxMemPool::TrimToSize(size_t sizelimit, std::vector<uint256>* pvNoSpendsRe
std::vector<CTransaction> txn;
if (pvNoSpendsRemaining) {
txn.reserve(stage.size());
- BOOST_FOREACH(txiter it, stage)
- txn.push_back(it->GetTx());
+ BOOST_FOREACH(txiter iter, stage)
+ txn.push_back(iter->GetTx());
}
- RemoveStaged(stage);
+ RemoveStaged(stage, false);
if (pvNoSpendsRemaining) {
BOOST_FOREACH(const CTransaction& tx, txn) {
BOOST_FOREACH(const CTxIn& txin, tx.vin) {
if (exists(txin.prevout.hash))
continue;
- std::map<COutPoint, CInPoint>::iterator it = mapNextTx.lower_bound(COutPoint(txin.prevout.hash, 0));
- if (it == mapNextTx.end() || it->first.hash != txin.prevout.hash)
+ auto iter = mapNextTx.lower_bound(COutPoint(txin.prevout.hash, 0));
+ if (iter == mapNextTx.end() || iter->first->hash != txin.prevout.hash)
pvNoSpendsRemaining->push_back(txin.prevout.hash);
}
}
diff --git a/src/txmempool.h b/src/txmempool.h
index 9203171868..941644b2b2 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -7,18 +7,22 @@
#define BITCOIN_TXMEMPOOL_H
#include <list>
+#include <memory>
#include <set>
#include "amount.h"
#include "coins.h"
+#include "indirectmap.h"
#include "primitives/transaction.h"
#include "sync.h"
#undef foreach
#include "boost/multi_index_container.hpp"
#include "boost/multi_index/ordered_index.hpp"
+#include "boost/multi_index/hashed_index.hpp"
class CAutoFile;
+class CBlockIndex;
inline double AllowFreeThreshold()
{
@@ -35,6 +39,21 @@ inline bool AllowFree(double dPriority)
/** Fake height value used in CCoins to signify they are only in the memory pool (since 0.8) */
static const unsigned int MEMPOOL_HEIGHT = 0x7FFFFFFF;
+struct LockPoints
+{
+ // Will be set to the blockchain height and median time past
+ // values that would be necessary to satisfy all relative locktime
+ // constraints (BIP68) of this tx given our view of block chain history
+ int height;
+ int64_t time;
+ // As long as the current chain descends from the highest height block
+ // containing one of the inputs used in the calculation, then the cached
+ // values are still valid even after a reorg.
+ CBlockIndex* maxInputBlock;
+
+ LockPoints() : height(0), time(0), maxInputBlock(NULL) { }
+};
+
class CTxMemPool;
/** \class CTxMemPoolEntry
@@ -44,12 +63,12 @@ class CTxMemPool;
* ("descendant" transactions).
*
* When a new entry is added to the mempool, we update the descendant state
- * (nCountWithDescendants, nSizeWithDescendants, and nFeesWithDescendants) for
+ * (nCountWithDescendants, nSizeWithDescendants, and nModFeesWithDescendants) for
* all ancestors of the newly added transaction.
*
* If updating the descendant state is skipped, we can mark the entry as
- * "dirty", and set nSizeWithDescendants/nFeesWithDescendants to equal nTxSize/
- * nTxFee. (This can potentially happen during a reorg, where we limit the
+ * "dirty", and set nSizeWithDescendants/nModFeesWithDescendants to equal nTxSize/
+ * nFee+feeDelta. (This can potentially happen during a reorg, where we limit the
* amount of work we're willing to do to avoid consuming too much CPU.)
*
*/
@@ -57,68 +76,83 @@ class CTxMemPool;
class CTxMemPoolEntry
{
private:
- CTransaction tx;
- CAmount nFee; //! Cached to avoid expensive parent-transaction lookups
- size_t nTxSize; //! ... and avoid recomputing tx size
- size_t nModSize; //! ... and modified size for priority
- size_t nUsageSize; //! ... and total memory usage
- int64_t nTime; //! Local time when entering the mempool
- double entryPriority; //! Priority when entering the mempool
- unsigned int entryHeight; //! Chain height when entering the mempool
- bool hadNoDependencies; //! Not dependent on any other txs when it entered the mempool
- CAmount inChainInputValue; //! Sum of all txin values that are already in blockchain
- bool spendsCoinbase; //! keep track of transactions that spend a coinbase
- unsigned int sigOpCount; //! Legacy sig ops plus P2SH sig op count
- int64_t feeDelta; //! Used for determining the priority of the transaction for mining in a block
+ std::shared_ptr<const CTransaction> tx;
+ CAmount nFee; //!< Cached to avoid expensive parent-transaction lookups
+ size_t nTxWeight; //!< ... and avoid recomputing tx weight (also used for GetTxSize())
+ size_t nModSize; //!< ... and modified size for priority
+ size_t nUsageSize; //!< ... and total memory usage
+ int64_t nTime; //!< Local time when entering the mempool
+ double entryPriority; //!< Priority when entering the mempool
+ unsigned int entryHeight; //!< Chain height when entering the mempool
+ bool hadNoDependencies; //!< Not dependent on any other txs when it entered the mempool
+ CAmount inChainInputValue; //!< Sum of all txin values that are already in blockchain
+ bool spendsCoinbase; //!< keep track of transactions that spend a coinbase
+ int64_t sigOpCost; //!< Total sigop cost
+ int64_t feeDelta; //!< Used for determining the priority of the transaction for mining in a block
+ LockPoints lockPoints; //!< Track the height and time at which tx was final
// Information about descendants of this transaction that are in the
// mempool; if we remove this transaction we must remove all of these
// descendants as well. if nCountWithDescendants is 0, treat this entry as
- // dirty, and nSizeWithDescendants and nFeesWithDescendants will not be
+ // dirty, and nSizeWithDescendants and nModFeesWithDescendants will not be
// correct.
- uint64_t nCountWithDescendants; //! number of descendant transactions
- uint64_t nSizeWithDescendants; //! ... and size
- CAmount nFeesWithDescendants; //! ... and total fees (all including us)
+ uint64_t nCountWithDescendants; //!< number of descendant transactions
+ uint64_t nSizeWithDescendants; //!< ... and size
+ CAmount nModFeesWithDescendants; //!< ... and total fees (all including us)
+
+ // Analogous statistics for ancestor transactions
+ uint64_t nCountWithAncestors;
+ uint64_t nSizeWithAncestors;
+ CAmount nModFeesWithAncestors;
+ int64_t nSigOpCostWithAncestors;
public:
CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee,
int64_t _nTime, double _entryPriority, unsigned int _entryHeight,
bool poolHasNoInputsOf, CAmount _inChainInputValue, bool spendsCoinbase,
- unsigned int nSigOps);
+ int64_t nSigOpsCost, LockPoints lp);
CTxMemPoolEntry(const CTxMemPoolEntry& other);
- const CTransaction& GetTx() const { return this->tx; }
+ const CTransaction& GetTx() const { return *this->tx; }
+ std::shared_ptr<const CTransaction> GetSharedTx() const { return this->tx; }
/**
* Fast calculation of lower bound of current priority as update
* from entry priority. Only inputs that were originally in-chain will age.
*/
double GetPriority(unsigned int currentHeight) const;
const CAmount& GetFee() const { return nFee; }
- size_t GetTxSize() const { return nTxSize; }
+ size_t GetTxSize() const;
+ size_t GetTxWeight() const { return nTxWeight; }
int64_t GetTime() const { return nTime; }
unsigned int GetHeight() const { return entryHeight; }
bool WasClearAtEntry() const { return hadNoDependencies; }
- unsigned int GetSigOpCount() const { return sigOpCount; }
+ int64_t GetSigOpCost() const { return sigOpCost; }
int64_t GetModifiedFee() const { return nFee + feeDelta; }
size_t DynamicMemoryUsage() const { return nUsageSize; }
+ const LockPoints& GetLockPoints() const { return lockPoints; }
// Adjusts the descendant state, if this entry is not dirty.
- void UpdateState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount);
- // Updates the fee delta used for mining priority score
+ void UpdateDescendantState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount);
+ // Adjusts the ancestor state
+ void UpdateAncestorState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount, int modifySigOps);
+ // Updates the fee delta used for mining priority score, and the
+ // modified fees with descendants.
void UpdateFeeDelta(int64_t feeDelta);
-
- /** We can set the entry to be dirty if doing the full calculation of in-
- * mempool descendants will be too expensive, which can potentially happen
- * when re-adding transactions from a block back to the mempool.
- */
- void SetDirty();
- bool IsDirty() const { return nCountWithDescendants == 0; }
+ // Update the LockPoints after a reorg
+ void UpdateLockPoints(const LockPoints& lp);
uint64_t GetCountWithDescendants() const { return nCountWithDescendants; }
uint64_t GetSizeWithDescendants() const { return nSizeWithDescendants; }
- CAmount GetFeesWithDescendants() const { return nFeesWithDescendants; }
+ CAmount GetModFeesWithDescendants() const { return nModFeesWithDescendants; }
bool GetSpendsCoinbase() const { return spendsCoinbase; }
+
+ uint64_t GetCountWithAncestors() const { return nCountWithAncestors; }
+ uint64_t GetSizeWithAncestors() const { return nSizeWithAncestors; }
+ CAmount GetModFeesWithAncestors() const { return nModFeesWithAncestors; }
+ int64_t GetSigOpCostWithAncestors() const { return nSigOpCostWithAncestors; }
+
+ mutable size_t vTxHashesIdx; //!< Index in mempool's vTxHashes
};
// Helpers for modifying CTxMemPool::mapTx, which is a boost multi_index.
@@ -129,7 +163,7 @@ struct update_descendant_state
{}
void operator() (CTxMemPoolEntry &e)
- { e.UpdateState(modifySize, modifyFee, modifyCount); }
+ { e.UpdateDescendantState(modifySize, modifyFee, modifyCount); }
private:
int64_t modifySize;
@@ -137,10 +171,20 @@ struct update_descendant_state
int64_t modifyCount;
};
-struct set_dirty
+struct update_ancestor_state
{
+ update_ancestor_state(int64_t _modifySize, CAmount _modifyFee, int64_t _modifyCount, int64_t _modifySigOpsCost) :
+ modifySize(_modifySize), modifyFee(_modifyFee), modifyCount(_modifyCount), modifySigOpsCost(_modifySigOpsCost)
+ {}
+
void operator() (CTxMemPoolEntry &e)
- { e.SetDirty(); }
+ { e.UpdateAncestorState(modifySize, modifyFee, modifyCount, modifySigOpsCost); }
+
+ private:
+ int64_t modifySize;
+ CAmount modifyFee;
+ int64_t modifyCount;
+ int64_t modifySigOpsCost;
};
struct update_fee_delta
@@ -153,6 +197,16 @@ private:
int64_t feeDelta;
};
+struct update_lock_points
+{
+ update_lock_points(const LockPoints& _lp) : lp(_lp) { }
+
+ void operator() (CTxMemPoolEntry &e) { e.UpdateLockPoints(lp); }
+
+private:
+ const LockPoints& lp;
+};
+
// extracts a TxMemPoolEntry's transaction hash
struct mempoolentry_txid
{
@@ -163,27 +217,27 @@ struct mempoolentry_txid
}
};
-/** \class CompareTxMemPoolEntryByFee
+/** \class CompareTxMemPoolEntryByDescendantScore
*
- * Sort an entry by max(feerate of entry's tx, feerate with all descendants).
+ * Sort an entry by max(score/size of entry's tx, score/size with all descendants).
*/
-class CompareTxMemPoolEntryByFee
+class CompareTxMemPoolEntryByDescendantScore
{
public:
bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b)
{
- bool fUseADescendants = UseDescendantFeeRate(a);
- bool fUseBDescendants = UseDescendantFeeRate(b);
+ bool fUseADescendants = UseDescendantScore(a);
+ bool fUseBDescendants = UseDescendantScore(b);
- double aFees = fUseADescendants ? a.GetFeesWithDescendants() : a.GetFee();
+ double aModFee = fUseADescendants ? a.GetModFeesWithDescendants() : a.GetModifiedFee();
double aSize = fUseADescendants ? a.GetSizeWithDescendants() : a.GetTxSize();
- double bFees = fUseBDescendants ? b.GetFeesWithDescendants() : b.GetFee();
+ double bModFee = fUseBDescendants ? b.GetModFeesWithDescendants() : b.GetModifiedFee();
double bSize = fUseBDescendants ? b.GetSizeWithDescendants() : b.GetTxSize();
// Avoid division by rewriting (a/b > c/d) as (a*d > c*b).
- double f1 = aFees * bSize;
- double f2 = aSize * bFees;
+ double f1 = aModFee * bSize;
+ double f2 = aSize * bModFee;
if (f1 == f2) {
return a.GetTime() >= b.GetTime();
@@ -191,11 +245,11 @@ public:
return f1 < f2;
}
- // Calculate which feerate to use for an entry (avoiding division).
- bool UseDescendantFeeRate(const CTxMemPoolEntry &a)
+ // Calculate which score to use for an entry (avoiding division).
+ bool UseDescendantScore(const CTxMemPoolEntry &a)
{
- double f1 = (double)a.GetFee() * a.GetSizeWithDescendants();
- double f2 = (double)a.GetFeesWithDescendants() * a.GetTxSize();
+ double f1 = (double)a.GetModifiedFee() * a.GetSizeWithDescendants();
+ double f2 = (double)a.GetModFeesWithDescendants() * a.GetTxSize();
return f2 > f1;
}
};
@@ -227,31 +281,64 @@ public:
}
};
+class CompareTxMemPoolEntryByAncestorFee
+{
+public:
+ bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b)
+ {
+ double aFees = a.GetModFeesWithAncestors();
+ double aSize = a.GetSizeWithAncestors();
+
+ double bFees = b.GetModFeesWithAncestors();
+ double bSize = b.GetSizeWithAncestors();
+
+ // Avoid division by rewriting (a/b > c/d) as (a*d > c*b).
+ double f1 = aFees * bSize;
+ double f2 = aSize * bFees;
+
+ if (f1 == f2) {
+ return a.GetTx().GetHash() < b.GetTx().GetHash();
+ }
+
+ return f1 > f2;
+ }
+};
+
+// Multi_index tag names
+struct descendant_score {};
+struct entry_time {};
+struct mining_score {};
+struct ancestor_score {};
+
class CBlockPolicyEstimator;
-/** An inpoint - a combination of a transaction and an index n into its vin */
-class CInPoint
+/**
+ * Information about a mempool transaction.
+ */
+struct TxMempoolInfo
{
-public:
- const CTransaction* ptx;
- uint32_t n;
-
- CInPoint() { SetNull(); }
- CInPoint(const CTransaction* ptxIn, uint32_t nIn) { ptx = ptxIn; n = nIn; }
- void SetNull() { ptx = NULL; n = (uint32_t) -1; }
- bool IsNull() const { return (ptx == NULL && n == (uint32_t) -1); }
- size_t DynamicMemoryUsage() const { return 0; }
+ /** The transaction itself */
+ std::shared_ptr<const CTransaction> tx;
+
+ /** Time the transaction entered the mempool. */
+ int64_t nTime;
+
+ /** Feerate of the transaction. */
+ CFeeRate feeRate;
};
/**
- * CTxMemPool stores valid-according-to-the-current-best-chain
- * transactions that may be included in the next block.
+ * CTxMemPool stores valid-according-to-the-current-best-chain transactions
+ * that may be included in the next block.
*
- * Transactions are added when they are seen on the network
- * (or created by the local node), but not all transactions seen
- * are added to the pool: if a new transaction double-spends
- * an input of a transaction in the pool, it is dropped,
- * as are non-standard transactions.
+ * Transactions are added when they are seen on the network (or created by the
+ * local node), but not all transactions seen are added to the pool. For
+ * example, the following new transactions will not be added to the mempool:
+ * - a transaction which doesn't make the mimimum fee requirements.
+ * - a new transaction that double-spends an input of a transaction already in
+ * the pool where the new transaction does not meet the Replace-By-Fee
+ * requirements as defined in BIP 125.
+ * - a non-standard transaction.
*
* CTxMemPool::mapTx, and CTxMemPoolEntry bookkeeping:
*
@@ -323,18 +410,18 @@ public:
class CTxMemPool
{
private:
- uint32_t nCheckFrequency; //! Value n means that n times in 2^32 we check.
+ uint32_t nCheckFrequency; //!< Value n means that n times in 2^32 we check.
unsigned int nTransactionsUpdated;
CBlockPolicyEstimator* minerPolicyEstimator;
- uint64_t totalTxSize; //! sum of all mempool tx' byte sizes
- uint64_t cachedInnerUsage; //! sum of dynamic memory usage of all the map elements (NOT the maps themselves)
+ uint64_t totalTxSize; //!< sum of all mempool tx' byte sizes
+ uint64_t cachedInnerUsage; //!< sum of dynamic memory usage of all the map elements (NOT the maps themselves)
CFeeRate minReasonableRelayFee;
mutable int64_t lastRollingFeeUpdate;
mutable bool blockSinceLastRollingFeeBump;
- mutable double rollingMinimumFeeRate; //! minimum fee to get into the pool, decreases exponentially
+ mutable double rollingMinimumFeeRate; //!< minimum fee to get into the pool, decreases exponentially
void trackPackageRemoved(const CFeeRate& rate);
@@ -346,28 +433,40 @@ public:
CTxMemPoolEntry,
boost::multi_index::indexed_by<
// sorted by txid
- boost::multi_index::ordered_unique<mempoolentry_txid>,
+ boost::multi_index::hashed_unique<mempoolentry_txid, SaltedTxidHasher>,
// sorted by fee rate
boost::multi_index::ordered_non_unique<
+ boost::multi_index::tag<descendant_score>,
boost::multi_index::identity<CTxMemPoolEntry>,
- CompareTxMemPoolEntryByFee
+ CompareTxMemPoolEntryByDescendantScore
>,
// sorted by entry time
boost::multi_index::ordered_non_unique<
+ boost::multi_index::tag<entry_time>,
boost::multi_index::identity<CTxMemPoolEntry>,
CompareTxMemPoolEntryByEntryTime
- >,
+ >,
// sorted by score (for mining prioritization)
boost::multi_index::ordered_unique<
+ boost::multi_index::tag<mining_score>,
boost::multi_index::identity<CTxMemPoolEntry>,
CompareTxMemPoolEntryByScore
+ >,
+ // sorted by fee rate with ancestors
+ boost::multi_index::ordered_non_unique<
+ boost::multi_index::tag<ancestor_score>,
+ boost::multi_index::identity<CTxMemPoolEntry>,
+ CompareTxMemPoolEntryByAncestorFee
>
>
> indexed_transaction_set;
mutable CCriticalSection cs;
indexed_transaction_set mapTx;
+
typedef indexed_transaction_set::nth_index<0>::type::iterator txiter;
+ std::vector<std::pair<uint256, txiter> > vTxHashes; //!< All tx witness hashes/entries in mapTx, in random order
+
struct CompareIteratorByHash {
bool operator()(const txiter &a, const txiter &b) const {
return a->GetTx().GetHash() < b->GetTx().GetHash();
@@ -391,8 +490,10 @@ private:
void UpdateParent(txiter entry, txiter parent, bool add);
void UpdateChild(txiter entry, txiter child, bool add);
+ std::vector<indexed_transaction_set::const_iterator> GetSortedDepthAndScore() const;
+
public:
- std::map<COutPoint, CInPoint> mapNextTx;
+ indirectmap<COutPoint, const CTransaction*> mapNextTx;
std::map<uint256, std::pair<double, CAmount> > mapDeltas;
/** Create a new CTxMemPool.
@@ -419,13 +520,14 @@ public:
bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, bool fCurrentEstimate = true);
bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, setEntries &setAncestors, bool fCurrentEstimate = true);
- void remove(const CTransaction &tx, std::list<CTransaction>& removed, bool fRecursive = false);
+ void removeRecursive(const CTransaction &tx, std::list<CTransaction>& removed);
void removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight, int flags);
void removeConflicts(const CTransaction &tx, std::list<CTransaction>& removed);
void removeForBlock(const std::vector<CTransaction>& vtx, unsigned int nBlockHeight,
std::list<CTransaction>& conflicts, bool fCurrentEstimate = true);
void clear();
void _clear(); //lock free
+ bool CompareDepthAndScore(const uint256& hasha, const uint256& hashb);
void queryHashes(std::vector<uint256>& vtxid);
void pruneSpent(const uint256& hash, CCoins &coins);
unsigned int GetTransactionsUpdated() const;
@@ -444,8 +546,12 @@ public:
public:
/** Remove a set of transactions from the mempool.
* If a transaction is in this set, then all in-mempool descendants must
- * also be in the set.*/
- void RemoveStaged(setEntries &stage);
+ * also be in the set, unless this transaction is being removed for being
+ * in a block.
+ * Set updateDescendants to true when removing a tx that was in a block, so
+ * that any in-mempool descendants have their ancestor state updated.
+ */
+ void RemoveStaged(setEntries &stage, bool updateDescendants);
/** When adding transactions from a disconnected block back to the mempool,
* new mempool entries may have children in the mempool (which is generally
@@ -468,7 +574,7 @@ public:
* fSearchForParents = whether to search a tx's vin for in-mempool parents, or
* look up parents from mapLinks. Must be true for entries not in the mempool
*/
- bool CalculateMemPoolAncestors(const CTxMemPoolEntry &entry, setEntries &setAncestors, uint64_t limitAncestorCount, uint64_t limitAncestorSize, uint64_t limitDescendantCount, uint64_t limitDescendantSize, std::string &errString, bool fSearchForParents = true);
+ bool CalculateMemPoolAncestors(const CTxMemPoolEntry &entry, setEntries &setAncestors, uint64_t limitAncestorCount, uint64_t limitAncestorSize, uint64_t limitDescendantCount, uint64_t limitDescendantSize, std::string &errString, bool fSearchForParents = true) const;
/** Populate setDescendants with all in-mempool descendants of hash.
* Assumes that setDescendants includes all in-mempool descendants of anything
@@ -510,7 +616,9 @@ public:
return (mapTx.count(hash) != 0);
}
- bool lookup(uint256 hash, CTransaction& result) const;
+ std::shared_ptr<const CTransaction> get(const uint256& hash) const;
+ TxMempoolInfo info(const uint256& hash) const;
+ std::vector<TxMempoolInfo> infoAll() const;
/** Estimate fee rate needed to get into the next nBlocks
* If no answer can be given at nBlocks, return an estimate
@@ -546,21 +654,21 @@ private:
* updated and hence their state is already reflected in the parent
* state).
*
- * If updating an entry requires looking at more than maxDescendantsToVisit
- * transactions, outside of the ones in setExclude, then give up.
- *
* cachedDescendants will be updated with the descendants of the transaction
* being updated, so that future invocations don't need to walk the
* same transaction again, if encountered in another transaction chain.
*/
- bool UpdateForDescendants(txiter updateIt,
- int maxDescendantsToVisit,
+ void UpdateForDescendants(txiter updateIt,
cacheMap &cachedDescendants,
const std::set<uint256> &setExclude);
/** Update ancestors of hash to add/remove it as a descendant transaction. */
void UpdateAncestorsOf(bool add, txiter hash, setEntries &setAncestors);
- /** For each transaction being removed, update ancestors and any direct children. */
- void UpdateForRemoveFromMempool(const setEntries &entriesToRemove);
+ /** Set ancestor state for an entry */
+ void UpdateEntryForAncestors(txiter it, const setEntries &setAncestors);
+ /** For each transaction being removed, update ancestors and any direct children.
+ * If updateDescendants is true, then also update in-mempool descendants'
+ * ancestor state. */
+ void UpdateForRemoveFromMempool(const setEntries &entriesToRemove, bool updateDescendants);
/** Sever link between specified transaction and direct children. */
void UpdateChildrenForRemoval(txiter entry);
@@ -582,10 +690,10 @@ private:
class CCoinsViewMemPool : public CCoinsViewBacked
{
protected:
- CTxMemPool &mempool;
+ const CTxMemPool& mempool;
public:
- CCoinsViewMemPool(CCoinsView *baseIn, CTxMemPool &mempoolIn);
+ CCoinsViewMemPool(CCoinsView* baseIn, const CTxMemPool& mempoolIn);
bool GetCoins(const uint256 &txid, CCoins &coins) const;
bool HaveCoins(const uint256 &txid) const;
};
diff --git a/src/ui_interface.cpp b/src/ui_interface.cpp
new file mode 100644
index 0000000000..74a13e0e05
--- /dev/null
+++ b/src/ui_interface.cpp
@@ -0,0 +1,29 @@
+// Copyright (c) 2010-2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "ui_interface.h"
+#include "util.h"
+
+CClientUIInterface uiInterface;
+
+bool InitError(const std::string& str)
+{
+ uiInterface.ThreadSafeMessageBox(str, "", CClientUIInterface::MSG_ERROR);
+ return false;
+}
+
+void InitWarning(const std::string& str)
+{
+ uiInterface.ThreadSafeMessageBox(str, "", CClientUIInterface::MSG_WARNING);
+}
+
+std::string AmountHighWarn(const std::string& optname)
+{
+ return strprintf(_("%s is set very high!"), optname);
+}
+
+std::string AmountErrMsg(const char* const optname, const std::string& strValue)
+{
+ return strprintf(_("Invalid amount for -%s=<amount>: '%s'"), optname, strValue);
+}
diff --git a/src/ui_interface.h b/src/ui_interface.h
index 00d9303124..177ff238db 100644
--- a/src/ui_interface.h
+++ b/src/ui_interface.h
@@ -1,5 +1,5 @@
// Copyright (c) 2010 Satoshi Nakamoto
-// 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.
@@ -76,6 +76,9 @@ public:
/** Show message box. */
boost::signals2::signal<bool (const std::string& message, const std::string& caption, unsigned int style), boost::signals2::last_value<bool> > ThreadSafeMessageBox;
+ /** If possible, ask the user a question. If not, falls back to ThreadSafeMessageBox(noninteractive_message, caption, style) and returns false. */
+ boost::signals2::signal<bool (const std::string& message, const std::string& noninteractive_message, const std::string& caption, unsigned int style), boost::signals2::last_value<bool> > ThreadSafeQuestion;
+
/** Progress message during initialization. */
boost::signals2::signal<void (const std::string &message)> InitMessage;
@@ -83,10 +86,9 @@ public:
boost::signals2::signal<void (int newNumConnections)> NotifyNumConnectionsChanged;
/**
- * New, updated or cancelled alert.
- * @note called with lock cs_mapAlerts held.
+ * Status bar alerts changed.
*/
- boost::signals2::signal<void (const uint256 &hash, ChangeType status)> NotifyAlertChanged;
+ boost::signals2::signal<void ()> NotifyAlertChanged;
/** A wallet has been loaded. */
boost::signals2::signal<void (CWallet* wallet)> LoadWallet;
@@ -97,10 +99,23 @@ public:
/** New block has been accepted */
boost::signals2::signal<void (bool, const CBlockIndex *)> NotifyBlockTip;
+ /** Best header has changed */
+ boost::signals2::signal<void (bool, const CBlockIndex *)> NotifyHeaderTip;
+
/** Banlist did change. */
boost::signals2::signal<void (void)> BannedListChanged;
};
+/** Show warning message **/
+void InitWarning(const std::string& str);
+
+/** Show error message **/
+bool InitError(const std::string& str);
+
+std::string AmountHighWarn(const std::string& optname);
+
+std::string AmountErrMsg(const char* const optname, const std::string& strValue);
+
extern CClientUIInterface uiInterface;
#endif // BITCOIN_UI_INTERFACE_H
diff --git a/src/uint256.cpp b/src/uint256.cpp
index 25148808c6..f22ddcd1ef 100644
--- a/src/uint256.cpp
+++ b/src/uint256.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -80,67 +80,3 @@ template std::string base_blob<256>::GetHex() const;
template std::string base_blob<256>::ToString() const;
template void base_blob<256>::SetHex(const char*);
template void base_blob<256>::SetHex(const std::string&);
-
-static void inline HashMix(uint32_t& a, uint32_t& b, uint32_t& c)
-{
- // Taken from lookup3, by Bob Jenkins.
- a -= c;
- a ^= ((c << 4) | (c >> 28));
- c += b;
- b -= a;
- b ^= ((a << 6) | (a >> 26));
- a += c;
- c -= b;
- c ^= ((b << 8) | (b >> 24));
- b += a;
- a -= c;
- a ^= ((c << 16) | (c >> 16));
- c += b;
- b -= a;
- b ^= ((a << 19) | (a >> 13));
- a += c;
- c -= b;
- c ^= ((b << 4) | (b >> 28));
- b += a;
-}
-
-static void inline HashFinal(uint32_t& a, uint32_t& b, uint32_t& c)
-{
- // Taken from lookup3, by Bob Jenkins.
- c ^= b;
- c -= ((b << 14) | (b >> 18));
- a ^= c;
- a -= ((c << 11) | (c >> 21));
- b ^= a;
- b -= ((a << 25) | (a >> 7));
- c ^= b;
- c -= ((b << 16) | (b >> 16));
- a ^= c;
- a -= ((c << 4) | (c >> 28));
- b ^= a;
- b -= ((a << 14) | (a >> 18));
- c ^= b;
- c -= ((b << 24) | (b >> 8));
-}
-
-uint64_t uint256::GetHash(const uint256& salt) const
-{
- uint32_t a, b, c;
- const uint32_t *pn = (const uint32_t*)data;
- const uint32_t *salt_pn = (const uint32_t*)salt.data;
- a = b = c = 0xdeadbeef + WIDTH;
-
- a += pn[0] ^ salt_pn[0];
- b += pn[1] ^ salt_pn[1];
- c += pn[2] ^ salt_pn[2];
- HashMix(a, b, c);
- a += pn[3] ^ salt_pn[3];
- b += pn[4] ^ salt_pn[4];
- c += pn[5] ^ salt_pn[5];
- HashMix(a, b, c);
- a += pn[6] ^ salt_pn[6];
- b += pn[7] ^ salt_pn[7];
- HashFinal(a, b, c);
-
- return ((((uint64_t)b) << 32) | c);
-}
diff --git a/src/uint256.h b/src/uint256.h
index 6e37cd5d46..dd8432d74c 100644
--- a/src/uint256.h
+++ b/src/uint256.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -42,9 +42,11 @@ public:
memset(data, 0, sizeof(data));
}
- friend inline bool operator==(const base_blob& a, const base_blob& b) { return memcmp(a.data, b.data, sizeof(a.data)) == 0; }
- friend inline bool operator!=(const base_blob& a, const base_blob& b) { return memcmp(a.data, b.data, sizeof(a.data)) != 0; }
- friend inline bool operator<(const base_blob& a, const base_blob& b) { return memcmp(a.data, b.data, sizeof(a.data)) < 0; }
+ inline int Compare(const base_blob& other) const { return memcmp(data, other.data, sizeof(data)); }
+
+ friend inline bool operator==(const base_blob& a, const base_blob& b) { return a.Compare(b) == 0; }
+ friend inline bool operator!=(const base_blob& a, const base_blob& b) { return a.Compare(b) != 0; }
+ friend inline bool operator<(const base_blob& a, const base_blob& b) { return a.Compare(b) < 0; }
std::string GetHex() const;
void SetHex(const char* psz);
@@ -81,6 +83,19 @@ public:
return sizeof(data);
}
+ uint64_t GetUint64(int pos) const
+ {
+ const uint8_t* ptr = data + pos * 8;
+ return ((uint64_t)ptr[0]) | \
+ ((uint64_t)ptr[1]) << 8 | \
+ ((uint64_t)ptr[2]) << 16 | \
+ ((uint64_t)ptr[3]) << 24 | \
+ ((uint64_t)ptr[4]) << 32 | \
+ ((uint64_t)ptr[5]) << 40 | \
+ ((uint64_t)ptr[6]) << 48 | \
+ ((uint64_t)ptr[7]) << 56;
+ }
+
template<typename Stream>
void Serialize(Stream& s, int nType, int nVersion) const
{
@@ -125,11 +140,6 @@ public:
{
return ReadLE64(data);
}
-
- /** A more secure, salted hash function.
- * @note This hash is not stable between little and big endian.
- */
- uint64_t GetHash(const uint256& salt) const;
};
/* uint256 from const char *.
diff --git a/src/undo.h b/src/undo.h
index 1c4ed95bf2..d4fc84c90c 100644
--- a/src/undo.h
+++ b/src/undo.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 The Bitcoin Core developers
+// 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.
diff --git a/src/univalue/.travis.yml b/src/univalue/.travis.yml
index d318d9cc8f..132743d349 100644
--- a/src/univalue/.travis.yml
+++ b/src/univalue/.travis.yml
@@ -1,4 +1,3 @@
-
language: cpp
compiler:
@@ -26,6 +25,7 @@ addons:
- pkg-config
before_script:
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew uninstall libtool; brew install libtool; fi
- if [ -n "$USE_SHELL" ]; then export CONFIG_SHELL="$USE_SHELL"; fi
- test -n "$USE_SHELL" && eval '"$USE_SHELL" -c "./autogen.sh"' || ./autogen.sh
diff --git a/src/univalue/Makefile.am b/src/univalue/Makefile.am
index 34fe9e3f13..6c1ec81e63 100644
--- a/src/univalue/Makefile.am
+++ b/src/univalue/Makefile.am
@@ -3,7 +3,7 @@ ACLOCAL_AMFLAGS = -I build-aux/m4
.INTERMEDIATE: $(GENBIN)
include_HEADERS = include/univalue.h
-noinst_HEADERS = lib/univalue_escapes.h
+noinst_HEADERS = lib/univalue_escapes.h lib/univalue_utffilter.h
lib_LTLIBRARIES = libunivalue.la
@@ -73,6 +73,10 @@ TEST_FILES = \
$(TEST_DATA_DIR)/fail35.json \
$(TEST_DATA_DIR)/fail36.json \
$(TEST_DATA_DIR)/fail37.json \
+ $(TEST_DATA_DIR)/fail38.json \
+ $(TEST_DATA_DIR)/fail39.json \
+ $(TEST_DATA_DIR)/fail40.json \
+ $(TEST_DATA_DIR)/fail41.json \
$(TEST_DATA_DIR)/fail3.json \
$(TEST_DATA_DIR)/fail4.json \
$(TEST_DATA_DIR)/fail5.json \
@@ -83,6 +87,7 @@ TEST_FILES = \
$(TEST_DATA_DIR)/pass1.json \
$(TEST_DATA_DIR)/pass2.json \
$(TEST_DATA_DIR)/pass3.json \
- $(TEST_DATA_DIR)/round1.json
+ $(TEST_DATA_DIR)/round1.json \
+ $(TEST_DATA_DIR)/round2.json
EXTRA_DIST=$(TEST_FILES) $(GEN_SRCS)
diff --git a/src/univalue/configure.ac b/src/univalue/configure.ac
index 0515b632bd..93d3ba945d 100644
--- a/src/univalue/configure.ac
+++ b/src/univalue/configure.ac
@@ -1,7 +1,7 @@
m4_define([libunivalue_major_version], [1])
m4_define([libunivalue_minor_version], [1])
-m4_define([libunivalue_micro_version], [1])
-m4_define([libunivalue_interface_age], [1])
+m4_define([libunivalue_micro_version], [2])
+m4_define([libunivalue_interface_age], [2])
# If you need a modifier for the version number.
# Normally empty, but can be used to make "fixup" releases.
m4_define([libunivalue_extraversion], [])
@@ -14,7 +14,7 @@ m4_define([libunivalue_age], [m4_eval(libunivalue_binary_age - libunivalue_inter
m4_define([libunivalue_version], [libunivalue_major_version().libunivalue_minor_version().libunivalue_micro_version()libunivalue_extraversion()])
-AC_INIT([univalue], [1.0.1],
+AC_INIT([univalue], [1.0.2],
[http://github.com/jgarzik/univalue/])
dnl make the compilation flags quiet unless V=1 is used
diff --git a/src/univalue/include/univalue.h b/src/univalue/include/univalue.h
index 8428b1c683..e8ce283519 100644
--- a/src/univalue/include/univalue.h
+++ b/src/univalue/include/univalue.h
@@ -56,7 +56,7 @@ public:
bool setNumStr(const std::string& val);
bool setInt(uint64_t val);
bool setInt(int64_t val);
- bool setInt(int val) { return setInt((int64_t)val); }
+ bool setInt(int val_) { return setInt((int64_t)val_); }
bool setFloat(double val);
bool setStr(const std::string& val);
bool setArray();
@@ -95,28 +95,28 @@ public:
bool push_backV(const std::vector<UniValue>& vec);
bool pushKV(const std::string& key, const UniValue& val);
- bool pushKV(const std::string& key, const std::string& val) {
- UniValue tmpVal(VSTR, val);
+ bool pushKV(const std::string& key, const std::string& val_) {
+ UniValue tmpVal(VSTR, val_);
return pushKV(key, tmpVal);
}
bool pushKV(const std::string& key, const char *val_) {
- std::string val(val_);
- return pushKV(key, val);
+ std::string _val(val_);
+ return pushKV(key, _val);
}
- bool pushKV(const std::string& key, int64_t val) {
- UniValue tmpVal(val);
+ bool pushKV(const std::string& key, int64_t val_) {
+ UniValue tmpVal(val_);
return pushKV(key, tmpVal);
}
- bool pushKV(const std::string& key, uint64_t val) {
- UniValue tmpVal(val);
+ bool pushKV(const std::string& key, uint64_t val_) {
+ UniValue tmpVal(val_);
return pushKV(key, tmpVal);
}
- bool pushKV(const std::string& key, int val) {
- UniValue tmpVal((int64_t)val);
+ bool pushKV(const std::string& key, int val_) {
+ UniValue tmpVal((int64_t)val_);
return pushKV(key, tmpVal);
}
- bool pushKV(const std::string& key, double val) {
- UniValue tmpVal(val);
+ bool pushKV(const std::string& key, double val_) {
+ UniValue tmpVal(val_);
return pushKV(key, tmpVal);
}
bool pushKVs(const UniValue& obj);
@@ -142,10 +142,10 @@ private:
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;
+ const std::vector<std::string>& getKeys() const;
+ const std::vector<UniValue>& getValues() const;
bool get_bool() const;
- std::string get_str() const;
+ const std::string& get_str() const;
int get_int() const;
int64_t get_int64() const;
double get_real() const;
diff --git a/src/univalue/lib/univalue.cpp b/src/univalue/lib/univalue.cpp
index 0076d6678e..5a2860c13f 100644
--- a/src/univalue/lib/univalue.cpp
+++ b/src/univalue/lib/univalue.cpp
@@ -119,32 +119,29 @@ bool UniValue::setNumStr(const string& val_)
return true;
}
-bool UniValue::setInt(uint64_t val)
+bool UniValue::setInt(uint64_t val_)
{
- string s;
ostringstream oss;
- oss << val;
+ oss << val_;
return setNumStr(oss.str());
}
-bool UniValue::setInt(int64_t val)
+bool UniValue::setInt(int64_t val_)
{
- string s;
ostringstream oss;
- oss << val;
+ oss << val_;
return setNumStr(oss.str());
}
-bool UniValue::setFloat(double val)
+bool UniValue::setFloat(double val_)
{
- string s;
ostringstream oss;
- oss << std::setprecision(16) << val;
+ oss << std::setprecision(16) << val_;
bool ret = setNumStr(oss.str());
typ = VNUM;
@@ -173,12 +170,12 @@ bool UniValue::setObject()
return true;
}
-bool UniValue::push_back(const UniValue& val)
+bool UniValue::push_back(const UniValue& val_)
{
if (typ != VARR)
return false;
- values.push_back(val);
+ values.push_back(val_);
return true;
}
@@ -192,13 +189,13 @@ bool UniValue::push_backV(const std::vector<UniValue>& vec)
return true;
}
-bool UniValue::pushKV(const std::string& key, const UniValue& val)
+bool UniValue::pushKV(const std::string& key, const UniValue& val_)
{
if (typ != VOBJ)
return false;
keys.push_back(key);
- values.push_back(val);
+ values.push_back(val_);
return true;
}
@@ -228,7 +225,7 @@ int UniValue::findKey(const std::string& key) const
bool UniValue::checkObject(const std::map<std::string,UniValue::VType>& t)
{
for (std::map<std::string,UniValue::VType>::const_iterator it = t.begin();
- it != t.end(); it++) {
+ it != t.end(); ++it) {
int idx = findKey(it->first);
if (idx < 0)
return false;
@@ -286,14 +283,14 @@ const UniValue& find_value(const UniValue& obj, const std::string& name)
return NullUniValue;
}
-std::vector<std::string> UniValue::getKeys() const
+const 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
+const 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");
@@ -307,7 +304,7 @@ bool UniValue::get_bool() const
return getBool();
}
-std::string UniValue::get_str() const
+const std::string& UniValue::get_str() const
{
if (typ != VSTR)
throw std::runtime_error("JSON value is not a string as expected");
diff --git a/src/univalue/lib/univalue_read.cpp b/src/univalue/lib/univalue_read.cpp
index c7516b9628..95bac6958d 100644
--- a/src/univalue/lib/univalue_read.cpp
+++ b/src/univalue/lib/univalue_read.cpp
@@ -6,6 +6,7 @@
#include <vector>
#include <stdio.h>
#include "univalue.h"
+#include "univalue_utffilter.h"
using namespace std;
@@ -174,41 +175,31 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
raw++; // skip "
string valStr;
+ JSONUTF8StringFilter writer(valStr);
while (*raw) {
- if (*raw < 0x20)
+ if ((unsigned char)*raw < 0x20)
return JTOK_ERR;
else if (*raw == '\\') {
raw++; // skip backslash
switch (*raw) {
- case '"': valStr += "\""; break;
- case '\\': valStr += "\\"; break;
- case '/': valStr += "/"; break;
- case 'b': valStr += "\b"; break;
- case 'f': valStr += "\f"; break;
- case 'n': valStr += "\n"; break;
- case 'r': valStr += "\r"; break;
- case 't': valStr += "\t"; break;
+ case '"': writer.push_back('\"'); break;
+ case '\\': writer.push_back('\\'); break;
+ case '/': writer.push_back('/'); break;
+ case 'b': writer.push_back('\b'); break;
+ case 'f': writer.push_back('\f'); break;
+ case 'n': writer.push_back('\n'); break;
+ case 'r': writer.push_back('\r'); break;
+ case 't': writer.push_back('\t'); break;
case 'u': {
unsigned int codepoint;
if (hatoui(raw + 1, raw + 1 + 4, codepoint) !=
raw + 1 + 4)
return JTOK_ERR;
-
- if (codepoint <= 0x7f)
- valStr.push_back((char)codepoint);
- else if (codepoint <= 0x7FF) {
- valStr.push_back((char)(0xC0 | (codepoint >> 6)));
- valStr.push_back((char)(0x80 | (codepoint & 0x3F)));
- } else if (codepoint <= 0xFFFF) {
- valStr.push_back((char)(0xE0 | (codepoint >> 12)));
- valStr.push_back((char)(0x80 | ((codepoint >> 6) & 0x3F)));
- valStr.push_back((char)(0x80 | (codepoint & 0x3F)));
- }
-
+ writer.push_back_u(codepoint);
raw += 4;
break;
}
@@ -226,11 +217,13 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
}
else {
- valStr += *raw;
+ writer.push_back(*raw);
raw++;
}
}
+ if (!writer.finalize())
+ return JTOK_ERR;
tokenVal = valStr;
consumed = (raw - rawStart);
return JTOK_STRING;
diff --git a/src/univalue/lib/univalue_utffilter.h b/src/univalue/lib/univalue_utffilter.h
new file mode 100644
index 0000000000..0e330dce9c
--- /dev/null
+++ b/src/univalue/lib/univalue_utffilter.h
@@ -0,0 +1,119 @@
+// Copyright 2016 Wladimir J. van der Laan
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#ifndef UNIVALUE_UTFFILTER_H
+#define UNIVALUE_UTFFILTER_H
+
+#include <string>
+
+/**
+ * Filter that generates and validates UTF-8, as well as collates UTF-16
+ * surrogate pairs as specified in RFC4627.
+ */
+class JSONUTF8StringFilter
+{
+public:
+ JSONUTF8StringFilter(std::string &s):
+ str(s), is_valid(true), codepoint(0), state(0), surpair(0)
+ {
+ }
+ // Write single 8-bit char (may be part of UTF-8 sequence)
+ void push_back(unsigned char ch)
+ {
+ if (state == 0) {
+ if (ch < 0x80) // 7-bit ASCII, fast direct pass-through
+ str.push_back(ch);
+ else if (ch < 0xc0) // Mid-sequence character, invalid in this state
+ is_valid = false;
+ else if (ch < 0xe0) { // Start of 2-byte sequence
+ codepoint = (ch & 0x1f) << 6;
+ state = 6;
+ } else if (ch < 0xf0) { // Start of 3-byte sequence
+ codepoint = (ch & 0x0f) << 12;
+ state = 12;
+ } else if (ch < 0xf8) { // Start of 4-byte sequence
+ codepoint = (ch & 0x07) << 18;
+ state = 18;
+ } else // Reserved, invalid
+ is_valid = false;
+ } else {
+ if ((ch & 0xc0) != 0x80) // Not a continuation, invalid
+ is_valid = false;
+ state -= 6;
+ codepoint |= (ch & 0x3f) << state;
+ if (state == 0)
+ push_back_u(codepoint);
+ }
+ }
+ // Write codepoint directly, possibly collating surrogate pairs
+ void push_back_u(unsigned int codepoint)
+ {
+ if (state) // Only accept full codepoints in open state
+ is_valid = false;
+ if (codepoint >= 0xD800 && codepoint < 0xDC00) { // First half of surrogate pair
+ if (surpair) // Two subsequent surrogate pair openers - fail
+ is_valid = false;
+ else
+ surpair = codepoint;
+ } else if (codepoint >= 0xDC00 && codepoint < 0xE000) { // Second half of surrogate pair
+ if (surpair) { // Open surrogate pair, expect second half
+ // Compute code point from UTF-16 surrogate pair
+ append_codepoint(0x10000 | ((surpair - 0xD800)<<10) | (codepoint - 0xDC00));
+ surpair = 0;
+ } else // Second half doesn't follow a first half - fail
+ is_valid = false;
+ } else {
+ if (surpair) // First half of surrogate pair not followed by second - fail
+ is_valid = false;
+ else
+ append_codepoint(codepoint);
+ }
+ }
+ // Check that we're in a state where the string can be ended
+ // No open sequences, no open surrogate pairs, etc
+ bool finalize()
+ {
+ if (state || surpair)
+ is_valid = false;
+ return is_valid;
+ }
+private:
+ std::string &str;
+ bool is_valid;
+ // Current UTF-8 decoding state
+ unsigned int codepoint;
+ int state; // Top bit to be filled in for next UTF-8 byte, or 0
+
+ // Keep track of the following state to handle the following section of
+ // RFC4627:
+ //
+ // To escape an extended character that is not in the Basic Multilingual
+ // Plane, the character is represented as a twelve-character sequence,
+ // encoding the UTF-16 surrogate pair. So, for example, a string
+ // containing only the G clef character (U+1D11E) may be represented as
+ // "\uD834\uDD1E".
+ //
+ // Two subsequent \u.... may have to be replaced with one actual codepoint.
+ unsigned int surpair; // First half of open UTF-16 surrogate pair, or 0
+
+ void append_codepoint(unsigned int codepoint)
+ {
+ if (codepoint <= 0x7f)
+ str.push_back((char)codepoint);
+ else if (codepoint <= 0x7FF) {
+ str.push_back((char)(0xC0 | (codepoint >> 6)));
+ str.push_back((char)(0x80 | (codepoint & 0x3F)));
+ } else if (codepoint <= 0xFFFF) {
+ str.push_back((char)(0xE0 | (codepoint >> 12)));
+ str.push_back((char)(0x80 | ((codepoint >> 6) & 0x3F)));
+ str.push_back((char)(0x80 | (codepoint & 0x3F)));
+ } else if (codepoint <= 0x1FFFFF) {
+ str.push_back((char)(0xF0 | (codepoint >> 18)));
+ str.push_back((char)(0x80 | ((codepoint >> 12) & 0x3F)));
+ str.push_back((char)(0x80 | ((codepoint >> 6) & 0x3F)));
+ str.push_back((char)(0x80 | (codepoint & 0x3F)));
+ }
+ }
+};
+
+#endif
diff --git a/src/univalue/lib/univalue_write.cpp b/src/univalue/lib/univalue_write.cpp
index ceb4cc9166..cfbdad3284 100644
--- a/src/univalue/lib/univalue_write.cpp
+++ b/src/univalue/lib/univalue_write.cpp
@@ -8,8 +8,6 @@
#include "univalue.h"
#include "univalue_escapes.h"
-// TODO: Using UTF8
-
using namespace std;
static string json_escape(const string& inS)
@@ -23,15 +21,8 @@ static string json_escape(const string& inS)
if (escStr)
outS += escStr;
-
- else if (ch < 0x80)
+ else
outS += ch;
-
- else { // TODO handle UTF-8 properly
- char tmpesc[16];
- sprintf(tmpesc, "\\u%04x", ch);
- outS += tmpesc;
- }
}
return outS;
diff --git a/src/univalue/test/fail38.json b/src/univalue/test/fail38.json
new file mode 100644
index 0000000000..b245e2e46c
--- /dev/null
+++ b/src/univalue/test/fail38.json
@@ -0,0 +1 @@
+["\ud834"]
diff --git a/src/univalue/test/fail39.json b/src/univalue/test/fail39.json
new file mode 100644
index 0000000000..7c9e263f27
--- /dev/null
+++ b/src/univalue/test/fail39.json
@@ -0,0 +1 @@
+["\udd61"]
diff --git a/src/univalue/test/fail40.json b/src/univalue/test/fail40.json
new file mode 100644
index 0000000000..664dc9e245
--- /dev/null
+++ b/src/univalue/test/fail40.json
@@ -0,0 +1 @@
+["…¡"] \ No newline at end of file
diff --git a/src/univalue/test/fail41.json b/src/univalue/test/fail41.json
new file mode 100644
index 0000000000..0de342a2b5
--- /dev/null
+++ b/src/univalue/test/fail41.json
@@ -0,0 +1 @@
+["ð…"] \ No newline at end of file
diff --git a/src/univalue/test/round2.json b/src/univalue/test/round2.json
new file mode 100644
index 0000000000..b766cccc68
--- /dev/null
+++ b/src/univalue/test/round2.json
@@ -0,0 +1 @@
+["a§■ðŽ’ð…¡"]
diff --git a/src/univalue/test/unitester.cpp b/src/univalue/test/unitester.cpp
index 5a052fe92c..05f3842cd1 100644
--- a/src/univalue/test/unitester.cpp
+++ b/src/univalue/test/unitester.cpp
@@ -22,6 +22,7 @@ string srcdir(JSON_TEST_SRC);
static bool test_failed = false;
#define d_assert(expr) { if (!(expr)) { test_failed = true; fprintf(stderr, "%s failed\n", filename.c_str()); } }
+#define f_assert(expr) { if (!(expr)) { test_failed = true; fprintf(stderr, "%s failed\n", __func__); } }
static std::string rtrim(std::string s)
{
@@ -108,6 +109,10 @@ static const char *filenames[] = {
"fail35.json",
"fail36.json",
"fail37.json",
+ "fail38.json", // invalid unicode: only first half of surrogate pair
+ "fail39.json", // invalid unicode: only second half of surrogate pair
+ "fail40.json", // invalid unicode: broken UTF-8
+ "fail41.json", // invalid unicode: unfinished UTF-8
"fail3.json",
"fail4.json", // extra comma
"fail5.json",
@@ -119,14 +124,40 @@ static const char *filenames[] = {
"pass2.json",
"pass3.json",
"round1.json", // round-trip test
+ "round2.json", // unicode
};
+// Test \u handling
+void unescape_unicode_test()
+{
+ UniValue val;
+ bool testResult;
+ // Escaped ASCII (quote)
+ testResult = val.read("[\"\\u0022\"]");
+ f_assert(testResult);
+ f_assert(val[0].get_str() == "\"");
+ // Escaped Basic Plane character, two-byte UTF-8
+ testResult = val.read("[\"\\u0191\"]");
+ f_assert(testResult);
+ f_assert(val[0].get_str() == "\xc6\x91");
+ // Escaped Basic Plane character, three-byte UTF-8
+ testResult = val.read("[\"\\u2191\"]");
+ f_assert(testResult);
+ f_assert(val[0].get_str() == "\xe2\x86\x91");
+ // Escaped Supplementary Plane character U+1d161
+ testResult = val.read("[\"\\ud834\\udd61\"]");
+ f_assert(testResult);
+ f_assert(val[0].get_str() == "\xf0\x9d\x85\xa1");
+}
+
int main (int argc, char *argv[])
{
for (unsigned int fidx = 0; fidx < ARRAY_SIZE(filenames); fidx++) {
runtest_file(filenames[fidx]);
}
+ unescape_unicode_test();
+
return test_failed ? 1 : 0;
}
diff --git a/src/util.cpp b/src/util.cpp
index 1913181712..c20ede6221 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -107,13 +107,12 @@ map<string, vector<string> > mapMultiArgs;
bool fDebug = false;
bool fPrintToConsole = false;
bool fPrintToDebugLog = true;
-bool fDaemon = false;
bool fServer = false;
string strMiscWarning;
bool fLogTimestamps = DEFAULT_LOGTIMESTAMPS;
bool fLogTimeMicros = DEFAULT_LOGTIMEMICROS;
bool fLogIPs = DEFAULT_LOGIPS;
-volatile bool fReopenDebugLog = false;
+std::atomic<bool> fReopenDebugLog(false);
CTranslationInterface translationInterface;
/** Init OpenSSL library multithreading support */
@@ -471,9 +470,7 @@ boost::filesystem::path GetDefaultDataDir()
pathRet = fs::path(pszHome);
#ifdef MAC_OSX
// Mac
- pathRet /= "Library/Application Support";
- TryCreateDirectory(pathRet);
- return pathRet / "Bitcoin";
+ return pathRet / "Library/Application Support/Bitcoin";
#else
// Unix
return pathRet / ".bitcoin";
@@ -521,19 +518,20 @@ void ClearDatadirCache()
pathCachedNetSpecific = boost::filesystem::path();
}
-boost::filesystem::path GetConfigFile()
+boost::filesystem::path GetConfigFile(const std::string& confPath)
{
- boost::filesystem::path pathConfigFile(GetArg("-conf", BITCOIN_CONF_FILENAME));
+ boost::filesystem::path pathConfigFile(confPath);
if (!pathConfigFile.is_complete())
pathConfigFile = GetDataDir(false) / pathConfigFile;
return pathConfigFile;
}
-void ReadConfigFile(map<string, string>& mapSettingsRet,
+void ReadConfigFile(const std::string& confPath,
+ map<string, string>& mapSettingsRet,
map<string, vector<string> >& mapMultiSettingsRet)
{
- boost::filesystem::ifstream streamConfig(GetConfigFile());
+ boost::filesystem::ifstream streamConfig(GetConfigFile(confPath));
if (!streamConfig.good())
return; // No bitcoin.conf file is OK
@@ -603,19 +601,19 @@ bool TryCreateDirectory(const boost::filesystem::path& p)
return false;
}
-void FileCommit(FILE *fileout)
+void FileCommit(FILE *file)
{
- fflush(fileout); // harmless if redundantly called
+ fflush(file); // harmless if redundantly called
#ifdef WIN32
- HANDLE hFile = (HANDLE)_get_osfhandle(_fileno(fileout));
+ HANDLE hFile = (HANDLE)_get_osfhandle(_fileno(file));
FlushFileBuffers(hFile);
#else
#if defined(__linux__) || defined(__NetBSD__)
- fdatasync(fileno(fileout));
+ fdatasync(fileno(file));
#elif defined(__APPLE__) && defined(F_FULLFSYNC)
- fcntl(fileno(fileout), F_FULLFSYNC, 0);
+ fcntl(fileno(file), F_FULLFSYNC, 0);
#else
- fsync(fileno(fileout));
+ fsync(fileno(file));
#endif
#endif
}
@@ -738,28 +736,6 @@ boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate)
}
#endif
-boost::filesystem::path GetTempPath() {
-#if BOOST_FILESYSTEM_VERSION == 3
- return boost::filesystem::temp_directory_path();
-#else
- // TODO: remove when we don't support filesystem v2 anymore
- boost::filesystem::path path;
-#ifdef WIN32
- char pszPath[MAX_PATH] = "";
-
- if (GetTempPathA(MAX_PATH, pszPath))
- path = boost::filesystem::path(pszPath);
-#else
- path = boost::filesystem::path("/tmp");
-#endif
- if (path.empty() || !boost::filesystem::is_directory(path)) {
- LogPrintf("GetTempPath(): failed to find temp path\n");
- return boost::filesystem::path("");
- }
- return path;
-#endif
-}
-
void runCommand(const std::string& strCommand)
{
int nErr = ::system(strCommand.c_str());
@@ -814,19 +790,6 @@ bool SetupNetworking()
return true;
}
-void SetThreadPriority(int nPriority)
-{
-#ifdef WIN32
- SetThreadPriority(GetCurrentThread(), nPriority);
-#else // WIN32
-#ifdef PRIO_THREAD
- setpriority(PRIO_THREAD, 0, nPriority);
-#else // PRIO_THREAD
- setpriority(PRIO_PROCESS, 0, nPriority);
-#endif // PRIO_THREAD
-#endif // WIN32
-}
-
int GetNumCores()
{
#if BOOST_VERSION >= 105600
@@ -836,3 +799,13 @@ int GetNumCores()
#endif
}
+std::string CopyrightHolders(const std::string& strPrefix)
+{
+ std::string strCopyrightHolders = strPrefix + strprintf(_(COPYRIGHT_HOLDERS), _(COPYRIGHT_HOLDERS_SUBSTITUTION));
+
+ // Check for untranslated substitution to make sure Bitcoin Core copyright is not removed by accident
+ if (strprintf(COPYRIGHT_HOLDERS, COPYRIGHT_HOLDERS_SUBSTITUTION).find("Bitcoin Core") == std::string::npos) {
+ strCopyrightHolders += "\n" + strPrefix + "The Bitcoin Core developers";
+ }
+ return strCopyrightHolders;
+}
diff --git a/src/util.h b/src/util.h
index fb154f6660..bbb9b5db82 100644
--- a/src/util.h
+++ b/src/util.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -18,6 +18,7 @@
#include "tinyformat.h"
#include "utiltime.h"
+#include <atomic>
#include <exception>
#include <map>
#include <stdint.h>
@@ -50,7 +51,7 @@ extern std::string strMiscWarning;
extern bool fLogTimestamps;
extern bool fLogTimeMicros;
extern bool fLogIPs;
-extern volatile bool fReopenDebugLog;
+extern std::atomic<bool> fReopenDebugLog;
extern CTranslationInterface translationInterface;
extern const char * const BITCOIN_CONF_FILENAME;
@@ -76,46 +77,23 @@ int LogPrintStr(const std::string &str);
#define LogPrintf(...) LogPrint(NULL, __VA_ARGS__)
-/**
- * When we switch to C++11, this can be switched to variadic templates instead
- * of this macro-based construction (see tinyformat.h).
- */
-#define MAKE_ERROR_AND_LOG_FUNC(n) \
- /** Print to debug.log if -debug=category switch is given OR category is NULL. */ \
- template<TINYFORMAT_ARGTYPES(n)> \
- static inline int LogPrint(const char* category, const char* format, TINYFORMAT_VARARGS(n)) \
- { \
- if(!LogAcceptCategory(category)) return 0; \
- return LogPrintStr(tfm::format(format, TINYFORMAT_PASSARGS(n))); \
- } \
- /** Log error and return false */ \
- template<TINYFORMAT_ARGTYPES(n)> \
- static inline bool error(const char* format, TINYFORMAT_VARARGS(n)) \
- { \
- LogPrintStr("ERROR: " + tfm::format(format, TINYFORMAT_PASSARGS(n)) + "\n"); \
- return false; \
- }
-
-TINYFORMAT_FOREACH_ARGNUM(MAKE_ERROR_AND_LOG_FUNC)
-
-/**
- * Zero-arg versions of logging and error, these are not covered by
- * TINYFORMAT_FOREACH_ARGNUM
- */
-static inline int LogPrint(const char* category, const char* format)
+template<typename... Args>
+static inline int LogPrint(const char* category, const char* fmt, const Args&... args)
{
- if(!LogAcceptCategory(category)) return 0;
- return LogPrintStr(format);
+ if(!LogAcceptCategory(category)) return 0; \
+ return LogPrintStr(tfm::format(fmt, args...));
}
-static inline bool error(const char* format)
+
+template<typename... Args>
+bool error(const char* fmt, const Args&... args)
{
- LogPrintStr(std::string("ERROR: ") + format + "\n");
+ LogPrintStr("ERROR: " + tfm::format(fmt, args...) + "\n");
return false;
}
void PrintExceptionContinue(const std::exception *pex, const char* pszThread);
void ParseParameters(int argc, const char*const argv[]);
-void FileCommit(FILE *fileout);
+void FileCommit(FILE *file);
bool TruncateFile(FILE *file, unsigned int length);
int RaiseFileDescriptorLimit(int nMinFD);
void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length);
@@ -124,16 +102,15 @@ bool TryCreateDirectory(const boost::filesystem::path& p);
boost::filesystem::path GetDefaultDataDir();
const boost::filesystem::path &GetDataDir(bool fNetSpecific = true);
void ClearDatadirCache();
-boost::filesystem::path GetConfigFile();
+boost::filesystem::path GetConfigFile(const std::string& confPath);
#ifndef WIN32
boost::filesystem::path GetPidFile();
void CreatePidFile(const boost::filesystem::path &path, pid_t pid);
#endif
-void ReadConfigFile(std::map<std::string, std::string>& mapSettingsRet, std::map<std::string, std::vector<std::string> >& mapMultiSettingsRet);
+void ReadConfigFile(const std::string& confPath, std::map<std::string, std::string>& mapSettingsRet, std::map<std::string, std::vector<std::string> >& mapMultiSettingsRet);
#ifdef WIN32
boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
#endif
-boost::filesystem::path GetTempPath();
void OpenDebugLog();
void ShrinkDebugFile();
void runCommand(const std::string& strCommand);
@@ -216,7 +193,6 @@ std::string HelpMessageOpt(const std::string& option, const std::string& message
*/
int GetNumCores();
-void SetThreadPriority(int nPriority);
void RenameThread(const char* name);
/**
@@ -247,4 +223,6 @@ template <typename Callable> void TraceThread(const char* name, Callable func)
}
}
+std::string CopyrightHolders(const std::string& strPrefix);
+
#endif // BITCOIN_UTIL_H
diff --git a/src/utilmoneystr.cpp b/src/utilmoneystr.cpp
index 0f3203432f..bebe56130d 100644
--- a/src/utilmoneystr.cpp
+++ b/src/utilmoneystr.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
diff --git a/src/utilmoneystr.h b/src/utilmoneystr.h
index 99c3ba8306..5839b07344 100644
--- a/src/utilmoneystr.h
+++ b/src/utilmoneystr.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp
index c5a2b5cdbb..5ffdb3be15 100644
--- a/src/utilstrencodings.cpp
+++ b/src/utilstrencodings.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -461,6 +461,40 @@ bool ParseInt64(const std::string& str, int64_t *out)
n <= std::numeric_limits<int64_t>::max();
}
+bool ParseUInt32(const std::string& str, uint32_t *out)
+{
+ if (!ParsePrechecks(str))
+ return false;
+ if (str.size() >= 1 && str[0] == '-') // Reject negative values, unfortunately strtoul accepts these by default if they fit in the range
+ return false;
+ char *endp = NULL;
+ errno = 0; // strtoul will not set errno if valid
+ unsigned long int n = strtoul(str.c_str(), &endp, 10);
+ if(out) *out = (uint32_t)n;
+ // Note that strtoul returns a *unsigned long int*, so even if it doesn't report a over/underflow
+ // we still have to check that the returned value is within the range of an *uint32_t*. On 64-bit
+ // platforms the size of these types may be different.
+ return endp && *endp == 0 && !errno &&
+ n <= std::numeric_limits<uint32_t>::max();
+}
+
+bool ParseUInt64(const std::string& str, uint64_t *out)
+{
+ if (!ParsePrechecks(str))
+ return false;
+ if (str.size() >= 1 && str[0] == '-') // Reject negative values, unfortunately strtoull accepts these by default if they fit in the range
+ return false;
+ char *endp = NULL;
+ errno = 0; // strtoull will not set errno if valid
+ unsigned long long int n = strtoull(str.c_str(), &endp, 10);
+ if(out) *out = (uint64_t)n;
+ // Note that strtoull returns a *unsigned long long int*, so even if it doesn't report a over/underflow
+ // we still have to check that the returned value is within the range of an *uint64_t*.
+ return endp && *endp == 0 && !errno &&
+ n <= std::numeric_limits<uint64_t>::max();
+}
+
+
bool ParseDouble(const std::string& str, double *out)
{
if (!ParsePrechecks(str))
@@ -478,34 +512,40 @@ bool ParseDouble(const std::string& str, double *out)
std::string FormatParagraph(const std::string& in, size_t width, size_t indent)
{
std::stringstream out;
- size_t col = 0;
size_t ptr = 0;
- while(ptr < in.size())
+ size_t indented = 0;
+ while (ptr < in.size())
{
- // Find beginning of next word
- ptr = in.find_first_not_of(' ', ptr);
- if (ptr == std::string::npos)
- break;
- // Find end of next word
- size_t endword = in.find_first_of(' ', ptr);
- if (endword == std::string::npos)
- endword = in.size();
- // Add newline and indentation if this wraps over the allowed width
- if (col > 0)
- {
- if ((col + endword - ptr) > width)
- {
- out << '\n';
- for(size_t i=0; i<indent; ++i)
- out << ' ';
- col = 0;
- } else
- out << ' ';
+ size_t lineend = in.find_first_of('\n', ptr);
+ if (lineend == std::string::npos) {
+ lineend = in.size();
+ }
+ const size_t linelen = lineend - ptr;
+ const size_t rem_width = width - indented;
+ if (linelen <= rem_width) {
+ out << in.substr(ptr, linelen + 1);
+ ptr = lineend + 1;
+ indented = 0;
+ } else {
+ size_t finalspace = in.find_last_of(" \n", ptr + rem_width);
+ if (finalspace == std::string::npos || finalspace < ptr) {
+ // No place to break; just include the entire word and move on
+ finalspace = in.find_first_of("\n ", ptr);
+ if (finalspace == std::string::npos) {
+ // End of the string, just add it and break
+ out << in.substr(ptr);
+ break;
+ }
+ }
+ out << in.substr(ptr, finalspace - ptr) << "\n";
+ if (in[finalspace] == '\n') {
+ indented = 0;
+ } else if (indent) {
+ out << std::string(indent, ' ');
+ indented = indent;
+ }
+ ptr = finalspace + 1;
}
- // Append word
- out << in.substr(ptr, endword - ptr);
- col += endword - ptr + 1;
- ptr = endword;
}
return out.str();
}
diff --git a/src/utilstrencodings.h b/src/utilstrencodings.h
index ce93e83497..5744f78c6e 100644
--- a/src/utilstrencodings.h
+++ b/src/utilstrencodings.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -71,6 +71,20 @@ bool ParseInt32(const std::string& str, int32_t *out);
bool ParseInt64(const std::string& str, int64_t *out);
/**
+ * Convert decimal string to unsigned 32-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 ParseUInt32(const std::string& str, uint32_t *out);
+
+/**
+ * Convert decimal string to unsigned 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 ParseUInt64(const std::string& str, uint64_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.
diff --git a/src/utiltime.cpp b/src/utiltime.cpp
index 7d9f6210eb..da590f8889 100644
--- a/src/utiltime.cpp
+++ b/src/utiltime.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -14,7 +14,7 @@
using namespace std;
-static int64_t nMockTime = 0; //! For unit testing
+static int64_t nMockTime = 0; //!< For unit testing
int64_t GetTime()
{
diff --git a/src/utiltime.h b/src/utiltime.h
index 241b5211e9..b2807267db 100644
--- a/src/utiltime.h
+++ b/src/utiltime.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp
index 81f3b775f4..6ddf37658d 100644
--- a/src/validationinterface.cpp
+++ b/src/validationinterface.cpp
@@ -14,11 +14,11 @@ CMainSignals& GetMainSignals()
void RegisterValidationInterface(CValidationInterface* pwalletIn) {
g_signals.UpdatedBlockTip.connect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1));
- g_signals.SyncTransaction.connect(boost::bind(&CValidationInterface::SyncTransaction, pwalletIn, _1, _2));
+ g_signals.SyncTransaction.connect(boost::bind(&CValidationInterface::SyncTransaction, pwalletIn, _1, _2, _3));
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.Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
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));
@@ -28,11 +28,11 @@ 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.Broadcast.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
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.SyncTransaction.disconnect(boost::bind(&CValidationInterface::SyncTransaction, pwalletIn, _1, _2));
+ g_signals.SyncTransaction.disconnect(boost::bind(&CValidationInterface::SyncTransaction, pwalletIn, _1, _2, _3));
g_signals.UpdatedBlockTip.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1));
}
@@ -48,6 +48,6 @@ void UnregisterAllValidationInterfaces() {
g_signals.UpdatedBlockTip.disconnect_all_slots();
}
-void SyncWithWallets(const CTransaction &tx, const CBlock *pblock) {
- g_signals.SyncTransaction(tx, pblock);
+void SyncWithWallets(const CTransaction &tx, const CBlockIndex *pindex, int posInBlock) {
+ g_signals.SyncTransaction(tx, pindex, posInBlock);
}
diff --git a/src/validationinterface.h b/src/validationinterface.h
index ffb56d266b..0c91ec8308 100644
--- a/src/validationinterface.h
+++ b/src/validationinterface.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -10,8 +10,10 @@
#include <boost/shared_ptr.hpp>
class CBlock;
+class CBlockIndex;
struct CBlockLocator;
class CBlockIndex;
+class CConnman;
class CReserveScript;
class CTransaction;
class CValidationInterface;
@@ -27,16 +29,16 @@ void UnregisterValidationInterface(CValidationInterface* pwalletIn);
/** Unregister all wallets from core */
void UnregisterAllValidationInterfaces();
/** Push an updated transaction to all registered wallets */
-void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL);
+void SyncWithWallets(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock = -1);
class CValidationInterface {
protected:
virtual void UpdatedBlockTip(const CBlockIndex *pindex) {}
- virtual void SyncTransaction(const CTransaction &tx, const CBlock *pblock) {}
+ virtual void SyncTransaction(const CTransaction &tx, const CBlockIndex *pindex, int posInBlock) {}
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 ResendWalletTransactions(int64_t nBestBlockTime, CConnman* connman) {}
virtual void BlockChecked(const CBlock&, const CValidationState&) {}
virtual void GetScriptForMining(boost::shared_ptr<CReserveScript>&) {};
virtual void ResetRequestCount(const uint256 &hash) {};
@@ -49,7 +51,7 @@ struct CMainSignals {
/** Notifies listeners of updated block chain tip */
boost::signals2::signal<void (const CBlockIndex *)> UpdatedBlockTip;
/** Notifies listeners of updated transaction data (transaction, and optionally the block it is found in. */
- boost::signals2::signal<void (const CTransaction &, const CBlock *)> SyncTransaction;
+ boost::signals2::signal<void (const CTransaction &, const CBlockIndex *pindex, int posInBlock)> SyncTransaction;
/** 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. */
@@ -57,7 +59,7 @@ struct CMainSignals {
/** Notifies listeners about an inventory item being seen on the network. */
boost::signals2::signal<void (const uint256 &)> Inventory;
/** Tells listeners to broadcast their data. */
- boost::signals2::signal<void (int64_t nBestBlockTime)> Broadcast;
+ boost::signals2::signal<void (int64_t nBestBlockTime, CConnman* connman)> 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) */
diff --git a/src/version.h b/src/version.h
index f7cf18d0b6..87bd655066 100644
--- a/src/version.h
+++ b/src/version.h
@@ -9,7 +9,7 @@
* network protocol versioning
*/
-static const int PROTOCOL_VERSION = 70012;
+static const int PROTOCOL_VERSION = 70014;
//! initial proto version, to be increased after version/verack negotiation
static const int INIT_PROTO_VERSION = 209;
@@ -24,10 +24,6 @@ static const int MIN_PEER_PROTO_VERSION = GETHEADERS_VERSION;
//! if possible, avoid requesting addresses nodes older than this
static const int CADDR_TIME_VERSION = 31402;
-//! only request blocks from nodes outside this range of versions
-static const int NOBLKS_VERSION_START = 32000;
-static const int NOBLKS_VERSION_END = 32400;
-
//! BIP 0031, pong message, is enabled for all versions AFTER this one
static const int BIP0031_VERSION = 60000;
@@ -40,4 +36,10 @@ static const int NO_BLOOM_VERSION = 70011;
//! "sendheaders" command and announcing blocks with headers starts with this version
static const int SENDHEADERS_VERSION = 70012;
+//! "feefilter" tells peers to filter invs to you by fee starts with this version
+static const int FEEFILTER_VERSION = 70013;
+
+//! short-id-based block download starts with this version
+static const int SHORT_IDS_BLOCKS_VERSION = 70014;
+
#endif // BITCOIN_VERSION_H
diff --git a/src/versionbits.cpp b/src/versionbits.cpp
new file mode 100644
index 0000000000..bf32ae6627
--- /dev/null
+++ b/src/versionbits.cpp
@@ -0,0 +1,150 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "versionbits.h"
+
+#include "consensus/params.h"
+
+const struct BIP9DeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION_BITS_DEPLOYMENTS] = {
+ {
+ /*.name =*/ "testdummy",
+ /*.gbt_force =*/ true,
+ },
+ {
+ /*.name =*/ "csv",
+ /*.gbt_force =*/ true,
+ },
+ {
+ /*.name =*/ "segwit",
+ /*.gbt_force =*/ false,
+ }
+};
+
+ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex* pindexPrev, const Consensus::Params& params, ThresholdConditionCache& cache) const
+{
+ int nPeriod = Period(params);
+ int nThreshold = Threshold(params);
+ int64_t nTimeStart = BeginTime(params);
+ int64_t nTimeTimeout = EndTime(params);
+
+ // A block's state is always the same as that of the first of its period, so it is computed based on a pindexPrev whose height equals a multiple of nPeriod - 1.
+ if (pindexPrev != NULL) {
+ pindexPrev = pindexPrev->GetAncestor(pindexPrev->nHeight - ((pindexPrev->nHeight + 1) % nPeriod));
+ }
+
+ // Walk backwards in steps of nPeriod to find a pindexPrev whose information is known
+ std::vector<const CBlockIndex*> vToCompute;
+ while (cache.count(pindexPrev) == 0) {
+ if (pindexPrev == NULL) {
+ // The genesis block is by definition defined.
+ cache[pindexPrev] = THRESHOLD_DEFINED;
+ break;
+ }
+ if (pindexPrev->GetMedianTimePast() < nTimeStart) {
+ // Optimization: don't recompute down further, as we know every earlier block will be before the start time
+ cache[pindexPrev] = THRESHOLD_DEFINED;
+ break;
+ }
+ vToCompute.push_back(pindexPrev);
+ pindexPrev = pindexPrev->GetAncestor(pindexPrev->nHeight - nPeriod);
+ }
+
+ // At this point, cache[pindexPrev] is known
+ assert(cache.count(pindexPrev));
+ ThresholdState state = cache[pindexPrev];
+
+ // Now walk forward and compute the state of descendants of pindexPrev
+ while (!vToCompute.empty()) {
+ ThresholdState stateNext = state;
+ pindexPrev = vToCompute.back();
+ vToCompute.pop_back();
+
+ switch (state) {
+ case THRESHOLD_DEFINED: {
+ if (pindexPrev->GetMedianTimePast() >= nTimeTimeout) {
+ stateNext = THRESHOLD_FAILED;
+ } else if (pindexPrev->GetMedianTimePast() >= nTimeStart) {
+ stateNext = THRESHOLD_STARTED;
+ }
+ break;
+ }
+ case THRESHOLD_STARTED: {
+ if (pindexPrev->GetMedianTimePast() >= nTimeTimeout) {
+ stateNext = THRESHOLD_FAILED;
+ break;
+ }
+ // We need to count
+ const CBlockIndex* pindexCount = pindexPrev;
+ int count = 0;
+ for (int i = 0; i < nPeriod; i++) {
+ if (Condition(pindexCount, params)) {
+ count++;
+ }
+ pindexCount = pindexCount->pprev;
+ }
+ if (count >= nThreshold) {
+ stateNext = THRESHOLD_LOCKED_IN;
+ }
+ break;
+ }
+ case THRESHOLD_LOCKED_IN: {
+ // Always progresses into ACTIVE.
+ stateNext = THRESHOLD_ACTIVE;
+ break;
+ }
+ case THRESHOLD_FAILED:
+ case THRESHOLD_ACTIVE: {
+ // Nothing happens, these are terminal states.
+ break;
+ }
+ }
+ cache[pindexPrev] = state = stateNext;
+ }
+
+ return state;
+}
+
+namespace
+{
+/**
+ * Class to implement versionbits logic.
+ */
+class VersionBitsConditionChecker : public AbstractThresholdConditionChecker {
+private:
+ const Consensus::DeploymentPos id;
+
+protected:
+ int64_t BeginTime(const Consensus::Params& params) const { return params.vDeployments[id].nStartTime; }
+ int64_t EndTime(const Consensus::Params& params) const { return params.vDeployments[id].nTimeout; }
+ int Period(const Consensus::Params& params) const { return params.nMinerConfirmationWindow; }
+ int Threshold(const Consensus::Params& params) const { return params.nRuleChangeActivationThreshold; }
+
+ bool Condition(const CBlockIndex* pindex, const Consensus::Params& params) const
+ {
+ return (((pindex->nVersion & VERSIONBITS_TOP_MASK) == VERSIONBITS_TOP_BITS) && (pindex->nVersion & Mask(params)) != 0);
+ }
+
+public:
+ VersionBitsConditionChecker(Consensus::DeploymentPos id_) : id(id_) {}
+ uint32_t Mask(const Consensus::Params& params) const { return ((uint32_t)1) << params.vDeployments[id].bit; }
+};
+
+}
+
+ThresholdState VersionBitsState(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos, VersionBitsCache& cache)
+{
+ return VersionBitsConditionChecker(pos).GetStateFor(pindexPrev, params, cache.caches[pos]);
+}
+
+uint32_t VersionBitsMask(const Consensus::Params& params, Consensus::DeploymentPos pos)
+{
+ return VersionBitsConditionChecker(pos).Mask(params);
+}
+
+void VersionBitsCache::Clear()
+{
+ for (unsigned int d = 0; d < Consensus::MAX_VERSION_BITS_DEPLOYMENTS; d++) {
+ caches[d].clear();
+ }
+}
diff --git a/src/versionbits.h b/src/versionbits.h
new file mode 100644
index 0000000000..ede2dcdda8
--- /dev/null
+++ b/src/versionbits.h
@@ -0,0 +1,68 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_CONSENSUS_VERSIONBITS
+#define BITCOIN_CONSENSUS_VERSIONBITS
+
+#include "chain.h"
+#include <map>
+
+/** What block version to use for new blocks (pre versionbits) */
+static const int32_t VERSIONBITS_LAST_OLD_BLOCK_VERSION = 4;
+/** What bits to set in version for versionbits blocks */
+static const int32_t VERSIONBITS_TOP_BITS = 0x20000000UL;
+/** What bitmask determines whether versionbits is in use */
+static const int32_t VERSIONBITS_TOP_MASK = 0xE0000000UL;
+/** Total bits available for versionbits */
+static const int32_t VERSIONBITS_NUM_BITS = 29;
+
+enum ThresholdState {
+ THRESHOLD_DEFINED,
+ THRESHOLD_STARTED,
+ THRESHOLD_LOCKED_IN,
+ THRESHOLD_ACTIVE,
+ THRESHOLD_FAILED,
+};
+
+// A map that gives the state for blocks whose height is a multiple of Period().
+// The map is indexed by the block's parent, however, so all keys in the map
+// will either be NULL or a block with (height + 1) % Period() == 0.
+typedef std::map<const CBlockIndex*, ThresholdState> ThresholdConditionCache;
+
+struct BIP9DeploymentInfo {
+ /** Deployment name */
+ const char *name;
+ /** Whether GBT clients can safely ignore this rule in simplified usage */
+ bool gbt_force;
+};
+
+extern const struct BIP9DeploymentInfo VersionBitsDeploymentInfo[];
+
+/**
+ * Abstract class that implements BIP9-style threshold logic, and caches results.
+ */
+class AbstractThresholdConditionChecker {
+protected:
+ virtual bool Condition(const CBlockIndex* pindex, const Consensus::Params& params) const =0;
+ virtual int64_t BeginTime(const Consensus::Params& params) const =0;
+ virtual int64_t EndTime(const Consensus::Params& params) const =0;
+ virtual int Period(const Consensus::Params& params) const =0;
+ virtual int Threshold(const Consensus::Params& params) const =0;
+
+public:
+ // Note that the function below takes a pindexPrev as input: they compute information for block B based on its parent.
+ ThresholdState GetStateFor(const CBlockIndex* pindexPrev, const Consensus::Params& params, ThresholdConditionCache& cache) const;
+};
+
+struct VersionBitsCache
+{
+ ThresholdConditionCache caches[Consensus::MAX_VERSION_BITS_DEPLOYMENTS];
+
+ void Clear();
+};
+
+ThresholdState VersionBitsState(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos, VersionBitsCache& cache);
+uint32_t VersionBitsMask(const Consensus::Params& params, Consensus::DeploymentPos pos);
+
+#endif
diff --git a/src/wallet/crypter.cpp b/src/wallet/crypter.cpp
index c86ad9758e..190f8ecf2a 100644
--- a/src/wallet/crypter.cpp
+++ b/src/wallet/crypter.cpp
@@ -1,9 +1,11 @@
-// Copyright (c) 2009-2013 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 "crypter.h"
+#include "crypto/aes.h"
+#include "crypto/sha512.h"
#include "script/script.h"
#include "script/standard.h"
#include "util.h"
@@ -11,8 +13,33 @@
#include <string>
#include <vector>
#include <boost/foreach.hpp>
-#include <openssl/aes.h>
-#include <openssl/evp.h>
+
+int CCrypter::BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, const SecureString& strKeyData, int count, unsigned char *key,unsigned char *iv) const
+{
+ // This mimics the behavior of openssl's EVP_BytesToKey with an aes256cbc
+ // cipher and sha512 message digest. Because sha512's output size (64b) is
+ // greater than the aes256 block size (16b) + aes256 key size (32b),
+ // there's no need to process more than once (D_0).
+
+ if(!count || !key || !iv)
+ return 0;
+
+ unsigned char buf[CSHA512::OUTPUT_SIZE];
+ CSHA512 di;
+
+ di.Write((const unsigned char*)strKeyData.c_str(), strKeyData.size());
+ if(chSalt.size())
+ di.Write(&chSalt[0], chSalt.size());
+ di.Finalize(buf);
+
+ for(int i = 0; i != count - 1; i++)
+ di.Reset().Write(buf, sizeof(buf)).Finalize(buf);
+
+ memcpy(key, buf, WALLET_CRYPTO_KEY_SIZE);
+ memcpy(iv, buf + WALLET_CRYPTO_KEY_SIZE, WALLET_CRYPTO_IV_SIZE);
+ memory_cleanse(buf, sizeof(buf));
+ return WALLET_CRYPTO_KEY_SIZE;
+}
bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
{
@@ -21,8 +48,7 @@ bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::v
int i = 0;
if (nDerivationMethod == 0)
- i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],
- (unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV);
+ i = BytesToKeySHA512AES(chSalt, strKeyData, nRounds, chKey, chIV);
if (i != (int)WALLET_CRYPTO_KEY_SIZE)
{
@@ -37,7 +63,7 @@ bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::v
bool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV)
{
- if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_KEY_SIZE)
+ if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_IV_SIZE)
return false;
memcpy(&chKey[0], &chNewKey[0], sizeof chKey);
@@ -47,57 +73,39 @@ bool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigne
return true;
}
-bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext)
+bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext) const
{
if (!fKeySet)
return false;
// max ciphertext len for a n bytes of plaintext is
- // n + AES_BLOCK_SIZE - 1 bytes
- int nLen = vchPlaintext.size();
- int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;
- vchCiphertext = std::vector<unsigned char> (nCLen);
-
- EVP_CIPHER_CTX ctx;
+ // n + AES_BLOCKSIZE bytes
+ vchCiphertext.resize(vchPlaintext.size() + AES_BLOCKSIZE);
- bool fOk = true;
-
- EVP_CIPHER_CTX_init(&ctx);
- if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV) != 0;
- if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen) != 0;
- if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0]) + nCLen, &nFLen) != 0;
- EVP_CIPHER_CTX_cleanup(&ctx);
-
- if (!fOk) return false;
+ AES256CBCEncrypt enc(chKey, chIV, true);
+ size_t nLen = enc.Encrypt(&vchPlaintext[0], vchPlaintext.size(), &vchCiphertext[0]);
+ if(nLen < vchPlaintext.size())
+ return false;
+ vchCiphertext.resize(nLen);
- vchCiphertext.resize(nCLen + nFLen);
return true;
}
-bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext)
+bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext) const
{
if (!fKeySet)
return false;
// plaintext will always be equal to or lesser than length of ciphertext
int nLen = vchCiphertext.size();
- int nPLen = nLen, nFLen = 0;
-
- vchPlaintext = CKeyingMaterial(nPLen);
- EVP_CIPHER_CTX ctx;
+ vchPlaintext.resize(nLen);
- bool fOk = true;
-
- EVP_CIPHER_CTX_init(&ctx);
- if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV) != 0;
- if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen) != 0;
- if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0]) + nPLen, &nFLen) != 0;
- EVP_CIPHER_CTX_cleanup(&ctx);
-
- if (!fOk) return false;
-
- vchPlaintext.resize(nPLen + nFLen);
+ AES256CBCDecrypt dec(chKey, chIV, true);
+ nLen = dec.Decrypt(&vchCiphertext[0], vchCiphertext.size(), &vchPlaintext[0]);
+ if(nLen == 0)
+ return false;
+ vchPlaintext.resize(nLen);
return true;
}
@@ -105,8 +113,8 @@ bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingM
static bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext)
{
CCrypter cKeyCrypter;
- std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);
- memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);
+ std::vector<unsigned char> chIV(WALLET_CRYPTO_IV_SIZE);
+ memcpy(&chIV[0], &nIV, WALLET_CRYPTO_IV_SIZE);
if(!cKeyCrypter.SetKey(vMasterKey, chIV))
return false;
return cKeyCrypter.Encrypt(*((const CKeyingMaterial*)&vchPlaintext), vchCiphertext);
@@ -115,8 +123,8 @@ static bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMateri
static bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext)
{
CCrypter cKeyCrypter;
- std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);
- memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);
+ std::vector<unsigned char> chIV(WALLET_CRYPTO_IV_SIZE);
+ memcpy(&chIV[0], &nIV, WALLET_CRYPTO_IV_SIZE);
if(!cKeyCrypter.SetKey(vMasterKey, chIV))
return false;
return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));
diff --git a/src/wallet/crypter.h b/src/wallet/crypter.h
index 70aeb76723..5d0a4a3305 100644
--- a/src/wallet/crypter.h
+++ b/src/wallet/crypter.h
@@ -1,4 +1,4 @@
-// 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.
@@ -13,6 +13,7 @@ class uint256;
const unsigned int WALLET_CRYPTO_KEY_SIZE = 32;
const unsigned int WALLET_CRYPTO_SALT_SIZE = 8;
+const unsigned int WALLET_CRYPTO_IV_SIZE = 16;
/**
* Private key encryption is done based on a CMasterKey,
@@ -66,18 +67,26 @@ public:
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
+namespace wallet_crypto
+{
+ class TestCrypter;
+}
+
/** Encryption/decryption context with key information */
class CCrypter
{
+friend class wallet_crypto::TestCrypter; // for test access to chKey/chIV
private:
unsigned char chKey[WALLET_CRYPTO_KEY_SIZE];
- unsigned char chIV[WALLET_CRYPTO_KEY_SIZE];
+ unsigned char chIV[WALLET_CRYPTO_IV_SIZE];
bool fKeySet;
+ int BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, const SecureString& strKeyData, int count, unsigned char *key,unsigned char *iv) const;
+
public:
bool SetKeyFromPassphrase(const SecureString &strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod);
- bool Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext);
- bool Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext);
+ bool Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext) const;
+ bool Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext) const;
bool SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV);
void CleanKey()
diff --git a/src/wallet/db.cpp b/src/wallet/db.cpp
index 4b9dbebddd..a809c9ad64 100644
--- a/src/wallet/db.cpp
+++ b/src/wallet/db.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -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(strPath.c_str(), 0);
+ DbEnv((u_int32_t)0).remove(strPath.c_str(), 0);
}
void CDBEnv::Reset()
@@ -165,6 +165,11 @@ CDBEnv::VerifyResult CDBEnv::Verify(const std::string& strFile, bool (*recoverFu
return (fRecovered ? RECOVER_OK : RECOVER_FAIL);
}
+/* End of headers, beginning of key/value data */
+static const char *HEADER_END = "HEADER=END";
+/* End of key/value data */
+static const char *DATA_END = "DATA=END";
+
bool CDBEnv::Salvage(const std::string& strFile, bool fAggressive, std::vector<CDBEnv::KeyValPair>& vResult)
{
LOCK(cs_db);
@@ -193,24 +198,35 @@ bool CDBEnv::Salvage(const std::string& strFile, bool fAggressive, std::vector<C
// Format of bdb dump is ascii lines:
// header lines...
// HEADER=END
- // hexadecimal key
- // hexadecimal value
- // ... repeated
+ // hexadecimal key
+ // hexadecimal value
+ // ... repeated
// DATA=END
string strLine;
- while (!strDump.eof() && strLine != "HEADER=END")
+ while (!strDump.eof() && strLine != HEADER_END)
getline(strDump, strLine); // Skip past header
std::string keyHex, valueHex;
- while (!strDump.eof() && keyHex != "DATA=END") {
+ while (!strDump.eof() && keyHex != DATA_END) {
getline(strDump, keyHex);
- if (keyHex != "DATA_END") {
+ if (keyHex != DATA_END) {
+ if (strDump.eof())
+ break;
getline(strDump, valueHex);
+ if (valueHex == DATA_END) {
+ LogPrintf("CDBEnv::Salvage: WARNING: Number of keys in data does not match number of values.\n");
+ break;
+ }
vResult.push_back(make_pair(ParseHex(keyHex), ParseHex(valueHex)));
}
}
+ if (keyHex != DATA_END) {
+ LogPrintf("CDBEnv::Salvage: WARNING: Unexpected end of file while reading salvage output.\n");
+ return false;
+ }
+
return (result == 0);
}
@@ -268,7 +284,7 @@ CDB::CDB(const std::string& strFilename, const char* pszMode, bool fFlushOnClose
pdb = NULL;
--bitdb.mapFileUseCount[strFile];
strFile = "";
- throw runtime_error(strprintf("CDB: Error %d, can't open database %s", ret, strFile));
+ throw runtime_error(strprintf("CDB: Error %d, can't open database %s", ret, strFilename));
}
if (fCreate && !Exists(string("version"))) {
@@ -371,11 +387,11 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
while (fSuccess) {
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
CDataStream ssValue(SER_DISK, CLIENT_VERSION);
- int ret = db.ReadAtCursor(pcursor, ssKey, ssValue, DB_NEXT);
- if (ret == DB_NOTFOUND) {
+ int ret1 = db.ReadAtCursor(pcursor, ssKey, ssValue);
+ if (ret1 == DB_NOTFOUND) {
pcursor->close();
break;
- } else if (ret != 0) {
+ } else if (ret1 != 0) {
pcursor->close();
fSuccess = false;
break;
diff --git a/src/wallet/db.h b/src/wallet/db.h
index 7f58d03f08..a0f673ecfc 100644
--- a/src/wallet/db.h
+++ b/src/wallet/db.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -228,19 +228,17 @@ protected:
return pcursor;
}
- int ReadAtCursor(Dbc* pcursor, CDataStream& ssKey, CDataStream& ssValue, unsigned int fFlags = DB_NEXT)
+ int ReadAtCursor(Dbc* pcursor, CDataStream& ssKey, CDataStream& ssValue, bool setRange = false)
{
// Read at cursor
Dbt datKey;
- if (fFlags == DB_SET || fFlags == DB_SET_RANGE || fFlags == DB_GET_BOTH || fFlags == DB_GET_BOTH_RANGE) {
+ unsigned int fFlags = DB_NEXT;
+ if (setRange) {
datKey.set_data(&ssKey[0]);
datKey.set_size(ssKey.size());
+ fFlags = DB_SET_RANGE;
}
Dbt datValue;
- if (fFlags == DB_GET_BOTH || fFlags == DB_GET_BOTH_RANGE) {
- datValue.set_data(&ssValue[0]);
- datValue.set_size(ssValue.size());
- }
datKey.set_flags(DB_DBT_MALLOC);
datValue.set_flags(DB_DBT_MALLOC);
int ret = pcursor->get(&datKey, &datValue, fFlags);
diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp
index c431fc4013..e80fa7dff8 100644
--- a/src/wallet/rpcdump.cpp
+++ b/src/wallet/rpcdump.cpp
@@ -1,10 +1,10 @@
-// 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 "chain.h"
-#include "rpcserver.h"
+#include "rpc/server.h"
#include "init.h"
#include "main.h"
#include "script/script.h"
@@ -13,6 +13,8 @@
#include "util.h"
#include "utiltime.h"
#include "wallet.h"
+#include "merkleblock.h"
+#include "core_io.h"
#include <fstream>
#include <stdint.h>
@@ -165,6 +167,11 @@ void ImportScript(const CScript& script, const string& strLabel, bool isRedeemSc
if (!pwalletMain->HaveCScript(script) && !pwalletMain->AddCScript(script))
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding p2sh redeemScript to wallet");
ImportAddress(CBitcoinAddress(CScriptID(script)), strLabel);
+ } else {
+ CTxDestination destination;
+ if (ExtractDestination(script, destination)) {
+ pwalletMain->SetAddressBook(destination, strLabel, "receive");
+ }
}
}
@@ -192,7 +199,9 @@ UniValue importaddress(const UniValue& params, bool fHelp)
"3. rescan (boolean, optional, default=true) Rescan the wallet for transactions\n"
"4. p2sh (boolean, optional, default=false) Add the P2SH version of the script as well\n"
"\nNote: This call can take minutes to complete if rescan is true.\n"
- "If you have the full public key, you should call importpublickey instead of this.\n"
+ "If you have the full public key, you should call importpubkey instead of this.\n"
+ "\nNote: If you import a non-standard raw script in hex form, outputs sending to it will be treated\n"
+ "as change, and not show up in many RPCs.\n"
"\nExamples:\n"
"\nImport a script with rescan\n"
+ HelpExampleCli("importaddress", "\"myscript\"") +
@@ -243,6 +252,101 @@ UniValue importaddress(const UniValue& params, bool fHelp)
return NullUniValue;
}
+UniValue importprunedfunds(const UniValue& params, bool fHelp)
+{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
+ if (fHelp || params.size() != 2)
+ throw runtime_error(
+ "importprunedfunds\n"
+ "\nImports funds without rescan. Corresponding address or script must previously be included in wallet. Aimed towards pruned wallets. The end-user is responsible to import additional transactions that subsequently spend the imported outputs or rescan after the point in the blockchain the transaction is included.\n"
+ "\nArguments:\n"
+ "1. \"rawtransaction\" (string, required) A raw transaction in hex funding an already-existing address in wallet\n"
+ "2. \"txoutproof\" (string, required) The hex output from gettxoutproof that contains the transaction\n"
+ );
+
+ CTransaction tx;
+ if (!DecodeHexTx(tx, params[0].get_str()))
+ throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
+ uint256 hashTx = tx.GetHash();
+ CWalletTx wtx(pwalletMain,tx);
+
+ CDataStream ssMB(ParseHexV(params[1], "proof"), SER_NETWORK, PROTOCOL_VERSION);
+ CMerkleBlock merkleBlock;
+ ssMB >> merkleBlock;
+
+ //Search partial merkle tree in proof for our transaction and index in valid block
+ vector<uint256> vMatch;
+ vector<unsigned int> vIndex;
+ unsigned int txnIndex = 0;
+ if (merkleBlock.txn.ExtractMatches(vMatch, vIndex) == merkleBlock.header.hashMerkleRoot) {
+
+ 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");
+
+ vector<uint256>::const_iterator it;
+ if ((it = std::find(vMatch.begin(), vMatch.end(), hashTx))==vMatch.end()) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction given doesn't exist in proof");
+ }
+
+ txnIndex = vIndex[it - vMatch.begin()];
+ }
+ else {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Something wrong with merkleblock");
+ }
+
+ wtx.nIndex = txnIndex;
+ wtx.hashBlock = merkleBlock.header.GetHash();
+
+ LOCK2(cs_main, pwalletMain->cs_wallet);
+
+ if (pwalletMain->IsMine(tx)) {
+ pwalletMain->AddToWallet(wtx, false);
+ return NullUniValue;
+ }
+
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "No addresses in wallet correspond to included transaction");
+}
+
+UniValue removeprunedfunds(const UniValue& params, bool fHelp)
+{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
+ if (fHelp || params.size() != 1)
+ throw runtime_error(
+ "removeprunedfunds \"txid\"\n"
+ "\nDeletes the specified transaction from the wallet. Meant for use with pruned wallets and as a companion to importprunedfunds. This will effect wallet balances.\n"
+ "\nArguments:\n"
+ "1. \"txid\" (string, required) The hex-encoded id of the transaction you are deleting\n"
+ "\nExamples:\n"
+ + HelpExampleCli("removeprunedfunds", "\"a8d0c0184dde994a09ec054286f1ce581bebf46446a512166eae7628734ea0a5\"") +
+ "\nAs a JSON-RPC call\n"
+ + HelpExampleRpc("removprunedfunds", "\"a8d0c0184dde994a09ec054286f1ce581bebf46446a512166eae7628734ea0a5\"")
+ );
+
+ LOCK2(cs_main, pwalletMain->cs_wallet);
+
+ uint256 hash;
+ hash.SetHex(params[0].get_str());
+ vector<uint256> vHash;
+ vHash.push_back(hash);
+ vector<uint256> vHashOut;
+
+ if(pwalletMain->ZapSelectTx(vHash, vHashOut) != DB_LOAD_OK) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Could not properly delete the transaction.");
+ }
+
+ if(vHashOut.empty()) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Transaction does not exist in wallet.");
+ }
+
+ return NullUniValue;
+}
+
UniValue importpubkey(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
@@ -485,24 +589,47 @@ UniValue dumpwallet(const UniValue& params, bool fHelp)
std::sort(vKeyBirth.begin(), vKeyBirth.end());
// produce output
- file << strprintf("# Wallet dump created by Bitcoin %s (%s)\n", CLIENT_BUILD, CLIENT_DATE);
+ file << strprintf("# Wallet dump created by Bitcoin %s\n", CLIENT_BUILD);
file << strprintf("# * Created on %s\n", EncodeDumpTime(GetTime()));
file << strprintf("# * Best block at time of backup was %i (%s),\n", chainActive.Height(), chainActive.Tip()->GetBlockHash().ToString());
file << strprintf("# mined on %s\n", EncodeDumpTime(chainActive.Tip()->GetBlockTime()));
file << "\n";
+
+ // add the base58check encoded extended master if the wallet uses HD
+ CKeyID masterKeyID = pwalletMain->GetHDChain().masterKeyID;
+ if (!masterKeyID.IsNull())
+ {
+ CKey key;
+ if (pwalletMain->GetKey(masterKeyID, key))
+ {
+ CExtKey masterKey;
+ masterKey.SetMaster(key.begin(), key.size());
+
+ CBitcoinExtKey b58extkey;
+ b58extkey.SetKey(masterKey);
+
+ file << "# extended private masterkey: " << b58extkey.ToString() << "\n\n";
+ }
+ }
for (std::vector<std::pair<int64_t, CKeyID> >::const_iterator it = vKeyBirth.begin(); it != vKeyBirth.end(); it++) {
const CKeyID &keyid = it->second;
std::string strTime = EncodeDumpTime(it->first);
std::string strAddr = CBitcoinAddress(keyid).ToString();
CKey key;
if (pwalletMain->GetKey(keyid, key)) {
+ file << strprintf("%s %s ", CBitcoinSecret(key).ToString(), strTime);
if (pwalletMain->mapAddressBook.count(keyid)) {
- file << strprintf("%s %s label=%s # addr=%s\n", CBitcoinSecret(key).ToString(), strTime, EncodeDumpString(pwalletMain->mapAddressBook[keyid].name), strAddr);
+ file << strprintf("label=%s", EncodeDumpString(pwalletMain->mapAddressBook[keyid].name));
+ } else if (keyid == masterKeyID) {
+ file << "hdmaster=1";
} else if (setKeyPool.count(keyid)) {
- file << strprintf("%s %s reserve=1 # addr=%s\n", CBitcoinSecret(key).ToString(), strTime, strAddr);
+ file << "reserve=1";
+ } else if (pwalletMain->mapKeyMetadata[keyid].hdKeypath == "m") {
+ file << "inactivehdmaster=1";
} else {
- file << strprintf("%s %s change=1 # addr=%s\n", CBitcoinSecret(key).ToString(), strTime, strAddr);
+ file << "change=1";
}
+ file << strprintf(" # addr=%s%s\n", strAddr, (pwalletMain->mapKeyMetadata[keyid].hdKeypath.size() > 0 ? " hdkeypath="+pwalletMain->mapKeyMetadata[keyid].hdKeypath : ""));
}
}
file << "\n";
diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp
index db60e498dd..8e95426d11 100644
--- a/src/wallet/rpcwallet.cpp
+++ b/src/wallet/rpcwallet.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Copyright (c) 2009-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -10,8 +10,8 @@
#include "init.h"
#include "main.h"
#include "net.h"
-#include "netbase.h"
-#include "rpcserver.h"
+#include "policy/rbf.h"
+#include "rpc/server.h"
#include "timedata.h"
#include "util.h"
#include "utilmoneystr.h"
@@ -76,6 +76,19 @@ void WalletTxToJSON(const CWalletTx& wtx, UniValue& entry)
entry.push_back(Pair("walletconflicts", conflicts));
entry.push_back(Pair("time", wtx.GetTxTime()));
entry.push_back(Pair("timereceived", (int64_t)wtx.nTimeReceived));
+
+ // Add opt-in RBF status
+ std::string rbfStatus = "no";
+ if (confirms <= 0) {
+ LOCK(mempool.cs);
+ RBFTransactionState rbfState = IsRBFOptIn(wtx, mempool);
+ if (rbfState == RBF_TRANSACTIONSTATE_UNKNOWN)
+ rbfStatus = "unknown";
+ else if (rbfState == RBF_TRANSACTIONSTATE_REPLACEABLE_BIP125)
+ rbfStatus = "yes";
+ }
+ entry.push_back(Pair("bip125-replaceable", rbfStatus));
+
BOOST_FOREACH(const PAIRTYPE(string,string)& item, wtx.mapValue)
entry.push_back(Pair(item.first, item.second));
}
@@ -92,7 +105,7 @@ UniValue getnewaddress(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() > 1)
throw runtime_error(
"getnewaddress ( \"account\" )\n"
@@ -132,46 +145,19 @@ UniValue getnewaddress(const UniValue& params, bool fHelp)
CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false)
{
- CWalletDB walletdb(pwalletMain->strWalletFile);
-
- CAccount account;
- walletdb.ReadAccount(strAccount, account);
-
- bool bKeyUsed = false;
-
- // Check if the current key has been used
- if (account.vchPubKey.IsValid())
- {
- CScript scriptPubKey = GetScriptForDestination(account.vchPubKey.GetID());
- for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin();
- it != pwalletMain->mapWallet.end() && account.vchPubKey.IsValid();
- ++it)
- {
- const CWalletTx& wtx = (*it).second;
- BOOST_FOREACH(const CTxOut& txout, wtx.vout)
- if (txout.scriptPubKey == scriptPubKey)
- bKeyUsed = true;
- }
- }
-
- // Generate a new key
- if (!account.vchPubKey.IsValid() || bForceNew || bKeyUsed)
- {
- if (!pwalletMain->GetKeyFromPool(account.vchPubKey))
- throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
-
- pwalletMain->SetAddressBook(account.vchPubKey.GetID(), strAccount, "receive");
- walletdb.WriteAccount(strAccount, account);
+ CPubKey pubKey;
+ if (!pwalletMain->GetAccountPubkey(pubKey, strAccount, bForceNew)) {
+ throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
}
- return CBitcoinAddress(account.vchPubKey.GetID());
+ return CBitcoinAddress(pubKey.GetID());
}
UniValue getaccountaddress(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaccountaddress \"account\"\n"
@@ -203,7 +189,7 @@ UniValue getrawchangeaddress(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() > 1)
throw runtime_error(
"getrawchangeaddress\n"
@@ -238,7 +224,7 @@ 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"
@@ -284,7 +270,7 @@ UniValue getaccount(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaccount \"bitcoinaddress\"\n"
@@ -316,7 +302,7 @@ UniValue getaddressesbyaccount(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaddressesbyaccount \"account\"\n"
@@ -360,6 +346,9 @@ static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtr
if (nValue > curBalance)
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds");
+ if (pwalletMain->GetBroadcastTransactions() && !g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
+
// Parse Bitcoin address
CScript scriptPubKey = GetScriptForDestination(address);
@@ -376,23 +365,23 @@ static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtr
strError = strprintf("Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!", FormatMoney(nFeeRequired));
throw JSONRPCError(RPC_WALLET_ERROR, strError);
}
- if (!pwalletMain->CommitTransaction(wtxNew, reservekey))
- 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.");
+ if (!pwalletMain->CommitTransaction(wtxNew, reservekey, g_connman.get()))
+ 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 the wallet and coins were spent in the copy but not marked as spent here.");
}
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"
- "\nSend an amount to a given address. The amount is a real and is rounded to the nearest 0.00000001\n"
+ "\nSend an amount to a given address.\n"
+ HelpRequiringPassphrase() +
"\nArguments:\n"
"1. \"bitcoinaddress\" (string, required) The bitcoin address to send to.\n"
- "2. \"amount\" (numeric, required) The amount in " + CURRENCY_UNIT + " to send. eg 0.1\n"
+ "2. \"amount\" (numeric or string, required) The amount in " + CURRENCY_UNIT + " to send. eg 0.1\n"
"3. \"comment\" (string, optional) A comment used to store what the transaction is for. \n"
" This is not part of the transaction, just kept in your wallet.\n"
"4. \"comment-to\" (string, optional) A comment to store the name of the person or organization \n"
@@ -442,7 +431,7 @@ UniValue listaddressgroupings(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp)
throw runtime_error(
"listaddressgroupings\n"
@@ -493,7 +482,7 @@ UniValue signmessage(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() != 2)
throw runtime_error(
"signmessage \"bitcoinaddress\" \"message\"\n"
@@ -549,7 +538,7 @@ 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"
@@ -577,8 +566,8 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp)
if (!address.IsValid())
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address");
CScript scriptPubKey = GetScriptForDestination(address.Get());
- if (!IsMine(*pwalletMain,scriptPubKey))
- return (double)0.0;
+ if (!IsMine(*pwalletMain, scriptPubKey))
+ return ValueFromAmount(0);
// Minimum confirmations
int nMinDepth = 1;
@@ -607,7 +596,7 @@ 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"
@@ -656,39 +645,7 @@ UniValue getreceivedbyaccount(const UniValue& params, bool fHelp)
}
}
- return (double)nAmount / (double)COIN;
-}
-
-
-CAmount GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMinDepth, const isminefilter& filter)
-{
- CAmount nBalance = 0;
-
- // Tally wallet transactions
- for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
- {
- const CWalletTx& wtx = (*it).second;
- if (!CheckFinalTx(wtx) || wtx.GetBlocksToMaturity() > 0 || wtx.GetDepthInMainChain() < 0)
- continue;
-
- CAmount nReceived, nSent, nFee;
- wtx.GetAccountAmounts(strAccount, nReceived, nSent, nFee, filter);
-
- if (nReceived != 0 && wtx.GetDepthInMainChain() >= nMinDepth)
- nBalance += nReceived;
- nBalance -= nSent + nFee;
- }
-
- // Tally internal accounting entries
- nBalance += walletdb.GetAccountCreditDebit(strAccount);
-
- return nBalance;
-}
-
-CAmount GetAccountBalance(const string& strAccount, int nMinDepth, const isminefilter& filter)
-{
- CWalletDB walletdb(pwalletMain->strWalletFile);
- return GetAccountBalance(walletdb, strAccount, nMinDepth, filter);
+ return ValueFromAmount(nAmount);
}
@@ -696,7 +653,7 @@ 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"
@@ -762,7 +719,7 @@ UniValue getbalance(const UniValue& params, bool fHelp)
string strAccount = AccountFromValue(params[0]);
- CAmount nBalance = GetAccountBalance(strAccount, nMinDepth, filter);
+ CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, filter);
return ValueFromAmount(nBalance);
}
@@ -771,7 +728,7 @@ UniValue getunconfirmedbalance(const UniValue &params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() > 0)
throw runtime_error(
"getunconfirmedbalance\n"
@@ -787,7 +744,7 @@ 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"
@@ -823,33 +780,7 @@ UniValue movecmd(const UniValue& params, bool fHelp)
if (params.size() > 4)
strComment = params[4].get_str();
- CWalletDB walletdb(pwalletMain->strWalletFile);
- if (!walletdb.TxnBegin())
- throw JSONRPCError(RPC_DATABASE_ERROR, "database error");
-
- int64_t nNow = GetAdjustedTime();
-
- // Debit
- CAccountingEntry debit;
- debit.nOrderPos = pwalletMain->IncOrderPosNext(&walletdb);
- debit.strAccount = strFrom;
- debit.nCreditDebit = -nAmount;
- debit.nTime = nNow;
- debit.strOtherAccount = strTo;
- debit.strComment = strComment;
- pwalletMain->AddAccountingEntry(debit, walletdb);
-
- // Credit
- CAccountingEntry credit;
- credit.nOrderPos = pwalletMain->IncOrderPosNext(&walletdb);
- credit.strAccount = strTo;
- credit.nCreditDebit = nAmount;
- credit.nTime = nNow;
- credit.strOtherAccount = strFrom;
- credit.strComment = strComment;
- pwalletMain->AddAccountingEntry(credit, walletdb);
-
- if (!walletdb.TxnCommit())
+ if (!pwalletMain->AccountMove(strFrom, strTo, nAmount, strComment))
throw JSONRPCError(RPC_DATABASE_ERROR, "database error");
return true;
@@ -860,17 +791,16 @@ 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"
- "\nDEPRECATED (use sendtoaddress). Sent an amount from an account to a bitcoin address.\n"
- "The amount is a real and is rounded to the nearest 0.00000001."
+ "\nDEPRECATED (use sendtoaddress). Sent an amount from an account to a bitcoin address."
+ HelpRequiringPassphrase() + "\n"
"\nArguments:\n"
"1. \"fromaccount\" (string, required) The name of the account to send funds from. May be the default account using \"\".\n"
"2. \"tobitcoinaddress\" (string, required) The bitcoin address to send funds to.\n"
- "3. amount (numeric, required) The amount in " + CURRENCY_UNIT + " (transaction fee is added on top).\n"
+ "3. amount (numeric or string, required) The amount in " + CURRENCY_UNIT + " (transaction fee is added on top).\n"
"4. minconf (numeric, optional, default=1) Only use funds with at least this many confirmations.\n"
"5. \"comment\" (string, optional) A comment used to store what the transaction is for. \n"
" This is not part of the transaction, just kept in your wallet.\n"
@@ -911,7 +841,7 @@ UniValue sendfrom(const UniValue& params, bool fHelp)
EnsureWalletIsUnlocked();
// Check funds
- CAmount nBalance = GetAccountBalance(strAccount, nMinDepth, ISMINE_SPENDABLE);
+ CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, ISMINE_SPENDABLE);
if (nAmount > nBalance)
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Account has insufficient funds");
@@ -925,7 +855,7 @@ 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"
@@ -935,7 +865,7 @@ UniValue sendmany(const UniValue& params, bool fHelp)
"1. \"fromaccount\" (string, required) DEPRECATED. The account to send the funds from. Should be \"\" for the default account\n"
"2. \"amounts\" (string, required) A json object with addresses and amounts\n"
" {\n"
- " \"address\":amount (numeric) The bitcoin address is the key, the numeric amount in " + CURRENCY_UNIT + " is the value\n"
+ " \"address\":amount (numeric or string) The bitcoin address is the key, the numeric amount (can be string) in " + CURRENCY_UNIT + " is the value\n"
" ,...\n"
" }\n"
"3. minconf (numeric, optional, default=1) Only use the balance confirmed at least this many times.\n"
@@ -964,6 +894,9 @@ UniValue sendmany(const UniValue& params, bool fHelp)
LOCK2(cs_main, pwalletMain->cs_wallet);
+ if (pwalletMain->GetBroadcastTransactions() && !g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
+
string strAccount = AccountFromValue(params[0]);
UniValue sendTo = params[1].get_obj();
int nMinDepth = 1;
@@ -1014,7 +947,7 @@ UniValue sendmany(const UniValue& params, bool fHelp)
EnsureWalletIsUnlocked();
// Check funds
- CAmount nBalance = GetAccountBalance(strAccount, nMinDepth, ISMINE_SPENDABLE);
+ CAmount nBalance = pwalletMain->GetAccountBalance(strAccount, nMinDepth, ISMINE_SPENDABLE);
if (totalAmount > nBalance)
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Account has insufficient funds");
@@ -1026,20 +959,20 @@ UniValue sendmany(const UniValue& params, bool fHelp)
bool fCreated = pwalletMain->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired, nChangePosRet, strFailReason);
if (!fCreated)
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strFailReason);
- if (!pwalletMain->CommitTransaction(wtx, keyChange))
+ if (!pwalletMain->CommitTransaction(wtx, keyChange, g_connman.get()))
throw JSONRPCError(RPC_WALLET_ERROR, "Transaction commit failed");
return wtx.GetHash().GetHex();
}
-// Defined in rpcmisc.cpp
+// Defined in rpc/misc.cpp
extern CScript _createmultisig_redeemScript(const UniValue& params);
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"
@@ -1083,6 +1016,94 @@ UniValue addmultisigaddress(const UniValue& params, bool fHelp)
return CBitcoinAddress(innerID).ToString();
}
+class Witnessifier : public boost::static_visitor<bool>
+{
+public:
+ CScriptID result;
+
+ bool operator()(const CNoDestination &dest) const { return false; }
+
+ bool operator()(const CKeyID &keyID) {
+ CPubKey pubkey;
+ if (pwalletMain) {
+ CScript basescript = GetScriptForDestination(keyID);
+ isminetype typ;
+ typ = IsMine(*pwalletMain, basescript, SIGVERSION_WITNESS_V0);
+ if (typ != ISMINE_SPENDABLE && typ != ISMINE_WATCH_SOLVABLE)
+ return false;
+ CScript witscript = GetScriptForWitness(basescript);
+ pwalletMain->AddCScript(witscript);
+ result = CScriptID(witscript);
+ return true;
+ }
+ return false;
+ }
+
+ bool operator()(const CScriptID &scriptID) {
+ CScript subscript;
+ if (pwalletMain && pwalletMain->GetCScript(scriptID, subscript)) {
+ int witnessversion;
+ std::vector<unsigned char> witprog;
+ if (subscript.IsWitnessProgram(witnessversion, witprog)) {
+ result = scriptID;
+ return true;
+ }
+ isminetype typ;
+ typ = IsMine(*pwalletMain, subscript, SIGVERSION_WITNESS_V0);
+ if (typ != ISMINE_SPENDABLE && typ != ISMINE_WATCH_SOLVABLE)
+ return false;
+ CScript witscript = GetScriptForWitness(subscript);
+ pwalletMain->AddCScript(witscript);
+ result = CScriptID(witscript);
+ return true;
+ }
+ return false;
+ }
+};
+
+UniValue addwitnessaddress(const UniValue& params, bool fHelp)
+{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
+ if (fHelp || params.size() < 1 || params.size() > 1)
+ {
+ string msg = "addwitnessaddress \"address\"\n"
+ "\nAdd a witness address for a script (with pubkey or redeemscript known).\n"
+ "It returns the witness script.\n"
+
+ "\nArguments:\n"
+ "1. \"address\" (string, required) An address known to the wallet\n"
+
+ "\nResult:\n"
+ "\"witnessaddress\", (string) The value of the new address (P2SH of witness script).\n"
+ "}\n"
+ ;
+ throw runtime_error(msg);
+ }
+
+ {
+ LOCK(cs_main);
+ if (!IsWitnessEnabled(chainActive.Tip(), Params().GetConsensus()) && !GetBoolArg("-walletprematurewitness", false)) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "Segregated witness not enabled on network");
+ }
+ }
+
+ CBitcoinAddress address(params[0].get_str());
+ if (!address.IsValid())
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address");
+
+ Witnessifier w;
+ CTxDestination dest = address.Get();
+ bool ret = boost::apply_visitor(w, dest);
+ if (!ret) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "Public key or redeemscript not known to wallet, or the key is uncompressed");
+ }
+
+ pwalletMain->SetAddressBook(w.result, "", "receive");
+
+ return CBitcoinAddress(w.result).ToString();
+}
struct tallyitem
{
@@ -1170,10 +1191,10 @@ UniValue ListReceived(const UniValue& params, bool fByAccounts)
if (fByAccounts)
{
- tallyitem& item = mapAccountTally[strAccount];
- item.nAmount += nAmount;
- item.nConf = min(item.nConf, nConf);
- item.fIsWatchonly = fIsWatchonly;
+ tallyitem& _item = mapAccountTally[strAccount];
+ _item.nAmount += nAmount;
+ _item.nConf = min(_item.nConf, nConf);
+ _item.fIsWatchonly = fIsWatchonly;
}
else
{
@@ -1189,9 +1210,9 @@ UniValue ListReceived(const UniValue& params, bool fByAccounts)
UniValue transactions(UniValue::VARR);
if (it != mapTally.end())
{
- BOOST_FOREACH(const uint256& item, (*it).second.txids)
+ BOOST_FOREACH(const uint256& _item, (*it).second.txids)
{
- transactions.push_back(item.GetHex());
+ transactions.push_back(_item.GetHex());
}
}
obj.push_back(Pair("txids", transactions));
@@ -1222,14 +1243,14 @@ 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"
"\nList balances by receiving address.\n"
"\nArguments:\n"
"1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n"
- "2. includeempty (numeric, optional, default=false) Whether to include addresses that haven't received any payments.\n"
+ "2. includeempty (bool, optional, default=false) Whether to include addresses that haven't received any payments.\n"
"3. includeWatchonly (bool, optional, default=false) Whether to include watchonly addresses (see 'importaddress').\n"
"\nResult:\n"
@@ -1260,14 +1281,14 @@ 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"
"\nDEPRECATED. List balances by account.\n"
"\nArguments:\n"
"1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n"
- "2. includeempty (boolean, optional, default=false) Whether to include accounts that haven't received any payments.\n"
+ "2. includeempty (bool, optional, default=false) Whether to include accounts that haven't received any payments.\n"
"3. includeWatchonly (bool, optional, default=false) Whether to include watchonly addresses (see 'importaddress').\n"
"\nResult:\n"
@@ -1330,6 +1351,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe
entry.push_back(Pair("fee", ValueFromAmount(-nFee)));
if (fLong)
WalletTxToJSON(wtx, entry);
+ entry.push_back(Pair("abandoned", wtx.isAbandoned()));
ret.push_back(entry);
}
}
@@ -1395,7 +1417,7 @@ 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"
@@ -1422,13 +1444,14 @@ UniValue listtransactions(const UniValue& params, bool fHelp)
" \"vout\": n, (numeric) the vout value\n"
" \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the \n"
" 'send' category of transactions.\n"
+ " \"abandoned\": xxx (bool) 'true' if the transaction has been abandoned (inputs are respendable).\n"
" \"confirmations\": n, (numeric) The number of confirmations for the transaction. Available for 'send' and \n"
" 'receive' category of transactions. Negative confirmations indicate the\n"
- " transation conflicts with the block chain\n"
+ " transaction conflicts with the block chain\n"
" \"trusted\": xxx (bool) Whether we consider the outputs of this unconfirmed transaction safe to spend.\n"
" \"blockhash\": \"hashvalue\", (string) The block hash containing the transaction. Available for 'send' and 'receive'\n"
" category of transactions.\n"
- " \"blockindex\": n, (numeric) The block index containing the transaction. Available for 'send' and 'receive'\n"
+ " \"blockindex\": n, (numeric) The index of the transaction in the block that includes it. Available for 'send' and 'receive'\n"
" category of transactions.\n"
" \"blocktime\": xxx, (numeric) The block time in seconds since epoch (1 Jan 1970 GMT).\n"
" \"txid\": \"transactionid\", (string) The transaction id. Available for 'send' and 'receive' category of transactions.\n"
@@ -1440,6 +1463,8 @@ UniValue listtransactions(const UniValue& params, bool fHelp)
" \"otheraccount\": \"accountname\", (string) For the 'move' category of transactions, the account the funds came \n"
" from (for receiving funds, positive amounts), or went to (for sending funds,\n"
" negative amounts).\n"
+ " \"bip125-replaceable\": \"yes|no|unknown\" (string) Whether this transaction could be replaced due to BIP125 (replace-by-fee);\n"
+ " may be unknown for unconfirmed transactions not in the mempool\n"
" }\n"
"]\n"
@@ -1519,7 +1544,7 @@ UniValue listaccounts(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() > 2)
throw runtime_error(
"listaccounts ( minconf includeWatchonly)\n"
@@ -1598,7 +1623,7 @@ UniValue listsinceblock(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp)
throw runtime_error(
"listsinceblock ( \"blockhash\" target-confirmations includeWatchonly)\n"
@@ -1619,7 +1644,7 @@ UniValue listsinceblock(const UniValue& params, bool fHelp)
" \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the 'send' category of transactions.\n"
" \"confirmations\": n, (numeric) The number of confirmations for the transaction. Available for 'send' and 'receive' category of transactions.\n"
" \"blockhash\": \"hashvalue\", (string) The block hash containing the transaction. Available for 'send' and 'receive' category of transactions.\n"
- " \"blockindex\": n, (numeric) The block index containing the transaction. Available for 'send' and 'receive' category of transactions.\n"
+ " \"blockindex\": n, (numeric) The index of the transaction in the block that includes it. Available for 'send' and 'receive' category of transactions.\n"
" \"blocktime\": xxx, (numeric) The block time in seconds since epoch (1 Jan 1970 GMT).\n"
" \"txid\": \"transactionid\", (string) The transaction id. Available for 'send' and 'receive' category of transactions.\n"
" \"time\": xxx, (numeric) The transaction time in seconds since epoch (Jan 1 1970 GMT).\n"
@@ -1690,7 +1715,7 @@ 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"
@@ -1703,11 +1728,13 @@ UniValue gettransaction(const UniValue& params, bool fHelp)
" \"amount\" : x.xxx, (numeric) The transaction amount in " + CURRENCY_UNIT + "\n"
" \"confirmations\" : n, (numeric) The number of confirmations\n"
" \"blockhash\" : \"hash\", (string) The block hash\n"
- " \"blockindex\" : xx, (numeric) The block index\n"
+ " \"blockindex\" : xx, (numeric) The index of the transaction in the block that includes it\n"
" \"blocktime\" : ttt, (numeric) The time in seconds since epoch (1 Jan 1970 GMT)\n"
" \"txid\" : \"transactionid\", (string) The transaction id.\n"
" \"time\" : ttt, (numeric) The transaction time in seconds since epoch (1 Jan 1970 GMT)\n"
" \"timereceived\" : ttt, (numeric) The time received in seconds since epoch (1 Jan 1970 GMT)\n"
+ " \"bip125-replaceable\": \"yes|no|unknown\" (string) Whether this transaction could be replaced due to BIP125 (replace-by-fee);\n"
+ " may be unknown for unconfirmed transactions not in the mempool\n"
" \"details\" : [\n"
" {\n"
" \"account\" : \"accountname\", (string) DEPRECATED. The account name involved in the transaction, can be \"\" for the default account.\n"
@@ -1764,16 +1791,50 @@ UniValue gettransaction(const UniValue& params, bool fHelp)
return entry;
}
+UniValue abandontransaction(const UniValue& params, bool fHelp)
+{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
+ if (fHelp || params.size() != 1)
+ throw runtime_error(
+ "abandontransaction \"txid\"\n"
+ "\nMark in-wallet transaction <txid> as abandoned\n"
+ "This will mark this transaction and all its in-wallet descendants as abandoned which will allow\n"
+ "for their inputs to be respent. It can be used to replace \"stuck\" or evicted transactions.\n"
+ "It only works on transactions which are not included in a block and are not currently in the mempool.\n"
+ "It has no effect on transactions which are already conflicted or abandoned.\n"
+ "\nArguments:\n"
+ "1. \"txid\" (string, required) The transaction id\n"
+ "\nResult:\n"
+ "\nExamples:\n"
+ + HelpExampleCli("abandontransaction", "\"1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d\"")
+ + HelpExampleRpc("abandontransaction", "\"1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d\"")
+ );
+
+ LOCK2(cs_main, pwalletMain->cs_wallet);
+
+ uint256 hash;
+ hash.SetHex(params[0].get_str());
+
+ if (!pwalletMain->mapWallet.count(hash))
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid or non-wallet transaction id");
+ if (!pwalletMain->AbandonTransaction(hash))
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not eligible for abandonment");
+
+ return NullUniValue;
+}
+
UniValue backupwallet(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() != 1)
throw runtime_error(
"backupwallet \"destination\"\n"
- "\nSafely copies wallet.dat to destination, which can be a directory or a path with filename.\n"
+ "\nSafely copies current wallet file to destination, which can be a directory or a path with filename.\n"
"\nArguments:\n"
"1. \"destination\" (string) The destination directory or file\n"
"\nExamples:\n"
@@ -1784,7 +1845,7 @@ UniValue backupwallet(const UniValue& params, bool fHelp)
LOCK2(cs_main, pwalletMain->cs_wallet);
string strDest = params[0].get_str();
- if (!BackupWallet(*pwalletMain, strDest))
+ if (!pwalletMain->BackupWallet(strDest))
throw JSONRPCError(RPC_WALLET_ERROR, "Error: Wallet backup failed!");
return NullUniValue;
@@ -1795,7 +1856,7 @@ UniValue keypoolrefill(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() > 1)
throw runtime_error(
"keypoolrefill ( newsize )\n"
@@ -1839,7 +1900,7 @@ 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"
@@ -1899,7 +1960,7 @@ 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"
@@ -1945,7 +2006,7 @@ UniValue walletlock(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 0))
throw runtime_error(
"walletlock\n"
@@ -1984,7 +2045,7 @@ 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"
@@ -2034,26 +2095,27 @@ UniValue encryptwallet(const UniValue& params, bool fHelp)
// slack space in .dat files; that is bad if the old data is
// unencrypted private keys. So:
StartShutdown();
- return "wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet. The keypool has been flushed, you need to make a new backup.";
+ return "wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet. The keypool has been flushed and a new HD seed was generated (if you are using HD). You need to make a new backup.";
}
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"
+ "lockunspent unlock ([{\"txid\":\"txid\",\"vout\":n},...])\n"
"\nUpdates list of temporarily unspendable outputs.\n"
"Temporarily lock (unlock=false) or unlock (unlock=true) specified transaction outputs.\n"
+ "If no transaction outputs are specified when unlocking then all current locked transaction outputs are unlocked.\n"
"A locked transaction output will not be chosen by automatic coin selection, when spending bitcoins.\n"
"Locks are stored in memory only. Nodes start with zero locked outputs, and the locked output list\n"
"is always cleared (by virtue of process exit) when a node stops or fails.\n"
"Also see the listunspent call\n"
"\nArguments:\n"
"1. unlock (boolean, required) Whether to unlock (true) or lock (false) the specified transactions\n"
- "2. \"transactions\" (string, required) A json array of objects. Each object the txid (string) vout (numeric)\n"
+ "2. \"transactions\" (string, optional) A json array of objects. Each object the txid (string) vout (numeric)\n"
" [ (json array of json objects)\n"
" {\n"
" \"txid\":\"id\", (string) The transaction id\n"
@@ -2100,7 +2162,11 @@ UniValue lockunspent(const UniValue& params, bool fHelp)
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected object");
const UniValue& o = output.get_obj();
- RPCTypeCheckObj(o, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM));
+ RPCTypeCheckObj(o,
+ {
+ {"txid", UniValueType(UniValue::VSTR)},
+ {"vout", UniValueType(UniValue::VNUM)},
+ });
string txid = find_value(o, "txid").get_str();
if (!IsHex(txid))
@@ -2125,7 +2191,7 @@ UniValue listlockunspent(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() > 0)
throw runtime_error(
"listlockunspent\n"
@@ -2174,13 +2240,13 @@ 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"
"\nSet the transaction fee per kB. Overwrites the paytxfee parameter.\n"
"\nArguments:\n"
- "1. amount (numeric, required) The transaction fee in " + CURRENCY_UNIT + "/kB rounded to the nearest 0.00000001\n"
+ "1. amount (numeric or string, required) The transaction fee in " + CURRENCY_UNIT + "/kB\n"
"\nResult\n"
"true|false (boolean) Returns true if successful\n"
"\nExamples:\n"
@@ -2201,22 +2267,23 @@ UniValue getwalletinfo(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() != 0)
throw runtime_error(
"getwalletinfo\n"
"Returns an object containing various wallet state info.\n"
"\nResult:\n"
"{\n"
- " \"walletversion\": xxxxx, (numeric) the wallet version\n"
- " \"balance\": xxxxxxx, (numeric) the total confirmed balance of the wallet in " + CURRENCY_UNIT + "\n"
- " \"unconfirmed_balance\": xxx, (numeric) the total unconfirmed balance of the wallet in " + CURRENCY_UNIT + "\n"
- " \"immature_balance\": xxxxxx, (numeric) the total immature balance of the wallet in " + CURRENCY_UNIT + "\n"
- " \"txcount\": xxxxxxx, (numeric) the total number of transactions in the wallet\n"
- " \"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 " + CURRENCY_UNIT + "/kB\n"
+ " \"walletversion\": xxxxx, (numeric) the wallet version\n"
+ " \"balance\": xxxxxxx, (numeric) the total confirmed balance of the wallet in " + CURRENCY_UNIT + "\n"
+ " \"unconfirmed_balance\": xxx, (numeric) the total unconfirmed balance of the wallet in " + CURRENCY_UNIT + "\n"
+ " \"immature_balance\": xxxxxx, (numeric) the total immature balance of the wallet in " + CURRENCY_UNIT + "\n"
+ " \"txcount\": xxxxxxx, (numeric) the total number of transactions in the wallet\n"
+ " \"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 " + CURRENCY_UNIT + "/kB\n"
+ " \"hdmasterkeyid\": \"<hash160>\", (string) the Hash160 of the HD master pubkey\n"
"}\n"
"\nExamples:\n"
+ HelpExampleCli("getwalletinfo", "")
@@ -2236,6 +2303,9 @@ UniValue getwalletinfo(const UniValue& params, bool fHelp)
if (pwalletMain->IsCrypted())
obj.push_back(Pair("unlocked_until", nWalletUnlockTime));
obj.push_back(Pair("paytxfee", ValueFromAmount(payTxFee.GetFeePerK())));
+ CKeyID masterKeyID = pwalletMain->GetHDChain().masterKeyID;
+ if (!masterKeyID.IsNull())
+ obj.push_back(Pair("hdmasterkeyid", masterKeyID.GetHex()));
return obj;
}
@@ -2243,7 +2313,7 @@ UniValue resendwallettransactions(const UniValue& params, bool fHelp)
{
if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue;
-
+
if (fHelp || params.size() != 0)
throw runtime_error(
"resendwallettransactions\n"
@@ -2253,9 +2323,12 @@ UniValue resendwallettransactions(const UniValue& params, bool fHelp)
"Returns array of transaction ids that were re-broadcast.\n"
);
+ if (!g_connman)
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
+
LOCK2(cs_main, pwalletMain->cs_wallet);
- std::vector<uint256> txids = pwalletMain->ResendWalletTransactionsBefore(GetTime());
+ std::vector<uint256> txids = pwalletMain->ResendWalletTransactionsBefore(GetTime(), g_connman.get());
UniValue result(UniValue::VARR);
BOOST_FOREACH(const uint256& txid, txids)
{
@@ -2268,15 +2341,13 @@ 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"
@@ -2288,13 +2359,16 @@ UniValue listunspent(const UniValue& params, bool fHelp)
"\nResult\n"
"[ (array of json object)\n"
" {\n"
- " \"txid\" : \"txid\", (string) the transaction id \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"
+ " \"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 " + CURRENCY_UNIT + "\n"
- " \"confirmations\" : n (numeric) The number of confirmations\n"
+ " \"confirmations\" : n, (numeric) The number of confirmations\n"
+ " \"redeemScript\" : n (string) The redeemScript if scriptPubKey is P2SH\n"
+ " \"spendable\" : xxx, (bool) Whether we have the private keys to spend this output\n"
+ " \"solvable\" : xxx (bool) Whether we know how to spend this output, ignoring the lack of keys\n"
" }\n"
" ,...\n"
"]\n"
@@ -2338,39 +2412,36 @@ UniValue listunspent(const UniValue& params, bool fHelp)
if (out.nDepth < nMinDepth || out.nDepth > nMaxDepth)
continue;
- if (setAddress.size()) {
- CTxDestination address;
- if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address))
- continue;
+ CTxDestination address;
+ const CScript& scriptPubKey = out.tx->vout[out.i].scriptPubKey;
+ bool fValidAddress = ExtractDestination(scriptPubKey, address);
- if (!setAddress.count(address))
- continue;
- }
+ if (setAddress.size() && (!fValidAddress || !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)) {
+
+ if (fValidAddress) {
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)) {
+
+ if (scriptPubKey.IsPayToScriptHash()) {
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("scriptPubKey", HexStr(scriptPubKey.begin(), scriptPubKey.end())));
+ entry.push_back(Pair("amount", ValueFromAmount(out.tx->vout[out.i].nValue)));
+ entry.push_back(Pair("confirmations", out.nDepth));
entry.push_back(Pair("spendable", out.fSpendable));
+ entry.push_back(Pair("solvable", out.fSolvable));
results.push_back(entry);
}
@@ -2384,22 +2455,31 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp)
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
- "fundrawtransaction \"hexstring\" includeWatching\n"
+ "fundrawtransaction \"hexstring\" ( options )\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"
"Note that all existing inputs must have their previous output transaction be in the wallet.\n"
- "Note that all inputs selected must be of standard form and P2SH scripts must be"
+ "Note that all inputs selected must be of standard form and P2SH scripts must be\n"
"in the wallet using importaddress or addmultisigaddress (to calculate fees).\n"
+ "You can see whether this is the case by checking the \"solvable\" field in the listunspent output.\n"
"Only pay-to-pubkey, multisig, and P2SH versions thereof are currently supported for watch-only\n"
"\nArguments:\n"
- "1. \"hexstring\" (string, required) The hex string of the raw transaction\n"
- "2. includeWatching (boolean, optional, default false) Also select inputs which are watch only\n"
+ "1. \"hexstring\" (string, required) The hex string of the raw transaction\n"
+ "2. options (object, optional)\n"
+ " {\n"
+ " \"changeAddress\" (string, optional, default pool address) The bitcoin address to receive the change\n"
+ " \"changePosition\" (numeric, optional, default random) The index of the change output\n"
+ " \"includeWatching\" (boolean, optional, default false) Also select inputs which are watch only\n"
+ " \"lockUnspents\" (boolean, optional, default false) Lock selected unspent outputs\n"
+ " \"feeRate\" (numeric, optional, default not set: makes wallet determine the fee) Set a specific feerate (" + CURRENCY_UNIT + " per KB)\n"
+ " }\n"
+ " for backward compatibility: passing in a true instead of an object will result in {\"includeWatching\":true}\n"
"\nResult:\n"
"{\n"
" \"hex\": \"value\", (string) The resulting raw transaction (hex-encoded string)\n"
- " \"fee\": n, (numeric) Fee the resulting transaction pays\n"
+ " \"fee\": n, (numeric) Fee in " + CURRENCY_UNIT + " the resulting transaction pays\n"
" \"changepos\": n (numeric) The position of the added change output, or -1\n"
"}\n"
"\"hex\" \n"
@@ -2414,31 +2494,152 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp)
+ HelpExampleCli("sendrawtransaction", "\"signedtransactionhex\"")
);
- RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VBOOL));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR));
+
+ CTxDestination changeAddress = CNoDestination();
+ int changePosition = -1;
+ bool includeWatching = false;
+ bool lockUnspents = false;
+ CFeeRate feeRate = CFeeRate(0);
+ bool overrideEstimatedFeerate = false;
+
+ if (params.size() > 1) {
+ if (params[1].type() == UniValue::VBOOL) {
+ // backward compatibility bool only fallback
+ includeWatching = params[1].get_bool();
+ }
+ else {
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VOBJ));
+
+ UniValue options = params[1];
+
+ RPCTypeCheckObj(options,
+ {
+ {"changeAddress", UniValueType(UniValue::VSTR)},
+ {"changePosition", UniValueType(UniValue::VNUM)},
+ {"includeWatching", UniValueType(UniValue::VBOOL)},
+ {"lockUnspents", UniValueType(UniValue::VBOOL)},
+ {"feeRate", UniValueType()}, // will be checked below
+ },
+ true, true);
+
+ if (options.exists("changeAddress")) {
+ CBitcoinAddress address(options["changeAddress"].get_str());
+
+ if (!address.IsValid())
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "changeAddress must be a valid bitcoin address");
+
+ changeAddress = address.Get();
+ }
+
+ if (options.exists("changePosition"))
+ changePosition = options["changePosition"].get_int();
+
+ if (options.exists("includeWatching"))
+ includeWatching = options["includeWatching"].get_bool();
+
+ if (options.exists("lockUnspents"))
+ lockUnspents = options["lockUnspents"].get_bool();
+
+ if (options.exists("feeRate"))
+ {
+ feeRate = CFeeRate(AmountFromValue(options["feeRate"]));
+ overrideEstimatedFeerate = true;
+ }
+ }
+ }
// parse hex string from parameter
CTransaction origTx;
- if (!DecodeHexTx(origTx, params[0].get_str()))
+ if (!DecodeHexTx(origTx, params[0].get_str(), true))
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
if (origTx.vout.size() == 0)
throw JSONRPCError(RPC_INVALID_PARAMETER, "TX must have at least one output");
- bool includeWatching = false;
- if (params.size() > 1)
- includeWatching = params[1].get_bool();
+ if (changePosition != -1 && (changePosition < 0 || (unsigned int)changePosition > origTx.vout.size()))
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "changePosition out of bounds");
CMutableTransaction tx(origTx);
- CAmount nFee;
+ CAmount nFeeOut;
string strFailReason;
- int nChangePos = -1;
- if(!pwalletMain->FundTransaction(tx, nFee, nChangePos, strFailReason, includeWatching))
+
+ if(!pwalletMain->FundTransaction(tx, nFeeOut, overrideEstimatedFeerate, feeRate, changePosition, strFailReason, includeWatching, lockUnspents, changeAddress))
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)));
+ result.push_back(Pair("changepos", changePosition));
+ result.push_back(Pair("fee", ValueFromAmount(nFeeOut)));
return result;
}
+
+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 importpubkey(const UniValue& params, bool fHelp);
+extern UniValue dumpwallet(const UniValue& params, bool fHelp);
+extern UniValue importwallet(const UniValue& params, bool fHelp);
+extern UniValue importprunedfunds(const UniValue& params, bool fHelp);
+extern UniValue removeprunedfunds(const UniValue& params, bool fHelp);
+
+static const CRPCCommand commands[] =
+{ // category name actor (function) okSafeMode
+ // --------------------- ------------------------ ----------------------- ----------
+ { "rawtransactions", "fundrawtransaction", &fundrawtransaction, false },
+ { "hidden", "resendwallettransactions", &resendwallettransactions, true },
+ { "wallet", "abandontransaction", &abandontransaction, false },
+ { "wallet", "addmultisigaddress", &addmultisigaddress, true },
+ { "wallet", "addwitnessaddress", &addwitnessaddress, 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", "importprunedfunds", &importprunedfunds, true },
+ { "wallet", "importpubkey", &importpubkey, 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 },
+ { "wallet", "removeprunedfunds", &removeprunedfunds, true },
+};
+
+void RegisterWalletRPCCommands(CRPCTable &t)
+{
+ if (GetBoolArg("-disablewallet", false))
+ return;
+
+ for (unsigned int vcidx = 0; vcidx < ARRAYLEN(commands); vcidx++)
+ t.appendCommand(commands[vcidx].name, &commands[vcidx]);
+}
diff --git a/src/wallet/rpcwallet.h b/src/wallet/rpcwallet.h
new file mode 100644
index 0000000000..3a68ccf1b2
--- /dev/null
+++ b/src/wallet/rpcwallet.h
@@ -0,0 +1,12 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_WALLET_RPCWALLET_H
+#define BITCOIN_WALLET_RPCWALLET_H
+
+class CRPCTable;
+
+void RegisterWalletRPCCommands(CRPCTable &t);
+
+#endif //BITCOIN_WALLET_RPCWALLET_H
diff --git a/src/test/accounting_tests.cpp b/src/wallet/test/accounting_tests.cpp
index 4a294c6712..a833be13d0 100644
--- a/src/test/accounting_tests.cpp
+++ b/src/wallet/test/accounting_tests.cpp
@@ -1,11 +1,10 @@
-// Copyright (c) 2012-2014 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.
#include "wallet/wallet.h"
-#include "wallet/walletdb.h"
-#include "test/test_bitcoin.h"
+#include "wallet/test/wallet_test_fixture.h"
#include <stdint.h>
@@ -14,16 +13,16 @@
extern CWallet* pwalletMain;
-BOOST_FIXTURE_TEST_SUITE(accounting_tests, TestingSetup)
+BOOST_FIXTURE_TEST_SUITE(accounting_tests, WalletTestingSetup)
static void
-GetResults(CWalletDB& walletdb, std::map<CAmount, CAccountingEntry>& results)
+GetResults(std::map<CAmount, CAccountingEntry>& results)
{
std::list<CAccountingEntry> aes;
results.clear();
- BOOST_CHECK(walletdb.ReorderTransactions(pwalletMain) == DB_LOAD_OK);
- walletdb.ListAccountCreditDebit("", aes);
+ BOOST_CHECK(pwalletMain->ReorderTransactions() == DB_LOAD_OK);
+ pwalletMain->ListAccountCreditDebit("", aes);
BOOST_FOREACH(CAccountingEntry& ae, aes)
{
results[ae.nOrderPos] = ae;
@@ -32,7 +31,6 @@ GetResults(CWalletDB& walletdb, std::map<CAmount, CAccountingEntry>& results)
BOOST_AUTO_TEST_CASE(acc_orderupgrade)
{
- CWalletDB walletdb(pwalletMain->strWalletFile);
std::vector<CWalletTx*> vpwtx;
CWalletTx wtx;
CAccountingEntry ae;
@@ -45,19 +43,19 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
ae.nTime = 1333333333;
ae.strOtherAccount = "b";
ae.strComment = "";
- pwalletMain->AddAccountingEntry(ae, walletdb);
+ pwalletMain->AddAccountingEntry(ae);
wtx.mapValue["comment"] = "z";
- pwalletMain->AddToWallet(wtx, false, &walletdb);
+ pwalletMain->AddToWallet(wtx);
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
vpwtx[0]->nTimeReceived = (unsigned int)1333333335;
vpwtx[0]->nOrderPos = -1;
ae.nTime = 1333333336;
ae.strOtherAccount = "c";
- pwalletMain->AddAccountingEntry(ae, walletdb);
+ pwalletMain->AddAccountingEntry(ae);
- GetResults(walletdb, results);
+ GetResults(results);
BOOST_CHECK(pwalletMain->nOrderPosNext == 3);
BOOST_CHECK(2 == results.size());
@@ -71,9 +69,9 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
ae.nTime = 1333333330;
ae.strOtherAccount = "d";
ae.nOrderPos = pwalletMain->IncOrderPosNext();
- pwalletMain->AddAccountingEntry(ae, walletdb);
+ pwalletMain->AddAccountingEntry(ae);
- GetResults(walletdb, results);
+ GetResults(results);
BOOST_CHECK(results.size() == 3);
BOOST_CHECK(pwalletMain->nOrderPosNext == 4);
@@ -90,7 +88,7 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
--tx.nLockTime; // Just to change the hash :)
*static_cast<CTransaction*>(&wtx) = CTransaction(tx);
}
- pwalletMain->AddToWallet(wtx, false, &walletdb);
+ pwalletMain->AddToWallet(wtx);
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
vpwtx[1]->nTimeReceived = (unsigned int)1333333336;
@@ -100,12 +98,12 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
--tx.nLockTime; // Just to change the hash :)
*static_cast<CTransaction*>(&wtx) = CTransaction(tx);
}
- pwalletMain->AddToWallet(wtx, false, &walletdb);
+ pwalletMain->AddToWallet(wtx);
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
vpwtx[2]->nTimeReceived = (unsigned int)1333333329;
vpwtx[2]->nOrderPos = -1;
- GetResults(walletdb, results);
+ GetResults(results);
BOOST_CHECK(results.size() == 3);
BOOST_CHECK(pwalletMain->nOrderPosNext == 6);
@@ -121,9 +119,9 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
ae.nTime = 1333333334;
ae.strOtherAccount = "e";
ae.nOrderPos = -1;
- pwalletMain->AddAccountingEntry(ae, walletdb);
+ pwalletMain->AddAccountingEntry(ae);
- GetResults(walletdb, results);
+ GetResults(results);
BOOST_CHECK(results.size() == 4);
BOOST_CHECK(pwalletMain->nOrderPosNext == 7);
diff --git a/src/wallet/test/crypto_tests.cpp b/src/wallet/test/crypto_tests.cpp
new file mode 100644
index 0000000000..05387f5f2b
--- /dev/null
+++ b/src/wallet/test/crypto_tests.cpp
@@ -0,0 +1,230 @@
+// 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.
+
+#include "random.h"
+#include "utilstrencodings.h"
+#include "test/test_bitcoin.h"
+#include "wallet/crypter.h"
+
+#include <vector>
+
+#include <boost/test/unit_test.hpp>
+#include <openssl/aes.h>
+#include <openssl/evp.h>
+
+BOOST_FIXTURE_TEST_SUITE(wallet_crypto, BasicTestingSetup)
+
+bool OldSetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod, unsigned char* chKey, unsigned char* chIV)
+{
+ if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE)
+ return false;
+
+ int i = 0;
+ if (nDerivationMethod == 0)
+ i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],
+ (unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV);
+
+ if (i != (int)WALLET_CRYPTO_KEY_SIZE)
+ {
+ memory_cleanse(chKey, sizeof(chKey));
+ memory_cleanse(chIV, sizeof(chIV));
+ return false;
+ }
+ return true;
+}
+
+bool OldEncrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext, const unsigned char chKey[32], const unsigned char chIV[16])
+{
+ // max ciphertext len for a n bytes of plaintext is
+ // n + AES_BLOCK_SIZE - 1 bytes
+ int nLen = vchPlaintext.size();
+ int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;
+ vchCiphertext = std::vector<unsigned char> (nCLen);
+
+ EVP_CIPHER_CTX ctx;
+
+ bool fOk = true;
+
+ EVP_CIPHER_CTX_init(&ctx);
+ if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV) != 0;
+ if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen) != 0;
+ if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0]) + nCLen, &nFLen) != 0;
+ EVP_CIPHER_CTX_cleanup(&ctx);
+
+ if (!fOk) return false;
+
+ vchCiphertext.resize(nCLen + nFLen);
+ return true;
+}
+
+bool OldDecrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext, const unsigned char chKey[32], const unsigned char chIV[16])
+{
+ // plaintext will always be equal to or lesser than length of ciphertext
+ int nLen = vchCiphertext.size();
+ int nPLen = nLen, nFLen = 0;
+
+ vchPlaintext = CKeyingMaterial(nPLen);
+
+ EVP_CIPHER_CTX ctx;
+
+ bool fOk = true;
+
+ EVP_CIPHER_CTX_init(&ctx);
+ if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV) != 0;
+ if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen) != 0;
+ if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0]) + nPLen, &nFLen) != 0;
+ EVP_CIPHER_CTX_cleanup(&ctx);
+
+ if (!fOk) return false;
+
+ vchPlaintext.resize(nPLen + nFLen);
+ return true;
+}
+
+class TestCrypter
+{
+public:
+static void TestPassphraseSingle(const std::vector<unsigned char>& vchSalt, const SecureString& passphrase, uint32_t rounds,
+ const std::vector<unsigned char>& correctKey = std::vector<unsigned char>(),
+ const std::vector<unsigned char>& correctIV=std::vector<unsigned char>())
+{
+ unsigned char chKey[WALLET_CRYPTO_KEY_SIZE];
+ unsigned char chIV[WALLET_CRYPTO_IV_SIZE];
+
+ CCrypter crypt;
+ crypt.SetKeyFromPassphrase(passphrase, vchSalt, rounds, 0);
+
+ OldSetKeyFromPassphrase(passphrase, vchSalt, rounds, 0, chKey, chIV);
+
+ BOOST_CHECK_MESSAGE(memcmp(chKey, crypt.chKey, sizeof(chKey)) == 0, \
+ HexStr(chKey, chKey+sizeof(chKey)) + std::string(" != ") + HexStr(crypt.chKey, crypt.chKey + (sizeof crypt.chKey)));
+ BOOST_CHECK_MESSAGE(memcmp(chIV, crypt.chIV, sizeof(chIV)) == 0, \
+ HexStr(chIV, chIV+sizeof(chIV)) + std::string(" != ") + HexStr(crypt.chIV, crypt.chIV + (sizeof crypt.chIV)));
+
+ if(!correctKey.empty())
+ BOOST_CHECK_MESSAGE(memcmp(chKey, &correctKey[0], sizeof(chKey)) == 0, \
+ HexStr(chKey, chKey+sizeof(chKey)) + std::string(" != ") + HexStr(correctKey.begin(), correctKey.end()));
+ if(!correctIV.empty())
+ BOOST_CHECK_MESSAGE(memcmp(chIV, &correctIV[0], sizeof(chIV)) == 0,
+ HexStr(chIV, chIV+sizeof(chIV)) + std::string(" != ") + HexStr(correctIV.begin(), correctIV.end()));
+}
+
+static void TestPassphrase(const std::vector<unsigned char>& vchSalt, const SecureString& passphrase, uint32_t rounds,
+ const std::vector<unsigned char>& correctKey = std::vector<unsigned char>(),
+ const std::vector<unsigned char>& correctIV=std::vector<unsigned char>())
+{
+ TestPassphraseSingle(vchSalt, passphrase, rounds, correctKey, correctIV);
+ for(SecureString::const_iterator i(passphrase.begin()); i != passphrase.end(); ++i)
+ TestPassphraseSingle(vchSalt, SecureString(i, passphrase.end()), rounds);
+}
+
+
+static void TestDecrypt(const CCrypter& crypt, const std::vector<unsigned char>& vchCiphertext, \
+ const std::vector<unsigned char>& vchPlaintext = std::vector<unsigned char>())
+{
+ CKeyingMaterial vchDecrypted1;
+ CKeyingMaterial vchDecrypted2;
+ int result1, result2;
+ result1 = crypt.Decrypt(vchCiphertext, vchDecrypted1);
+ result2 = OldDecrypt(vchCiphertext, vchDecrypted2, crypt.chKey, crypt.chIV);
+ BOOST_CHECK(result1 == result2);
+
+ // These two should be equal. However, OpenSSL 1.0.1j introduced a change
+ // that would zero all padding except for the last byte for failed decrypts.
+ // This behavior was reverted for 1.0.1k.
+ if (vchDecrypted1 != vchDecrypted2 && vchDecrypted1.size() >= AES_BLOCK_SIZE && SSLeay() == 0x100010afL)
+ {
+ for(CKeyingMaterial::iterator it = vchDecrypted1.end() - AES_BLOCK_SIZE; it != vchDecrypted1.end() - 1; it++)
+ *it = 0;
+ }
+
+ BOOST_CHECK_MESSAGE(vchDecrypted1 == vchDecrypted2, HexStr(vchDecrypted1.begin(), vchDecrypted1.end()) + " != " + HexStr(vchDecrypted2.begin(), vchDecrypted2.end()));
+
+ if (vchPlaintext.size())
+ BOOST_CHECK(CKeyingMaterial(vchPlaintext.begin(), vchPlaintext.end()) == vchDecrypted2);
+}
+
+static void TestEncryptSingle(const CCrypter& crypt, const CKeyingMaterial& vchPlaintext,
+ const std::vector<unsigned char>& vchCiphertextCorrect = std::vector<unsigned char>())
+{
+ std::vector<unsigned char> vchCiphertext1;
+ std::vector<unsigned char> vchCiphertext2;
+ int result1 = crypt.Encrypt(vchPlaintext, vchCiphertext1);
+
+ int result2 = OldEncrypt(vchPlaintext, vchCiphertext2, crypt.chKey, crypt.chIV);
+ BOOST_CHECK(result1 == result2);
+ BOOST_CHECK(vchCiphertext1 == vchCiphertext2);
+
+ if (!vchCiphertextCorrect.empty())
+ BOOST_CHECK(vchCiphertext2 == vchCiphertextCorrect);
+
+ const std::vector<unsigned char> vchPlaintext2(vchPlaintext.begin(), vchPlaintext.end());
+
+ if(vchCiphertext1 == vchCiphertext2)
+ TestDecrypt(crypt, vchCiphertext1, vchPlaintext2);
+}
+
+static void TestEncrypt(const CCrypter& crypt, const std::vector<unsigned char>& vchPlaintextIn, \
+ const std::vector<unsigned char>& vchCiphertextCorrect = std::vector<unsigned char>())
+{
+ TestEncryptSingle(crypt, CKeyingMaterial(vchPlaintextIn.begin(), vchPlaintextIn.end()), vchCiphertextCorrect);
+ for(std::vector<unsigned char>::const_iterator i(vchPlaintextIn.begin()); i != vchPlaintextIn.end(); ++i)
+ TestEncryptSingle(crypt, CKeyingMaterial(i, vchPlaintextIn.end()));
+}
+
+};
+
+BOOST_AUTO_TEST_CASE(passphrase) {
+ // These are expensive.
+
+ TestCrypter::TestPassphrase(ParseHex("0000deadbeef0000"), "test", 25000, \
+ ParseHex("fc7aba077ad5f4c3a0988d8daa4810d0d4a0e3bcb53af662998898f33df0556a"), \
+ ParseHex("cf2f2691526dd1aa220896fb8bf7c369"));
+
+ std::string hash(GetRandHash().ToString());
+ std::vector<unsigned char> vchSalt(8);
+ GetRandBytes(&vchSalt[0], vchSalt.size());
+ uint32_t rounds = insecure_rand();
+ if (rounds > 30000)
+ rounds = 30000;
+ TestCrypter::TestPassphrase(vchSalt, SecureString(hash.begin(), hash.end()), rounds);
+}
+
+BOOST_AUTO_TEST_CASE(encrypt) {
+ std::vector<unsigned char> vchSalt = ParseHex("0000deadbeef0000");
+ BOOST_CHECK(vchSalt.size() == WALLET_CRYPTO_SALT_SIZE);
+ CCrypter crypt;
+ crypt.SetKeyFromPassphrase("passphrase", vchSalt, 25000, 0);
+ TestCrypter::TestEncrypt(crypt, ParseHex("22bcade09ac03ff6386914359cfe885cfeb5f77ff0d670f102f619687453b29d"));
+
+ for (int i = 0; i != 100; i++)
+ {
+ uint256 hash(GetRandHash());
+ TestCrypter::TestEncrypt(crypt, std::vector<unsigned char>(hash.begin(), hash.end()));
+ }
+
+}
+
+BOOST_AUTO_TEST_CASE(decrypt) {
+ std::vector<unsigned char> vchSalt = ParseHex("0000deadbeef0000");
+ BOOST_CHECK(vchSalt.size() == WALLET_CRYPTO_SALT_SIZE);
+ CCrypter crypt;
+ crypt.SetKeyFromPassphrase("passphrase", vchSalt, 25000, 0);
+
+ // Some corner cases the came up while testing
+ TestCrypter::TestDecrypt(crypt,ParseHex("795643ce39d736088367822cdc50535ec6f103715e3e48f4f3b1a60a08ef59ca"));
+ TestCrypter::TestDecrypt(crypt,ParseHex("de096f4a8f9bd97db012aa9d90d74de8cdea779c3ee8bc7633d8b5d6da703486"));
+ TestCrypter::TestDecrypt(crypt,ParseHex("32d0a8974e3afd9c6c3ebf4d66aa4e6419f8c173de25947f98cf8b7ace49449c"));
+ TestCrypter::TestDecrypt(crypt,ParseHex("e7c055cca2faa78cb9ac22c9357a90b4778ded9b2cc220a14cea49f931e596ea"));
+ TestCrypter::TestDecrypt(crypt,ParseHex("b88efddd668a6801d19516d6830da4ae9811988ccbaf40df8fbb72f3f4d335fd"));
+ TestCrypter::TestDecrypt(crypt,ParseHex("8cae76aa6a43694e961ebcb28c8ca8f8540b84153d72865e8561ddd93fa7bfa9"));
+
+ for (int i = 0; i != 100; i++)
+ {
+ uint256 hash(GetRandHash());
+ TestCrypter::TestDecrypt(crypt, std::vector<unsigned char>(hash.begin(), hash.end()));
+ }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/wallet/test/wallet_test_fixture.cpp b/src/wallet/test/wallet_test_fixture.cpp
new file mode 100644
index 0000000000..a76db37617
--- /dev/null
+++ b/src/wallet/test/wallet_test_fixture.cpp
@@ -0,0 +1,32 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "wallet/test/wallet_test_fixture.h"
+
+#include "rpc/server.h"
+#include "wallet/db.h"
+#include "wallet/wallet.h"
+
+WalletTestingSetup::WalletTestingSetup(const std::string& chainName):
+ TestingSetup(chainName)
+{
+ bitdb.MakeMock();
+
+ bool fFirstRun;
+ pwalletMain = new CWallet("wallet_test.dat");
+ pwalletMain->LoadWallet(fFirstRun);
+ RegisterValidationInterface(pwalletMain);
+
+ RegisterWalletRPCCommands(tableRPC);
+}
+
+WalletTestingSetup::~WalletTestingSetup()
+{
+ UnregisterValidationInterface(pwalletMain);
+ delete pwalletMain;
+ pwalletMain = NULL;
+
+ bitdb.Flush(true);
+ bitdb.Reset();
+}
diff --git a/src/wallet/test/wallet_test_fixture.h b/src/wallet/test/wallet_test_fixture.h
new file mode 100644
index 0000000000..97a6d98397
--- /dev/null
+++ b/src/wallet/test/wallet_test_fixture.h
@@ -0,0 +1,18 @@
+// Copyright (c) 2016 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_WALLET_TEST_FIXTURE_H
+#define BITCOIN_WALLET_TEST_FIXTURE_H
+
+#include "test/test_bitcoin.h"
+
+/** Testing setup and teardown for wallet.
+ */
+struct WalletTestingSetup: public TestingSetup {
+ WalletTestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
+ ~WalletTestingSetup();
+};
+
+#endif
+
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
index 8b9292bd14..acf980c784 100644
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2014 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.
@@ -9,7 +9,7 @@
#include <utility>
#include <vector>
-#include "test/test_bitcoin.h"
+#include "wallet/test/wallet_test_fixture.h"
#include <boost/foreach.hpp>
#include <boost/test/unit_test.hpp>
@@ -25,9 +25,9 @@ using namespace std;
typedef set<pair<const CWalletTx*,unsigned int> > CoinSet;
-BOOST_FIXTURE_TEST_SUITE(wallet_tests, TestingSetup)
+BOOST_FIXTURE_TEST_SUITE(wallet_tests, WalletTestingSetup)
-static CWallet wallet;
+static const CWallet wallet;
static vector<COutput> vCoins;
static void add_coin(const CAmount& nValue, int nAge = 6*24, bool fIsFromMe = false, int nInput=0)
@@ -48,7 +48,7 @@ static void add_coin(const CAmount& nValue, int nAge = 6*24, bool fIsFromMe = fa
wtx->fDebitCached = true;
wtx->nDebitCached = 1;
}
- COutput output(wtx, nInput, nAge, true);
+ COutput output(wtx, nInput, nAge, true, true);
vCoins.push_back(output);
}
@@ -188,11 +188,11 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// empty the wallet and start again, now with fractions of a cent, to test small change avoidance
empty_wallet();
- add_coin(0.1*MIN_CHANGE);
- add_coin(0.2*MIN_CHANGE);
- add_coin(0.3*MIN_CHANGE);
- add_coin(0.4*MIN_CHANGE);
- add_coin(0.5*MIN_CHANGE);
+ add_coin(MIN_CHANGE * 1 / 10);
+ add_coin(MIN_CHANGE * 2 / 10);
+ add_coin(MIN_CHANGE * 3 / 10);
+ add_coin(MIN_CHANGE * 4 / 10);
+ add_coin(MIN_CHANGE * 5 / 10);
// try making 1 * MIN_CHANGE from the 1.5 * MIN_CHANGE
// we'll get change smaller than MIN_CHANGE whatever happens, so can expect MIN_CHANGE exactly
@@ -207,8 +207,8 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
BOOST_CHECK_EQUAL(nValueRet, 1 * MIN_CHANGE); // we should get the exact amount
// if we add more small coins:
- add_coin(0.6*MIN_CHANGE);
- add_coin(0.7*MIN_CHANGE);
+ add_coin(MIN_CHANGE * 6 / 10);
+ add_coin(MIN_CHANGE * 7 / 10);
// and try again to make 1.0 * MIN_CHANGE
BOOST_CHECK( wallet.SelectCoinsMinConf(1 * MIN_CHANGE, 1, 1, vCoins, setCoinsRet, nValueRet));
@@ -217,7 +217,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// run the 'mtgox' test (see http://blockexplorer.com/tx/29a3efd3ef04f9153d47a990bd7b048a4b2d213daaa5fb8ed670fb85f13bdbcf)
// they tried to consolidate 10 50k coins into one 500k coin, and ended up with 50k in change
empty_wallet();
- for (int i = 0; i < 20; i++)
+ for (int j = 0; j < 20; j++)
add_coin(50000 * COIN);
BOOST_CHECK( wallet.SelectCoinsMinConf(500000 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet));
@@ -229,9 +229,9 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// sometimes it will fail, and so we use the next biggest coin:
empty_wallet();
- add_coin(0.5 * MIN_CHANGE);
- add_coin(0.6 * MIN_CHANGE);
- add_coin(0.7 * MIN_CHANGE);
+ add_coin(MIN_CHANGE * 5 / 10);
+ add_coin(MIN_CHANGE * 6 / 10);
+ add_coin(MIN_CHANGE * 7 / 10);
add_coin(1111 * MIN_CHANGE);
BOOST_CHECK( wallet.SelectCoinsMinConf(1 * MIN_CHANGE, 1, 1, vCoins, setCoinsRet, nValueRet));
BOOST_CHECK_EQUAL(nValueRet, 1111 * MIN_CHANGE); // we get the bigger coin
@@ -239,9 +239,9 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// but sometimes it's possible, and we use an exact subset (0.4 + 0.6 = 1.0)
empty_wallet();
- add_coin(0.4 * MIN_CHANGE);
- add_coin(0.6 * MIN_CHANGE);
- add_coin(0.8 * MIN_CHANGE);
+ add_coin(MIN_CHANGE * 4 / 10);
+ add_coin(MIN_CHANGE * 6 / 10);
+ add_coin(MIN_CHANGE * 8 / 10);
add_coin(1111 * MIN_CHANGE);
BOOST_CHECK( wallet.SelectCoinsMinConf(MIN_CHANGE, 1, 1, vCoins, setCoinsRet, nValueRet));
BOOST_CHECK_EQUAL(nValueRet, MIN_CHANGE); // we should get the exact amount
@@ -249,17 +249,17 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// test avoiding small change
empty_wallet();
- add_coin(0.05 * MIN_CHANGE);
- add_coin(1 * MIN_CHANGE);
- add_coin(100 * MIN_CHANGE);
+ add_coin(MIN_CHANGE * 5 / 100);
+ add_coin(MIN_CHANGE * 1);
+ add_coin(MIN_CHANGE * 100);
// trying to make 100.01 from these three coins
- BOOST_CHECK( wallet.SelectCoinsMinConf(100.01 * MIN_CHANGE, 1, 1, vCoins, setCoinsRet, nValueRet));
- BOOST_CHECK_EQUAL(nValueRet, 101.05 * MIN_CHANGE); // we should get all coins
+ BOOST_CHECK(wallet.SelectCoinsMinConf(MIN_CHANGE * 10001 / 100, 1, 1, vCoins, setCoinsRet, nValueRet));
+ BOOST_CHECK_EQUAL(nValueRet, MIN_CHANGE * 10105 / 100); // we should get all coins
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
// but if we try to make 99.9, we should take the bigger of the two small coins to avoid small change
- BOOST_CHECK( wallet.SelectCoinsMinConf(99.9 * MIN_CHANGE, 1, 1, vCoins, setCoinsRet, nValueRet));
+ BOOST_CHECK(wallet.SelectCoinsMinConf(MIN_CHANGE * 9990 / 100, 1, 1, vCoins, setCoinsRet, nValueRet));
BOOST_CHECK_EQUAL(nValueRet, 101 * MIN_CHANGE);
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
@@ -296,7 +296,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
BOOST_CHECK(!equal_sets(setCoinsRet, setCoinsRet2));
int fails = 0;
- for (int i = 0; i < RANDOM_REPEATS; i++)
+ for (int j = 0; j < RANDOM_REPEATS; j++)
{
// selecting 1 from 100 identical coins depends on the shuffle; this test will fail 1% of the time
// run the test RANDOM_REPEATS times and only complain if all of them fail
@@ -310,10 +310,14 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// add 75 cents in small change. not enough to make 90 cents,
// then try making 90 cents. there are multiple competing "smallest bigger" coins,
// one of which should be picked at random
- add_coin( 5*CENT); add_coin(10*CENT); add_coin(15*CENT); add_coin(20*CENT); add_coin(25*CENT);
+ add_coin(5 * CENT);
+ add_coin(10 * CENT);
+ add_coin(15 * CENT);
+ add_coin(20 * CENT);
+ add_coin(25 * CENT);
fails = 0;
- for (int i = 0; i < RANDOM_REPEATS; i++)
+ for (int j = 0; j < RANDOM_REPEATS; j++)
{
// selecting 1 from 100 identical coins depends on the shuffle; this test will fail 1% of the time
// run the test RANDOM_REPEATS times and only complain if all of them fail
@@ -328,4 +332,23 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
empty_wallet();
}
+BOOST_AUTO_TEST_CASE(ApproximateBestSubset)
+{
+ CoinSet setCoinsRet;
+ CAmount nValueRet;
+
+ LOCK(wallet.cs_wallet);
+
+ empty_wallet();
+
+ // Test vValue sort order
+ for (int i = 0; i < 1000; i++)
+ add_coin(1000 * COIN);
+ add_coin(3 * COIN);
+
+ BOOST_CHECK(wallet.SelectCoinsMinConf(1003 * COIN, 1, 6, vCoins, setCoinsRet, nValueRet));
+ BOOST_CHECK_EQUAL(nValueRet, 1003 * COIN);
+ BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index d23d54e678..a1f69dd94d 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -23,6 +23,7 @@
#include "timedata.h"
#include "txmempool.h"
#include "util.h"
+#include "ui_interface.h"
#include "utilmoneystr.h"
#include <assert.h>
@@ -33,20 +34,30 @@
using namespace std;
-/**
- * Settings
- */
+CWallet* pwalletMain = NULL;
+/** Transaction fee set by the user */
CFeeRate payTxFee(DEFAULT_TRANSACTION_FEE);
-CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
unsigned int nTxConfirmTarget = DEFAULT_TX_CONFIRM_TARGET;
bool bSpendZeroConfChange = DEFAULT_SPEND_ZEROCONF_CHANGE;
bool fSendFreeTransactions = DEFAULT_SEND_FREE_TRANSACTIONS;
+bool fWalletRbf = DEFAULT_WALLET_RBF;
+
+const char * DEFAULT_WALLET_DAT = "wallet.dat";
+const uint32_t BIP32_HARDENED_KEY_LIMIT = 0x80000000;
/**
* Fees smaller than this (in satoshi) are considered zero fee (for transaction creation)
* Override with -mintxfee
*/
CFeeRate CWallet::minTxFee = CFeeRate(DEFAULT_TRANSACTION_MINFEE);
+/**
+ * If fee estimation does not have enough data to provide estimates, use this fee instead.
+ * Has no effect if not using fee estimation
+ * Override with -fallbackfee
+ */
+CFeeRate CWallet::fallbackFee = CFeeRate(DEFAULT_FALLBACK_FEE);
+
+const uint256 CMerkleTx::ABANDON_HASH(uint256S("0000000000000000000000000000000000000000000000000000000000000001"));
/** @defgroup mapWallet
*
@@ -82,7 +93,17 @@ CPubKey CWallet::GenerateNewKey()
bool fCompressed = CanSupportFeature(FEATURE_COMPRPUBKEY); // default to compressed public keys if we want 0.6.0 wallets
CKey secret;
- secret.MakeNewKey(fCompressed);
+
+ // Create new metadata
+ int64_t nCreationTime = GetTime();
+ CKeyMetadata metadata(nCreationTime);
+
+ // use HD key derivation if HD was enabled during wallet creation
+ if (IsHDEnabled()) {
+ DeriveNewChildKey(metadata, secret);
+ } else {
+ secret.MakeNewKey(fCompressed);
+ }
// Compressed public keys were introduced in version 0.6.0
if (fCompressed)
@@ -91,17 +112,55 @@ CPubKey CWallet::GenerateNewKey()
CPubKey pubkey = secret.GetPubKey();
assert(secret.VerifyPubKey(pubkey));
- // Create new metadata
- int64_t nCreationTime = GetTime();
- mapKeyMetadata[pubkey.GetID()] = CKeyMetadata(nCreationTime);
+ mapKeyMetadata[pubkey.GetID()] = metadata;
if (!nTimeFirstKey || nCreationTime < nTimeFirstKey)
nTimeFirstKey = nCreationTime;
if (!AddKeyPubKey(secret, pubkey))
- throw std::runtime_error("CWallet::GenerateNewKey(): AddKey failed");
+ throw std::runtime_error(std::string(__func__) + ": AddKey failed");
return pubkey;
}
+void CWallet::DeriveNewChildKey(CKeyMetadata& metadata, CKey& secret)
+{
+ // for now we use a fixed keypath scheme of m/0'/0'/k
+ CKey key; //master key seed (256bit)
+ CExtKey masterKey; //hd master key
+ CExtKey accountKey; //key at m/0'
+ CExtKey externalChainChildKey; //key at m/0'/0'
+ CExtKey childKey; //key at m/0'/0'/<n>'
+
+ // try to get the master key
+ if (!GetKey(hdChain.masterKeyID, key))
+ throw std::runtime_error(std::string(__func__) + ": Master key not found");
+
+ masterKey.SetMaster(key.begin(), key.size());
+
+ // derive m/0'
+ // use hardened derivation (child keys >= 0x80000000 are hardened after bip32)
+ masterKey.Derive(accountKey, BIP32_HARDENED_KEY_LIMIT);
+
+ // derive m/0'/0'
+ accountKey.Derive(externalChainChildKey, BIP32_HARDENED_KEY_LIMIT);
+
+ // derive child key at next index, skip keys already known to the wallet
+ do {
+ // always derive hardened keys
+ // childIndex | BIP32_HARDENED_KEY_LIMIT = derive childIndex in hardened child-index-range
+ // example: 1 | BIP32_HARDENED_KEY_LIMIT == 0x80000001 == 2147483649
+ externalChainChildKey.Derive(childKey, hdChain.nExternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
+ metadata.hdKeypath = "m/0'/0'/" + std::to_string(hdChain.nExternalChainCounter) + "'";
+ metadata.hdMasterKeyID = hdChain.masterKeyID;
+ // increment childkey index
+ hdChain.nExternalChainCounter++;
+ } while (HaveKey(childKey.key.GetPubKey().GetID()));
+ secret = childKey.key;
+
+ // update the chain model in the database
+ if (!CWalletDB(strWalletFile).WriteHDChain(hdChain))
+ throw std::runtime_error(std::string(__func__) + ": Writing HD chain model failed");
+}
+
bool CWallet::AddKeyPubKey(const CKey& secret, const CPubKey &pubkey)
{
AssertLockHeld(cs_wallet); // mapKeyMetadata
@@ -346,8 +405,8 @@ set<uint256> CWallet::GetConflicts(const uint256& txid) const
if (mapTxSpends.count(txin.prevout) <= 1)
continue; // No conflict if zero or one spends
range = mapTxSpends.equal_range(txin.prevout);
- for (TxSpends::const_iterator it = range.first; it != range.second; ++it)
- result.insert(it->second);
+ for (TxSpends::const_iterator _it = range.first; _it != range.second; ++_it)
+ result.insert(_it->second);
}
return result;
}
@@ -357,8 +416,21 @@ void CWallet::Flush(bool shutdown)
bitdb.Flush(shutdown);
}
-bool CWallet::Verify(const string& walletFile, string& warningString, string& errorString)
+bool CWallet::Verify()
{
+ if (GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET))
+ return true;
+
+ LogPrintf("Using BerkeleyDB version %s\n", DbEnv::version(0, 0, 0));
+ std::string walletFile = GetArg("-wallet", DEFAULT_WALLET_DAT);
+
+ LogPrintf("Using wallet %s\n", walletFile);
+ uiInterface.InitMessage(_("Verifying wallet..."));
+
+ // Wallet file must be a plain filename without a directory
+ if (walletFile != boost::filesystem::basename(walletFile) + boost::filesystem::extension(walletFile))
+ return InitError(strprintf(_("Wallet %s resides outside data directory %s"), walletFile, GetDataDir().string()));
+
if (!bitdb.Open(GetDataDir()))
{
// try moving the database env out of the way
@@ -374,9 +446,7 @@ bool CWallet::Verify(const string& walletFile, string& warningString, string& er
// try again
if (!bitdb.Open(GetDataDir())) {
// if it still fails, it probably means we can't even create the database env
- string msg = strprintf(_("Error initializing wallet database environment %s!"), GetDataDir());
- errorString += msg;
- return true;
+ return InitError(strprintf(_("Error initializing wallet database environment %s!"), GetDataDir()));
}
}
@@ -392,13 +462,14 @@ bool CWallet::Verify(const string& walletFile, string& warningString, string& er
CDBEnv::VerifyResult r = bitdb.Verify(walletFile, CWalletDB::Recover);
if (r == CDBEnv::RECOVER_OK)
{
- warningString += strprintf(_("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."), GetDataDir());
+ InitWarning(strprintf(_("Warning: Wallet file corrupt, data salvaged!"
+ " Original %s saved as %s in %s; if"
+ " your balance or transactions are incorrect you should"
+ " restore from a backup."),
+ walletFile, "wallet.{timestamp}.bak", GetDataDir()));
}
if (r == CDBEnv::RECOVER_FAIL)
- errorString += _("wallet.dat corrupt, salvage failed");
+ return InitError(strprintf(_("%s corrupt, salvage failed"), walletFile));
}
return true;
@@ -455,8 +526,11 @@ bool CWallet::IsSpent(const uint256& hash, unsigned int n) const
{
const uint256& wtxid = it->second;
std::map<uint256, CWalletTx>::const_iterator mit = mapWallet.find(wtxid);
- if (mit != mapWallet.end() && mit->second.GetDepthInMainChain() >= 0)
- return true; // Spent
+ if (mit != mapWallet.end()) {
+ int depth = mit->second.GetDepthInMainChain();
+ if (depth > 0 || (depth == 0 && !mit->second.isAbandoned()))
+ return true; // Spent
+ }
}
return false;
}
@@ -488,16 +562,14 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
return false;
CKeyingMaterial vMasterKey;
- RandAddSeedPerfmon();
vMasterKey.resize(WALLET_CRYPTO_KEY_SIZE);
- GetRandBytes(&vMasterKey[0], WALLET_CRYPTO_KEY_SIZE);
+ GetStrongRandBytes(&vMasterKey[0], WALLET_CRYPTO_KEY_SIZE);
CMasterKey kMasterKey;
- RandAddSeedPerfmon();
kMasterKey.vchSalt.resize(WALLET_CRYPTO_SALT_SIZE);
- GetRandBytes(&kMasterKey.vchSalt[0], WALLET_CRYPTO_SALT_SIZE);
+ GetStrongRandBytes(&kMasterKey.vchSalt[0], WALLET_CRYPTO_SALT_SIZE);
CCrypter crypter;
int64_t nStartTime = GetTimeMillis();
@@ -562,6 +634,15 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
Lock();
Unlock(strWalletPassphrase);
+
+ // if we are using HD, replace the HD master key (seed) with a new one
+ if (IsHDEnabled()) {
+ CKey key;
+ CPubKey masterPubKey = GenerateNewHDMasterKey();
+ if (!SetHDMasterKey(masterPubKey))
+ return false;
+ }
+
NewKeyPool();
Lock();
@@ -575,6 +656,12 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
return true;
}
+DBErrors CWallet::ReorderTransactions()
+{
+ CWalletDB walletdb(strWalletFile);
+ return walletdb.ReorderTransactions(this);
+}
+
int64_t CWallet::IncOrderPosNext(CWalletDB *pwalletdb)
{
AssertLockHeld(cs_wallet); // nOrderPosNext
@@ -587,6 +674,78 @@ int64_t CWallet::IncOrderPosNext(CWalletDB *pwalletdb)
return nRet;
}
+bool CWallet::AccountMove(std::string strFrom, std::string strTo, CAmount nAmount, std::string strComment)
+{
+ CWalletDB walletdb(strWalletFile);
+ if (!walletdb.TxnBegin())
+ return false;
+
+ int64_t nNow = GetAdjustedTime();
+
+ // Debit
+ CAccountingEntry debit;
+ debit.nOrderPos = IncOrderPosNext(&walletdb);
+ debit.strAccount = strFrom;
+ debit.nCreditDebit = -nAmount;
+ debit.nTime = nNow;
+ debit.strOtherAccount = strTo;
+ debit.strComment = strComment;
+ AddAccountingEntry(debit, &walletdb);
+
+ // Credit
+ CAccountingEntry credit;
+ credit.nOrderPos = IncOrderPosNext(&walletdb);
+ credit.strAccount = strTo;
+ credit.nCreditDebit = nAmount;
+ credit.nTime = nNow;
+ credit.strOtherAccount = strFrom;
+ credit.strComment = strComment;
+ AddAccountingEntry(credit, &walletdb);
+
+ if (!walletdb.TxnCommit())
+ return false;
+
+ return true;
+}
+
+bool CWallet::GetAccountPubkey(CPubKey &pubKey, std::string strAccount, bool bForceNew)
+{
+ CWalletDB walletdb(strWalletFile);
+
+ CAccount account;
+ walletdb.ReadAccount(strAccount, account);
+
+ if (!bForceNew) {
+ if (!account.vchPubKey.IsValid())
+ bForceNew = true;
+ else {
+ // Check if the current key has been used
+ CScript scriptPubKey = GetScriptForDestination(account.vchPubKey.GetID());
+ for (map<uint256, CWalletTx>::iterator it = mapWallet.begin();
+ it != mapWallet.end() && account.vchPubKey.IsValid();
+ ++it)
+ BOOST_FOREACH(const CTxOut& txout, (*it).second.vout)
+ if (txout.scriptPubKey == scriptPubKey) {
+ bForceNew = true;
+ break;
+ }
+ }
+ }
+
+ // Generate a new key
+ if (bForceNew) {
+ if (!GetKeyFromPool(account.vchPubKey))
+ return false;
+
+ SetAddressBook(account.vchPubKey.GetID(), strAccount, "receive");
+ walletdb.WriteAccount(strAccount, account);
+ }
+
+ pubKey = account.vchPubKey;
+
+ return true;
+}
+
void CWallet::MarkDirty()
{
{
@@ -596,132 +755,143 @@ void CWallet::MarkDirty()
}
}
-bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet, CWalletDB* pwalletdb)
+bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFlushOnClose)
{
+ LOCK(cs_wallet);
+
+ CWalletDB walletdb(strWalletFile, "r+", fFlushOnClose);
+
uint256 hash = wtxIn.GetHash();
- if (fFromLoadWallet)
+ // Inserts only if not already there, returns tx inserted or tx found
+ pair<map<uint256, CWalletTx>::iterator, bool> ret = mapWallet.insert(make_pair(hash, wtxIn));
+ CWalletTx& wtx = (*ret.first).second;
+ wtx.BindWallet(this);
+ bool fInsertedNew = ret.second;
+ if (fInsertedNew)
{
- mapWallet[hash] = wtxIn;
- CWalletTx& wtx = mapWallet[hash];
- wtx.BindWallet(this);
+ wtx.nTimeReceived = GetAdjustedTime();
+ wtx.nOrderPos = IncOrderPosNext(&walletdb);
wtxOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0)));
- AddToSpends(hash);
- BOOST_FOREACH(const CTxIn& txin, wtx.vin) {
- if (mapWallet.count(txin.prevout.hash)) {
- CWalletTx& prevtx = mapWallet[txin.prevout.hash];
- if (prevtx.nIndex == -1 && !prevtx.hashBlock.IsNull()) {
- MarkConflicted(prevtx.hashBlock, wtx.GetHash());
- }
- }
- }
- }
- else
- {
- LOCK(cs_wallet);
- // Inserts only if not already there, returns tx inserted or tx found
- pair<map<uint256, CWalletTx>::iterator, bool> ret = mapWallet.insert(make_pair(hash, wtxIn));
- CWalletTx& wtx = (*ret.first).second;
- wtx.BindWallet(this);
- bool fInsertedNew = ret.second;
- if (fInsertedNew)
- {
- wtx.nTimeReceived = GetAdjustedTime();
- wtx.nOrderPos = IncOrderPosNext(pwalletdb);
- wtxOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0)));
-
- wtx.nTimeSmart = wtx.nTimeReceived;
- if (!wtxIn.hashBlock.IsNull())
+
+ wtx.nTimeSmart = wtx.nTimeReceived;
+ if (!wtxIn.hashUnset())
+ {
+ if (mapBlockIndex.count(wtxIn.hashBlock))
{
- if (mapBlockIndex.count(wtxIn.hashBlock))
+ int64_t latestNow = wtx.nTimeReceived;
+ int64_t latestEntry = 0;
{
- int64_t latestNow = wtx.nTimeReceived;
- int64_t latestEntry = 0;
+ // Tolerate times up to the last timestamp in the wallet not more than 5 minutes into the future
+ int64_t latestTolerated = latestNow + 300;
+ const TxItems & txOrdered = wtxOrdered;
+ for (TxItems::const_reverse_iterator it = txOrdered.rbegin(); it != txOrdered.rend(); ++it)
{
- // Tolerate times up to the last timestamp in the wallet not more than 5 minutes into the future
- int64_t latestTolerated = latestNow + 300;
- const TxItems & txOrdered = wtxOrdered;
- for (TxItems::const_reverse_iterator it = txOrdered.rbegin(); it != txOrdered.rend(); ++it)
+ CWalletTx *const pwtx = (*it).second.first;
+ if (pwtx == &wtx)
+ continue;
+ CAccountingEntry *const pacentry = (*it).second.second;
+ int64_t nSmartTime;
+ if (pwtx)
{
- CWalletTx *const pwtx = (*it).second.first;
- if (pwtx == &wtx)
- continue;
- CAccountingEntry *const pacentry = (*it).second.second;
- int64_t nSmartTime;
- if (pwtx)
- {
- nSmartTime = pwtx->nTimeSmart;
- if (!nSmartTime)
- nSmartTime = pwtx->nTimeReceived;
- }
- else
- nSmartTime = pacentry->nTime;
- if (nSmartTime <= latestTolerated)
- {
- latestEntry = nSmartTime;
- if (nSmartTime > latestNow)
- latestNow = nSmartTime;
- break;
- }
+ nSmartTime = pwtx->nTimeSmart;
+ if (!nSmartTime)
+ nSmartTime = pwtx->nTimeReceived;
+ }
+ else
+ nSmartTime = pacentry->nTime;
+ if (nSmartTime <= latestTolerated)
+ {
+ latestEntry = nSmartTime;
+ if (nSmartTime > latestNow)
+ latestNow = nSmartTime;
+ break;
}
}
-
- int64_t blocktime = mapBlockIndex[wtxIn.hashBlock]->GetBlockTime();
- wtx.nTimeSmart = std::max(latestEntry, std::min(blocktime, latestNow));
}
- else
- LogPrintf("AddToWallet(): found %s in block %s not in index\n",
- wtxIn.GetHash().ToString(),
- wtxIn.hashBlock.ToString());
+
+ int64_t blocktime = mapBlockIndex[wtxIn.hashBlock]->GetBlockTime();
+ wtx.nTimeSmart = std::max(latestEntry, std::min(blocktime, latestNow));
}
- AddToSpends(hash);
+ else
+ LogPrintf("AddToWallet(): found %s in block %s not in index\n",
+ wtxIn.GetHash().ToString(),
+ wtxIn.hashBlock.ToString());
}
+ AddToSpends(hash);
+ }
- bool fUpdated = false;
- if (!fInsertedNew)
+ bool fUpdated = false;
+ if (!fInsertedNew)
+ {
+ // Merge
+ if (!wtxIn.hashUnset() && wtxIn.hashBlock != wtx.hashBlock)
{
- // Merge
- if (!wtxIn.hashBlock.IsNull() && wtxIn.hashBlock != wtx.hashBlock)
- {
- wtx.hashBlock = wtxIn.hashBlock;
- fUpdated = true;
- }
- if (wtxIn.nIndex != -1 && (wtxIn.nIndex != wtx.nIndex))
- {
- wtx.nIndex = wtxIn.nIndex;
- fUpdated = true;
- }
- if (wtxIn.fFromMe && wtxIn.fFromMe != wtx.fFromMe)
- {
- wtx.fFromMe = wtxIn.fFromMe;
- fUpdated = true;
- }
+ wtx.hashBlock = wtxIn.hashBlock;
+ fUpdated = true;
+ }
+ // If no longer abandoned, update
+ if (wtxIn.hashBlock.IsNull() && wtx.isAbandoned())
+ {
+ wtx.hashBlock = wtxIn.hashBlock;
+ fUpdated = true;
+ }
+ if (wtxIn.nIndex != -1 && (wtxIn.nIndex != wtx.nIndex))
+ {
+ wtx.nIndex = wtxIn.nIndex;
+ fUpdated = true;
+ }
+ if (wtxIn.fFromMe && wtxIn.fFromMe != wtx.fFromMe)
+ {
+ wtx.fFromMe = wtxIn.fFromMe;
+ fUpdated = true;
}
+ }
- //// debug print
- LogPrintf("AddToWallet %s %s%s\n", wtxIn.GetHash().ToString(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));
+ //// debug print
+ LogPrintf("AddToWallet %s %s%s\n", wtxIn.GetHash().ToString(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));
- // Write to disk
- if (fInsertedNew || fUpdated)
- if (!wtx.WriteToDisk(pwalletdb))
- return false;
+ // Write to disk
+ if (fInsertedNew || fUpdated)
+ if (!walletdb.WriteTx(wtx))
+ return false;
- // Break debit/credit balance caches:
- wtx.MarkDirty();
+ // Break debit/credit balance caches:
+ wtx.MarkDirty();
- // Notify UI of new or updated transaction
- NotifyTransactionChanged(this, hash, fInsertedNew ? CT_NEW : CT_UPDATED);
+ // Notify UI of new or updated transaction
+ NotifyTransactionChanged(this, hash, fInsertedNew ? CT_NEW : CT_UPDATED);
- // notify an external script when a wallet transaction comes in or is updated
- std::string strCmd = GetArg("-walletnotify", "");
+ // notify an external script when a wallet transaction comes in or is updated
+ std::string strCmd = GetArg("-walletnotify", "");
- if ( !strCmd.empty())
- {
- boost::replace_all(strCmd, "%s", wtxIn.GetHash().GetHex());
- boost::thread t(runCommand, strCmd); // thread runs free
- }
+ if ( !strCmd.empty())
+ {
+ boost::replace_all(strCmd, "%s", wtxIn.GetHash().GetHex());
+ boost::thread t(runCommand, strCmd); // thread runs free
+ }
+
+ return true;
+}
+
+bool CWallet::LoadToWallet(const CWalletTx& wtxIn)
+{
+ uint256 hash = wtxIn.GetHash();
+ mapWallet[hash] = wtxIn;
+ CWalletTx& wtx = mapWallet[hash];
+ wtx.BindWallet(this);
+ wtxOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0)));
+ AddToSpends(hash);
+ BOOST_FOREACH(const CTxIn& txin, wtx.vin) {
+ if (mapWallet.count(txin.prevout.hash)) {
+ CWalletTx& prevtx = mapWallet[txin.prevout.hash];
+ if (prevtx.nIndex == -1 && !prevtx.hashUnset()) {
+ MarkConflicted(prevtx.hashBlock, wtx.GetHash());
+ }
+ }
}
+
return true;
}
@@ -730,18 +900,18 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet, CWalletD
* pblock is optional, but should be provided if the transaction is known to be in a block.
* If fUpdate is true, existing transactions will be updated.
*/
-bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate)
+bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlockIndex* pIndex, int posInBlock, bool fUpdate)
{
{
AssertLockHeld(cs_wallet);
- if (pblock) {
+ if (posInBlock != -1) {
BOOST_FOREACH(const CTxIn& txin, tx.vin) {
std::pair<TxSpends::const_iterator, TxSpends::const_iterator> range = mapTxSpends.equal_range(txin.prevout);
while (range.first != range.second) {
if (range.first->second != tx.GetHash()) {
- LogPrintf("Transaction %s (in block %s) conflicts with wallet transaction %s (both spend %s:%i)\n", tx.GetHash().ToString(), pblock->GetHash().ToString(), range.first->second.ToString(), range.first->first.hash.ToString(), range.first->first.n);
- MarkConflicted(pblock->GetHash(), range.first->second);
+ LogPrintf("Transaction %s (in block %s) conflicts with wallet transaction %s (both spend %s:%i)\n", tx.GetHash().ToString(), pIndex->GetBlockHash().ToString(), range.first->second.ToString(), range.first->first.hash.ToString(), range.first->first.n);
+ MarkConflicted(pIndex->GetBlockHash(), range.first->second);
}
range.first++;
}
@@ -755,43 +925,102 @@ bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pbl
CWalletTx wtx(this,tx);
// Get merkle branch if transaction was found in a block
- if (pblock)
- wtx.SetMerkleBranch(*pblock);
-
- // Do not flush the wallet here for performance reasons
- // this is safe, as in case of a crash, we rescan the necessary blocks on startup through our SetBestChain-mechanism
- CWalletDB walletdb(strWalletFile, "r+", false);
+ if (posInBlock != -1)
+ wtx.SetMerkleBranch(pIndex, posInBlock);
- return AddToWallet(wtx, false, &walletdb);
+ return AddToWallet(wtx, false);
}
}
return false;
}
+bool CWallet::AbandonTransaction(const uint256& hashTx)
+{
+ LOCK2(cs_main, cs_wallet);
+
+ // Do not flush the wallet here for performance reasons
+ CWalletDB walletdb(strWalletFile, "r+", false);
+
+ std::set<uint256> todo;
+ std::set<uint256> done;
+
+ // Can't mark abandoned if confirmed or in mempool
+ assert(mapWallet.count(hashTx));
+ CWalletTx& origtx = mapWallet[hashTx];
+ if (origtx.GetDepthInMainChain() > 0 || origtx.InMempool()) {
+ return false;
+ }
+
+ todo.insert(hashTx);
+
+ while (!todo.empty()) {
+ uint256 now = *todo.begin();
+ todo.erase(now);
+ done.insert(now);
+ assert(mapWallet.count(now));
+ CWalletTx& wtx = mapWallet[now];
+ int currentconfirm = wtx.GetDepthInMainChain();
+ // If the orig tx was not in block, none of its spends can be
+ assert(currentconfirm <= 0);
+ // if (currentconfirm < 0) {Tx and spends are already conflicted, no need to abandon}
+ if (currentconfirm == 0 && !wtx.isAbandoned()) {
+ // If the orig tx was not in block/mempool, none of its spends can be in mempool
+ assert(!wtx.InMempool());
+ wtx.nIndex = -1;
+ wtx.setAbandoned();
+ wtx.MarkDirty();
+ walletdb.WriteTx(wtx);
+ NotifyTransactionChanged(this, wtx.GetHash(), CT_UPDATED);
+ // Iterate over all its outputs, and mark transactions in the wallet that spend them abandoned too
+ TxSpends::const_iterator iter = mapTxSpends.lower_bound(COutPoint(hashTx, 0));
+ while (iter != mapTxSpends.end() && iter->first.hash == now) {
+ if (!done.count(iter->second)) {
+ todo.insert(iter->second);
+ }
+ iter++;
+ }
+ // If a transaction changes 'conflicted' state, that changes the balance
+ // available of the outputs it spends. So force those to be recomputed
+ BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+ {
+ if (mapWallet.count(txin.prevout.hash))
+ mapWallet[txin.prevout.hash].MarkDirty();
+ }
+ }
+ }
+
+ return true;
+}
+
void CWallet::MarkConflicted(const uint256& hashBlock, const uint256& hashTx)
{
LOCK2(cs_main, cs_wallet);
- CBlockIndex* pindex;
- assert(mapBlockIndex.count(hashBlock));
- pindex = mapBlockIndex[hashBlock];
int conflictconfirms = 0;
- if (chainActive.Contains(pindex)) {
- conflictconfirms = -(chainActive.Height() - pindex->nHeight + 1);
+ if (mapBlockIndex.count(hashBlock)) {
+ CBlockIndex* pindex = mapBlockIndex[hashBlock];
+ if (chainActive.Contains(pindex)) {
+ conflictconfirms = -(chainActive.Height() - pindex->nHeight + 1);
+ }
}
- assert(conflictconfirms < 0);
+ // If number of conflict confirms cannot be determined, this means
+ // that the block is still unknown or not yet part of the main chain,
+ // for example when loading the wallet during a reindex. Do nothing in that
+ // case.
+ if (conflictconfirms >= 0)
+ return;
// Do not flush the wallet here for performance reasons
CWalletDB walletdb(strWalletFile, "r+", false);
- std::deque<uint256> todo;
+ std::set<uint256> todo;
std::set<uint256> done;
- todo.push_back(hashTx);
+ todo.insert(hashTx);
while (!todo.empty()) {
- uint256 now = todo.front();
- todo.pop_front();
+ uint256 now = *todo.begin();
+ todo.erase(now);
done.insert(now);
assert(mapWallet.count(now));
CWalletTx& wtx = mapWallet[now];
@@ -802,24 +1031,31 @@ void CWallet::MarkConflicted(const uint256& hashBlock, const uint256& hashTx)
wtx.nIndex = -1;
wtx.hashBlock = hashBlock;
wtx.MarkDirty();
- wtx.WriteToDisk(&walletdb);
+ walletdb.WriteTx(wtx);
// Iterate over all its outputs, and mark transactions in the wallet that spend them conflicted too
TxSpends::const_iterator iter = mapTxSpends.lower_bound(COutPoint(now, 0));
while (iter != mapTxSpends.end() && iter->first.hash == now) {
if (!done.count(iter->second)) {
- todo.push_back(iter->second);
+ todo.insert(iter->second);
}
iter++;
}
+ // If a transaction changes 'conflicted' state, that changes the balance
+ // available of the outputs it spends. So force those to be recomputed
+ BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+ {
+ if (mapWallet.count(txin.prevout.hash))
+ mapWallet[txin.prevout.hash].MarkDirty();
+ }
}
}
}
-void CWallet::SyncTransaction(const CTransaction& tx, const CBlock* pblock)
+void CWallet::SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock)
{
LOCK2(cs_main, cs_wallet);
- if (!AddToWalletIfInvolvingMe(tx, pblock, true))
+ if (!AddToWalletIfInvolvingMe(tx, pindex, posInBlock, true))
return; // Not one of ours
// If a transaction changes 'conflicted' state, that changes the balance
@@ -872,7 +1108,7 @@ isminetype CWallet::IsMine(const CTxOut& txout) const
CAmount CWallet::GetCredit(const CTxOut& txout, const isminefilter& filter) const
{
if (!MoneyRange(txout.nValue))
- throw std::runtime_error("CWallet::GetCredit(): value out of range");
+ throw std::runtime_error(std::string(__func__) + ": value out of range");
return ((IsMine(txout) & filter) ? txout.nValue : 0);
}
@@ -901,7 +1137,7 @@ bool CWallet::IsChange(const CTxOut& txout) const
CAmount CWallet::GetChange(const CTxOut& txout) const
{
if (!MoneyRange(txout.nValue))
- throw std::runtime_error("CWallet::GetChange(): value out of range");
+ throw std::runtime_error(std::string(__func__) + ": value out of range");
return (IsChange(txout) ? txout.nValue : 0);
}
@@ -925,7 +1161,7 @@ CAmount CWallet::GetDebit(const CTransaction& tx, const isminefilter& filter) co
{
nDebit += GetDebit(txin, filter);
if (!MoneyRange(nDebit))
- throw std::runtime_error("CWallet::GetDebit(): value out of range");
+ throw std::runtime_error(std::string(__func__) + ": value out of range");
}
return nDebit;
}
@@ -937,7 +1173,7 @@ CAmount CWallet::GetCredit(const CTransaction& tx, const isminefilter& filter) c
{
nCredit += GetCredit(txout, filter);
if (!MoneyRange(nCredit))
- throw std::runtime_error("CWallet::GetCredit(): value out of range");
+ throw std::runtime_error(std::string(__func__) + ": value out of range");
}
return nCredit;
}
@@ -949,11 +1185,73 @@ CAmount CWallet::GetChange(const CTransaction& tx) const
{
nChange += GetChange(txout);
if (!MoneyRange(nChange))
- throw std::runtime_error("CWallet::GetChange(): value out of range");
+ throw std::runtime_error(std::string(__func__) + ": value out of range");
}
return nChange;
}
+CPubKey CWallet::GenerateNewHDMasterKey()
+{
+ CKey key;
+ key.MakeNewKey(true);
+
+ int64_t nCreationTime = GetTime();
+ CKeyMetadata metadata(nCreationTime);
+
+ // calculate the pubkey
+ CPubKey pubkey = key.GetPubKey();
+ assert(key.VerifyPubKey(pubkey));
+
+ // set the hd keypath to "m" -> Master, refers the masterkeyid to itself
+ metadata.hdKeypath = "m";
+ metadata.hdMasterKeyID = pubkey.GetID();
+
+ {
+ LOCK(cs_wallet);
+
+ // mem store the metadata
+ mapKeyMetadata[pubkey.GetID()] = metadata;
+
+ // write the key&metadata to the database
+ if (!AddKeyPubKey(key, pubkey))
+ throw std::runtime_error(std::string(__func__) + ": AddKeyPubKey failed");
+ }
+
+ return pubkey;
+}
+
+bool CWallet::SetHDMasterKey(const CPubKey& pubkey)
+{
+ LOCK(cs_wallet);
+
+ // ensure this wallet.dat can only be opened by clients supporting HD
+ SetMinVersion(FEATURE_HD);
+
+ // store the keyid (hash160) together with
+ // the child index counter in the database
+ // as a hdchain object
+ CHDChain newHdChain;
+ newHdChain.masterKeyID = pubkey.GetID();
+ SetHDChain(newHdChain, false);
+
+ return true;
+}
+
+bool CWallet::SetHDChain(const CHDChain& chain, bool memonly)
+{
+ LOCK(cs_wallet);
+ if (!memonly && !CWalletDB(strWalletFile).WriteHDChain(chain))
+ throw runtime_error(std::string(__func__) + ": writing chain failed");
+
+ hdChain = chain;
+ return true;
+}
+
+bool CWallet::IsHDEnabled()
+{
+ return !hdChain.masterKeyID.IsNull();
+}
+
int64_t CWalletTx::GetTxTime() const
{
int64_t n = nTimeSmart;
@@ -969,7 +1267,7 @@ int CWalletTx::GetRequestCount() const
if (IsCoinBase())
{
// Generated block
- if (!hashBlock.IsNull())
+ if (!hashUnset())
{
map<uint256, int>::const_iterator mi = pwallet->mapRequestCount.find(hashBlock);
if (mi != pwallet->mapRequestCount.end())
@@ -985,11 +1283,11 @@ int CWalletTx::GetRequestCount() const
nRequests = (*mi).second;
// How about the block it's in?
- if (nRequests == 0 && !hashBlock.IsNull())
+ if (nRequests == 0 && !hashUnset())
{
- map<uint256, int>::const_iterator mi = pwallet->mapRequestCount.find(hashBlock);
- if (mi != pwallet->mapRequestCount.end())
- nRequests = (*mi).second;
+ map<uint256, int>::const_iterator _mi = pwallet->mapRequestCount.find(hashBlock);
+ if (_mi != pwallet->mapRequestCount.end())
+ nRequests = (*_mi).second;
else
nRequests = 1; // If it's in someone else's block it must have got out
}
@@ -1034,7 +1332,8 @@ void CWalletTx::GetAmounts(list<COutputEntry>& listReceived,
// In either case, we need to get the destination address
CTxDestination address;
- if (!ExtractDestination(txout.scriptPubKey, address))
+
+ if (!ExtractDestination(txout.scriptPubKey, address) && !txout.scriptPubKey.IsUnspendable())
{
LogPrintf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n",
this->GetHash().ToString());
@@ -1089,12 +1388,6 @@ void CWalletTx::GetAccountAmounts(const string& strAccount, CAmount& nReceived,
}
}
-
-bool CWalletTx::WriteToDisk(CWalletDB *pwalletdb)
-{
- return pwalletdb->WriteTx(GetHash(), *this);
-}
-
/**
* Scan the block chain (starting in pindexStart) for transactions
* from or to us. If fUpdate is true, found transactions that already
@@ -1125,9 +1418,10 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
CBlock block;
ReadBlockFromDisk(block, pindex, Params().GetConsensus());
- BOOST_FOREACH(CTransaction& tx, block.vtx)
+ int posInBlock;
+ for (posInBlock = 0; posInBlock < (int)block.vtx.size(); posInBlock++)
{
- if (AddToWalletIfInvolvingMe(tx, &block, fUpdate))
+ if (AddToWalletIfInvolvingMe(block.vtx[posInBlock], pindex, posInBlock, fUpdate))
ret++;
}
pindex = chainActive.Next(pindex);
@@ -1158,7 +1452,7 @@ void CWallet::ReacceptWalletTransactions()
int nDepth = wtx.GetDepthInMainChain();
- if (!wtx.IsCoinBase() && nDepth == 0) {
+ if (!wtx.IsCoinBase() && (nDepth == 0 && !wtx.isAbandoned())) {
mapSorted.insert(std::make_pair(wtx.nOrderPos, &wtx));
}
}
@@ -1169,19 +1463,25 @@ void CWallet::ReacceptWalletTransactions()
CWalletTx& wtx = *(item.second);
LOCK(mempool.cs);
- wtx.AcceptToMemoryPool(false);
+ wtx.AcceptToMemoryPool(false, maxTxFee);
}
}
-bool CWalletTx::RelayWalletTransaction()
+bool CWalletTx::RelayWalletTransaction(CConnman* connman)
{
assert(pwallet->GetBroadcastTransactions());
if (!IsCoinBase())
{
- if (GetDepthInMainChain() == 0) {
+ if (GetDepthInMainChain() == 0 && !isAbandoned() && InMempool()) {
LogPrintf("Relaying wtx %s\n", GetHash().ToString());
- RelayTransaction((CTransaction)*this);
- return true;
+ if (connman) {
+ CInv inv(MSG_TX, GetHash());
+ connman->ForEachNode([&inv](CNode* pnode)
+ {
+ pnode->PushInventory(inv);
+ });
+ return true;
+ }
}
}
return false;
@@ -1359,6 +1659,15 @@ CAmount CWalletTx::GetChange() const
return nChangeCached;
}
+bool CWalletTx::InMempool() const
+{
+ LOCK(mempool.cs);
+ if (mempool.exists(GetHash())) {
+ return true;
+ }
+ return false;
+}
+
bool CWalletTx::IsTrusted() const
{
// Quick answer in most cases
@@ -1373,12 +1682,8 @@ bool CWalletTx::IsTrusted() const
return false;
// Don't trust unconfirmed transactions from us unless they are in the mempool.
- {
- LOCK(mempool.cs);
- if (!mempool.exists(GetHash())) {
- return false;
- }
- }
+ if (!InMempool())
+ return false;
// Trusted if all inputs are from us and are in the mempool:
BOOST_FOREACH(const CTxIn& txin, vin)
@@ -1403,7 +1708,7 @@ bool CWalletTx::IsEquivalentTo(const CWalletTx& tx) const
return CTransaction(tx1) == CTransaction(tx2);
}
-std::vector<uint256> CWallet::ResendWalletTransactionsBefore(int64_t nTime)
+std::vector<uint256> CWallet::ResendWalletTransactionsBefore(int64_t nTime, CConnman* connman)
{
std::vector<uint256> result;
@@ -1421,13 +1726,13 @@ std::vector<uint256> CWallet::ResendWalletTransactionsBefore(int64_t nTime)
BOOST_FOREACH(PAIRTYPE(const unsigned int, CWalletTx*)& item, mapSorted)
{
CWalletTx& wtx = *item.second;
- if (wtx.RelayWalletTransaction())
+ if (wtx.RelayWalletTransaction(connman))
result.push_back(wtx.GetHash());
}
return result;
}
-void CWallet::ResendWalletTransactions(int64_t nBestBlockTime)
+void CWallet::ResendWalletTransactions(int64_t nBestBlockTime, CConnman* connman)
{
// Do this infrequently and randomly to avoid giving away
// that these are our transactions.
@@ -1445,7 +1750,7 @@ void CWallet::ResendWalletTransactions(int64_t nBestBlockTime)
// Rebroadcast unconfirmed txes older than 5 minutes before the last
// block was found:
- std::vector<uint256> relayed = ResendWalletTransactionsBefore(nBestBlockTime-5*60);
+ std::vector<uint256> relayed = ResendWalletTransactionsBefore(nBestBlockTime-5*60, connman);
if (!relayed.empty())
LogPrintf("%s: rebroadcast %u unconfirmed transactions\n", __func__, relayed.size());
}
@@ -1485,7 +1790,7 @@ CAmount CWallet::GetUnconfirmedBalance() const
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
{
const CWalletTx* pcoin = &(*it).second;
- if (!CheckFinalTx(*pcoin) || (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0))
+ if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && pcoin->InMempool())
nTotal += pcoin->GetAvailableCredit();
}
}
@@ -1530,7 +1835,7 @@ CAmount CWallet::GetUnconfirmedWatchOnlyBalance() const
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
{
const CWalletTx* pcoin = &(*it).second;
- if (!CheckFinalTx(*pcoin) || (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0))
+ if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && pcoin->InMempool())
nTotal += pcoin->GetAvailableWatchOnlyCredit();
}
}
@@ -1575,14 +1880,20 @@ void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const
if (nDepth < 0)
continue;
+ // We should not consider coins which aren't at least in our mempool
+ // It's possible for these to be conflicted via ancestors which we may never be able to detect
+ if (nDepth == 0 && !pcoin->InMempool())
+ continue;
+
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 || fIncludeZeroValue) &&
- (!coinControl || !coinControl->HasSelected() || coinControl->fAllowOtherInputs || coinControl->IsSelected((*it).first, i)))
+ (!coinControl || !coinControl->HasSelected() || coinControl->fAllowOtherInputs || coinControl->IsSelected(COutPoint((*it).first, i))))
vCoins.push_back(COutput(pcoin, i, nDepth,
((mine & ISMINE_SPENDABLE) != ISMINE_NO) ||
- (coinControl && coinControl->fAllowWatchOnly && (mine & ISMINE_WATCH_SOLVABLE) != ISMINE_NO)));
+ (coinControl && coinControl->fAllowWatchOnly && (mine & ISMINE_WATCH_SOLVABLE) != ISMINE_NO),
+ (mine & (ISMINE_SPENDABLE | ISMINE_WATCH_SOLVABLE)) != ISMINE_NO));
}
}
}
@@ -1701,7 +2012,8 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, int nConfMine, int
}
// Solve subset sum by stochastic approximation
- sort(vValue.rbegin(), vValue.rend(), CompareValueOnly());
+ std::sort(vValue.begin(), vValue.end(), CompareValueOnly());
+ std::reverse(vValue.begin(), vValue.end());
vector<char> vfBest;
CAmount nBest;
@@ -1735,10 +2047,9 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, int nConfMine, int
return true;
}
-bool CWallet::SelectCoins(const CAmount& nTargetValue, set<pair<const CWalletTx*,unsigned int> >& setCoinsRet, CAmount& nValueRet, const CCoinControl* coinControl) const
+bool CWallet::SelectCoins(const vector<COutput>& vAvailableCoins, const CAmount& nTargetValue, set<pair<const CWalletTx*,unsigned int> >& setCoinsRet, CAmount& nValueRet, const CCoinControl* coinControl) const
{
- vector<COutput> vCoins;
- AvailableCoins(vCoins, true, coinControl);
+ vector<COutput> vCoins(vAvailableCoins);
// coin control -> return all selected outputs (we want all selected to go into the transaction for sure)
if (coinControl && coinControl->HasSelected() && !coinControl->fAllowOtherInputs)
@@ -1798,7 +2109,7 @@ bool CWallet::SelectCoins(const CAmount& nTargetValue, set<pair<const CWalletTx*
return res;
}
-bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount &nFeeRet, int& nChangePosRet, std::string& strFailReason, bool includeWatching)
+bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, bool overrideEstimatedFeeRate, const CFeeRate& specificFeeRate, int& nChangePosInOut, std::string& strFailReason, bool includeWatching, bool lockUnspents, const CTxDestination& destChange)
{
vector<CRecipient> vecSend;
@@ -1810,42 +2121,46 @@ bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount &nFeeRet, int& nC
}
CCoinControl coinControl;
+ coinControl.destChange = destChange;
coinControl.fAllowOtherInputs = true;
coinControl.fAllowWatchOnly = includeWatching;
+ coinControl.fOverrideFeeRate = overrideEstimatedFeeRate;
+ coinControl.nFeeRate = specificFeeRate;
+
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))
+ if (!CreateTransaction(vecSend, wtx, reservekey, nFeeRet, nChangePosInOut, strFailReason, &coinControl, false))
return false;
- if (nChangePosRet != -1)
- tx.vout.insert(tx.vout.begin() + nChangePosRet, wtx.vout[nChangePosRet]);
+ if (nChangePosInOut != -1)
+ tx.vout.insert(tx.vout.begin() + nChangePosInOut, wtx.vout[nChangePosInOut]);
// 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 (!coinControl.IsSelected(txin.prevout))
{
- if (txin.prevout.hash == origTxIn.prevout.hash && txin.prevout.n == origTxIn.prevout.n)
+ tx.vin.push_back(txin);
+
+ if (lockUnspents)
{
- found = true;
- break;
+ LOCK2(cs_main, cs_wallet);
+ LockCoin(txin.prevout);
}
}
- 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 sign)
+ int& nChangePosInOut, std::string& strFailReason, const CCoinControl* coinControl, bool sign)
{
CAmount nValue = 0;
+ int nChangePosRequest = nChangePosInOut;
unsigned int nSubtractFeeFromAmount = 0;
BOOST_FOREACH (const CRecipient& recipient, vecSend)
{
@@ -1904,14 +2219,18 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
{
LOCK2(cs_main, cs_wallet);
{
+ std::vector<COutput> vAvailableCoins;
+ AvailableCoins(vAvailableCoins, true, coinControl);
+
nFeeRet = 0;
// Start with no fee and loop until there is enough fee
while (true)
{
+ nChangePosInOut = nChangePosRequest;
txNew.vin.clear();
txNew.vout.clear();
+ txNew.wit.SetNull();
wtxNew.fFromMe = true;
- nChangePosRet = -1;
bool fFirst = true;
CAmount nValueToSelect = nValue;
@@ -1953,7 +2272,7 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
// Choose coins to use
set<pair<const CWalletTx*,unsigned int> > setCoins;
CAmount nValueIn = 0;
- if (!SelectCoins(nValueToSelect, setCoins, nValueIn, coinControl))
+ if (!SelectCoins(vAvailableCoins, nValueToSelect, setCoins, nValueIn, coinControl))
{
strFailReason = _("Insufficient funds");
return false;
@@ -2031,14 +2350,24 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
// add the dust to the fee.
if (newTxOut.IsDust(::minRelayTxFee))
{
+ nChangePosInOut = -1;
nFeeRet += nChange;
reservekey.ReturnKey();
}
else
{
- // Insert change txn at random position:
- nChangePosRet = GetRandInt(txNew.vout.size()+1);
- vector<CTxOut>::iterator position = txNew.vout.begin()+nChangePosRet;
+ if (nChangePosInOut == -1)
+ {
+ // Insert change txn at random position:
+ nChangePosInOut = GetRandInt(txNew.vout.size()+1);
+ }
+ else if ((unsigned int)nChangePosInOut > txNew.vout.size())
+ {
+ strFailReason = _("Change index out of range");
+ return false;
+ }
+
+ vector<CTxOut>::iterator position = txNew.vout.begin()+nChangePosInOut;
txNew.vout.insert(position, newTxOut);
}
}
@@ -2047,11 +2376,17 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
// Fill vin
//
- // Note how the sequence number is set to max()-1 so that the
- // nLockTime set above actually works.
+ // Note how the sequence number is set to non-maxint so that
+ // the nLockTime set above actually works.
+ //
+ // BIP125 defines opt-in RBF as any nSequence < maxint-1, so
+ // we use the highest possible value in that range (maxint-2)
+ // to avoid conflicting with other possible uses of nSequence,
+ // and in the spirit of "smallest posible change from prior
+ // behavior."
BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
txNew.vin.push_back(CTxIn(coin.first->GetHash(),coin.second,CScript(),
- std::numeric_limits<unsigned int>::max()-1));
+ std::numeric_limits<unsigned int>::max() - (fWalletRbf ? 2 : 1)));
// Sign
int nIn = 0;
@@ -2060,33 +2395,37 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
{
bool signSuccess;
const CScript& scriptPubKey = coin.first->vout[coin.second].scriptPubKey;
- CScript& scriptSigRes = txNew.vin[nIn].scriptSig;
+ SignatureData sigdata;
if (sign)
- signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, nIn, SIGHASH_ALL), scriptPubKey, scriptSigRes);
+ signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, nIn, coin.first->vout[coin.second].nValue, SIGHASH_ALL), scriptPubKey, sigdata);
else
- signSuccess = ProduceSignature(DummySignatureCreator(this), scriptPubKey, scriptSigRes);
+ signSuccess = ProduceSignature(DummySignatureCreator(this), scriptPubKey, sigdata);
if (!signSuccess)
{
strFailReason = _("Signing transaction failed");
return false;
+ } else {
+ UpdateTransaction(txNew, nIn, sigdata);
}
+
nIn++;
}
- unsigned int nBytes = ::GetSerializeSize(txNew, SER_NETWORK, PROTOCOL_VERSION);
+ unsigned int nBytes = GetVirtualTransactionSize(txNew);
// Remove scriptSigs if we used dummy signatures for fee calculation
if (!sign) {
BOOST_FOREACH (CTxIn& vin, txNew.vin)
vin.scriptSig = CScript();
+ txNew.wit.SetNull();
}
// Embed the constructed transaction data in wtxNew.
*static_cast<CTransaction*>(&wtxNew) = CTransaction(txNew);
// Limit size
- if (nBytes >= MAX_STANDARD_TX_SIZE)
+ if (GetTransactionWeight(txNew) >= MAX_STANDARD_TX_WEIGHT)
{
strFailReason = _("Transaction too large");
return false;
@@ -2108,6 +2447,8 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
if (coinControl && nFeeNeeded > 0 && coinControl->nMinimumTotalFee > nFeeNeeded) {
nFeeNeeded = coinControl->nMinimumTotalFee;
}
+ if (coinControl && coinControl->fOverrideFeeRate)
+ nFeeNeeded = coinControl->nFeeRate.GetFee(nBytes);
// If we made it here and we aren't even able to meet the relay fee on the next pass, give up
// because we must be at the maximum allowed fee.
@@ -2133,35 +2474,26 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
/**
* Call after CreateTransaction unless you want to abort
*/
-bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
+bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey, CConnman* connman)
{
{
LOCK2(cs_main, cs_wallet);
LogPrintf("CommitTransaction:\n%s", wtxNew.ToString());
{
- // This is only to keep the database open to defeat the auto-flush for the
- // duration of this scope. This is the only place where this optimization
- // maybe makes sense; please don't do it anywhere else.
- CWalletDB* pwalletdb = fFileBacked ? new CWalletDB(strWalletFile,"r+") : NULL;
-
// Take key pair from key pool so it won't be used again
reservekey.KeepKey();
// Add tx to wallet, because if it has change it's also ours,
// otherwise just for transaction history.
- AddToWallet(wtxNew, false, pwalletdb);
+ AddToWallet(wtxNew);
// Notify that old coins are spent
- set<CWalletTx*> setCoins;
BOOST_FOREACH(const CTxIn& txin, wtxNew.vin)
{
CWalletTx &coin = mapWallet[txin.prevout.hash];
coin.BindWallet(this);
NotifyTransactionChanged(this, coin.GetHash(), CT_UPDATED);
}
-
- if (fFileBacked)
- delete pwalletdb;
}
// Track how many getdata requests our transaction gets
@@ -2170,21 +2502,33 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
if (fBroadcastTransactions)
{
// Broadcast
- if (!wtxNew.AcceptToMemoryPool(false))
+ if (!wtxNew.AcceptToMemoryPool(false, maxTxFee))
{
// This must not fail. The transaction has already been signed and recorded.
LogPrintf("CommitTransaction(): Error: Transaction not valid\n");
return false;
}
- wtxNew.RelayWalletTransaction();
+ wtxNew.RelayWalletTransaction(connman);
}
}
return true;
}
-bool CWallet::AddAccountingEntry(const CAccountingEntry& acentry, CWalletDB & pwalletdb)
+void CWallet::ListAccountCreditDebit(const std::string& strAccount, std::list<CAccountingEntry>& entries) {
+ CWalletDB walletdb(strWalletFile);
+ return walletdb.ListAccountCreditDebit(strAccount, entries);
+}
+
+bool CWallet::AddAccountingEntry(const CAccountingEntry& acentry)
{
- if (!pwalletdb.WriteAccountingEntry_Backend(acentry))
+ CWalletDB walletdb(strWalletFile);
+
+ return AddAccountingEntry(acentry, &walletdb);
+}
+
+bool CWallet::AddAccountingEntry(const CAccountingEntry& acentry, CWalletDB *pwalletdb)
+{
+ if (!pwalletdb->WriteAccountingEntry_Backend(acentry))
return false;
laccentries.push_back(acentry);
@@ -2207,14 +2551,12 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, unsigned int nConfirmTarge
if (nFeeNeeded == 0) {
int estimateFoundTarget = nConfirmTarget;
nFeeNeeded = pool.estimateSmartFee(nConfirmTarget, &estimateFoundTarget).GetFee(nTxBytes);
- // ... unless we don't have enough mempool data for our desired target
- // so we make sure we're paying at least minTxFee
- if (nFeeNeeded == 0 || (unsigned int)estimateFoundTarget > nConfirmTarget)
- nFeeNeeded = std::max(nFeeNeeded, GetRequiredFee(nTxBytes));
- }
- // prevent user from paying a non-sense fee (like 1 satoshi): 0 < fee < minRelayFee
- if (nFeeNeeded < ::minRelayTxFee.GetFee(nTxBytes))
- nFeeNeeded = ::minRelayTxFee.GetFee(nTxBytes);
+ // ... unless we don't have enough mempool data for estimatefee, then use fallbackFee
+ if (nFeeNeeded == 0)
+ nFeeNeeded = fallbackFee.GetFee(nTxBytes);
+ }
+ // prevent user from paying a fee below minRelayTxFee or minTxFee
+ nFeeNeeded = std::max(nFeeNeeded, GetRequiredFee(nTxBytes));
// But always obey the maximum
if (nFeeNeeded > maxTxFee)
nFeeNeeded = maxTxFee;
@@ -2251,6 +2593,31 @@ DBErrors CWallet::LoadWallet(bool& fFirstRunRet)
return DB_LOAD_OK;
}
+DBErrors CWallet::ZapSelectTx(vector<uint256>& vHashIn, vector<uint256>& vHashOut)
+{
+ if (!fFileBacked)
+ return DB_LOAD_OK;
+ DBErrors nZapSelectTxRet = CWalletDB(strWalletFile,"cr+").ZapSelectTx(this, vHashIn, vHashOut);
+ if (nZapSelectTxRet == DB_NEED_REWRITE)
+ {
+ if (CDB::Rewrite(strWalletFile, "\x04pool"))
+ {
+ LOCK(cs_wallet);
+ setKeyPool.clear();
+ // Note: can't top-up keypool here, because wallet is locked.
+ // User will be prompted to unlock wallet the next operation
+ // that requires a new key.
+ }
+ }
+
+ if (nZapSelectTxRet != DB_LOAD_OK)
+ return nZapSelectTxRet;
+
+ MarkDirty();
+
+ return DB_LOAD_OK;
+
+}
DBErrors CWallet::ZapWalletTx(std::vector<CWalletTx>& vWtx)
{
@@ -2383,7 +2750,7 @@ bool CWallet::TopUpKeyPool(unsigned int kpSize)
if (!setKeyPool.empty())
nEnd = *(--setKeyPool.end()) + 1;
if (!walletdb.WritePool(nEnd, CKeyPool(GenerateNewKey())))
- throw runtime_error("TopUpKeyPool(): writing generated key failed");
+ throw runtime_error(std::string(__func__) + ": writing generated key failed");
setKeyPool.insert(nEnd);
LogPrintf("keypool added key %d, size=%u\n", nEnd, setKeyPool.size());
}
@@ -2410,9 +2777,9 @@ void CWallet::ReserveKeyFromKeyPool(int64_t& nIndex, CKeyPool& keypool)
nIndex = *(setKeyPool.begin());
setKeyPool.erase(setKeyPool.begin());
if (!walletdb.ReadPool(nIndex, keypool))
- throw runtime_error("ReserveKeyFromKeyPool(): read failed");
+ throw runtime_error(std::string(__func__) + ": read failed");
if (!HaveKey(keypool.vchPubKey.GetID()))
- throw runtime_error("ReserveKeyFromKeyPool(): unknown key in key pool");
+ throw runtime_error(std::string(__func__) + ": unknown key in key pool");
assert(keypool.vchPubKey.IsValid());
LogPrintf("keypool reserve %d\n", nIndex);
}
@@ -2460,12 +2827,19 @@ bool CWallet::GetKeyFromPool(CPubKey& result)
int64_t CWallet::GetOldestKeyPoolTime()
{
- int64_t nIndex = 0;
- CKeyPool keypool;
- ReserveKeyFromKeyPool(nIndex, keypool);
- if (nIndex == -1)
+ LOCK(cs_wallet);
+
+ // if the keypool is empty, return <NOW>
+ if (setKeyPool.empty())
return GetTime();
- ReturnKey(nIndex);
+
+ // load oldest key from keypool, get time and return
+ CKeyPool keypool;
+ CWalletDB walletdb(strWalletFile);
+ int64_t nIndex = *(setKeyPool.begin());
+ if (!walletdb.ReadPool(nIndex, keypool))
+ throw runtime_error(std::string(__func__) + ": read oldest key in keypool failed");
+ assert(keypool.vchPubKey.IsValid());
return keypool.nTime;
}
@@ -2568,17 +2942,17 @@ set< set<CTxDestination> > CWallet::GetAddressGroupings()
set< set<CTxDestination>* > uniqueGroupings; // a set of pointers to groups of addresses
map< CTxDestination, set<CTxDestination>* > setmap; // map addresses to the unique group containing it
- BOOST_FOREACH(set<CTxDestination> grouping, groupings)
+ BOOST_FOREACH(set<CTxDestination> _grouping, groupings)
{
// make a set of all the groups hit by this new group
set< set<CTxDestination>* > hits;
map< CTxDestination, set<CTxDestination>* >::iterator it;
- BOOST_FOREACH(CTxDestination address, grouping)
+ BOOST_FOREACH(CTxDestination address, _grouping)
if ((it = setmap.find(address)) != setmap.end())
hits.insert((*it).second);
// merge all hit groups into a new single group and delete old groups
- set<CTxDestination>* merged = new set<CTxDestination>(grouping);
+ set<CTxDestination>* merged = new set<CTxDestination>(_grouping);
BOOST_FOREACH(set<CTxDestination>* hit, hits)
{
merged->insert(hit->begin(), hit->end());
@@ -2602,6 +2976,37 @@ set< set<CTxDestination> > CWallet::GetAddressGroupings()
return ret;
}
+CAmount CWallet::GetAccountBalance(const std::string& strAccount, int nMinDepth, const isminefilter& filter)
+{
+ CWalletDB walletdb(strWalletFile);
+ return GetAccountBalance(walletdb, strAccount, nMinDepth, filter);
+}
+
+CAmount CWallet::GetAccountBalance(CWalletDB& walletdb, const std::string& strAccount, int nMinDepth, const isminefilter& filter)
+{
+ CAmount nBalance = 0;
+
+ // Tally wallet transactions
+ for (map<uint256, CWalletTx>::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
+ {
+ const CWalletTx& wtx = (*it).second;
+ if (!CheckFinalTx(wtx) || wtx.GetBlocksToMaturity() > 0 || wtx.GetDepthInMainChain() < 0)
+ continue;
+
+ CAmount nReceived, nSent, nFee;
+ wtx.GetAccountAmounts(strAccount, nReceived, nSent, nFee, filter);
+
+ if (nReceived != 0 && wtx.GetDepthInMainChain() >= nMinDepth)
+ nBalance += nReceived;
+ nBalance -= nSent + nFee;
+ }
+
+ // Tally internal accounting entries
+ nBalance += walletdb.GetAccountCreditDebit(strAccount);
+
+ return nBalance;
+}
+
std::set<CTxDestination> CWallet::GetAccountAddresses(const std::string& strAccount) const
{
LOCK(cs_wallet);
@@ -2660,11 +3065,11 @@ void CWallet::GetAllReserveKeys(set<CKeyID>& setAddress) const
{
CKeyPool keypool;
if (!walletdb.ReadPool(id, keypool))
- throw runtime_error("GetAllReserveKeyHashes(): read failed");
+ throw runtime_error(std::string(__func__) + ": read failed");
assert(keypool.vchPubKey.IsValid());
CKeyID keyID = keypool.vchPubKey.GetID();
if (!HaveKey(keyID))
- throw runtime_error("GetAllReserveKeyHashes(): unknown key in key pool");
+ throw runtime_error(std::string(__func__) + ": unknown key in key pool");
setAddress.insert(keyID);
}
}
@@ -2691,13 +3096,13 @@ void CWallet::GetScriptForMining(boost::shared_ptr<CReserveScript> &script)
script->reserveScript = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
}
-void CWallet::LockCoin(COutPoint& output)
+void CWallet::LockCoin(const COutPoint& output)
{
AssertLockHeld(cs_wallet); // setLockedCoins
setLockedCoins.insert(output);
}
-void CWallet::UnlockCoin(COutPoint& output)
+void CWallet::UnlockCoin(const COutPoint& output)
{
AssertLockHeld(cs_wallet); // setLockedCoins
setLockedCoins.erase(output);
@@ -2771,7 +3176,7 @@ void CWallet::GetKeyBirthTimes(std::map<CKeyID, int64_t> &mapKeyBirth) const {
mapKeyBirth[it->first] = it->second.nCreateTime;
// map in which we'll infer heights of other keys
- CBlockIndex *pindexMax = chainActive[std::max(0, chainActive.Height() - 144)]; // the tip can be reorganised; use a 144-block safety margin
+ CBlockIndex *pindexMax = chainActive[std::max(0, chainActive.Height() - 144)]; // the tip can be reorganized; use a 144-block safety margin
std::map<CKeyID, CBlockIndex*> mapKeyFirstBlock;
std::set<CKeyID> setKeys;
GetKeys(setKeys);
@@ -2855,6 +3260,337 @@ bool CWallet::GetDestData(const CTxDestination &dest, const std::string &key, st
return false;
}
+std::string CWallet::GetWalletHelpString(bool showDebug)
+{
+ std::string 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)"), DEFAULT_KEYPOOL_SIZE));
+ strUsage += HelpMessageOpt("-fallbackfee=<amt>", strprintf(_("A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)"),
+ CURRENCY_UNIT, FormatMoney(DEFAULT_FALLBACK_FEE)));
+ strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf(_("Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)"),
+ CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MINFEE)));
+ strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in %s/kB) to add to transactions you send (default: %s)"),
+ CURRENCY_UNIT, 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 on startup"));
+ if (showDebug)
+ strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), DEFAULT_SEND_FREE_TRANSACTIONS));
+ strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), DEFAULT_SPEND_ZEROCONF_CHANGE));
+ 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("-usehd", _("Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start") + " " + strprintf(_("(default: %u)"), DEFAULT_USE_HD_WALLET));
+ strUsage += HelpMessageOpt("-walletrbf", strprintf(_("Send transactions with full-RBF opt-in enabled (default: %u)"), DEFAULT_WALLET_RBF));
+ strUsage += HelpMessageOpt("-upgradewallet", _("Upgrade wallet to latest format on startup"));
+ strUsage += HelpMessageOpt("-wallet=<file>", _("Specify wallet file (within data directory)") + " " + strprintf(_("(default: %s)"), DEFAULT_WALLET_DAT));
+ strUsage += HelpMessageOpt("-walletbroadcast", _("Make the wallet broadcast transactions") + " " + strprintf(_("(default: %u)"), DEFAULT_WALLETBROADCAST));
+ 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)"));
+
+ if (showDebug)
+ {
+ strUsage += HelpMessageGroup(_("Wallet debugging/testing options:"));
+
+ strUsage += HelpMessageOpt("-dblogsize=<n>", strprintf("Flush wallet database activity from memory to disk log every <n> megabytes (default: %u)", DEFAULT_WALLET_DBLOGSIZE));
+ strUsage += HelpMessageOpt("-flushwallet", strprintf("Run a thread to flush wallet periodically (default: %u)", DEFAULT_FLUSHWALLET));
+ strUsage += HelpMessageOpt("-privdb", strprintf("Sets the DB_PRIVATE flag in the wallet db environment (default: %u)", DEFAULT_WALLET_PRIVDB));
+ }
+
+ return strUsage;
+}
+
+bool CWallet::InitLoadWallet()
+{
+ if (GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
+ pwalletMain = NULL;
+ LogPrintf("Wallet disabled!\n");
+ return true;
+ }
+
+ std::string walletFile = GetArg("-wallet", DEFAULT_WALLET_DAT);
+
+ // needed to restore wallet transaction meta data after -zapwallettxes
+ std::vector<CWalletTx> vWtx;
+
+ if (GetBoolArg("-zapwallettxes", false)) {
+ uiInterface.InitMessage(_("Zapping all transactions from wallet..."));
+
+ CWallet *tempWallet = new CWallet(walletFile);
+ DBErrors nZapWalletRet = tempWallet->ZapWalletTx(vWtx);
+ if (nZapWalletRet != DB_LOAD_OK) {
+ return InitError(strprintf(_("Error loading %s: Wallet corrupted"), walletFile));
+ }
+
+ delete tempWallet;
+ tempWallet = NULL;
+ }
+
+ uiInterface.InitMessage(_("Loading wallet..."));
+
+ int64_t nStart = GetTimeMillis();
+ bool fFirstRun = true;
+ CWallet *walletInstance = new CWallet(walletFile);
+ DBErrors nLoadWalletRet = walletInstance->LoadWallet(fFirstRun);
+ if (nLoadWalletRet != DB_LOAD_OK)
+ {
+ if (nLoadWalletRet == DB_CORRUPT)
+ return InitError(strprintf(_("Error loading %s: Wallet corrupted"), walletFile));
+ else if (nLoadWalletRet == DB_NONCRITICAL_ERROR)
+ {
+ InitWarning(strprintf(_("Error reading %s! All keys read correctly, but transaction data"
+ " or address book entries might be missing or incorrect."),
+ walletFile));
+ }
+ else if (nLoadWalletRet == DB_TOO_NEW)
+ return InitError(strprintf(_("Error loading %s: Wallet requires newer version of %s"),
+ walletFile, _(PACKAGE_NAME)));
+ else if (nLoadWalletRet == DB_NEED_REWRITE)
+ {
+ return InitError(strprintf(_("Wallet needed to be rewritten: restart %s to complete"), _(PACKAGE_NAME)));
+ }
+ else
+ return InitError(strprintf(_("Error loading %s"), walletFile));
+ }
+
+ if (GetBoolArg("-upgradewallet", fFirstRun))
+ {
+ int nMaxVersion = GetArg("-upgradewallet", 0);
+ if (nMaxVersion == 0) // the -upgradewallet without argument case
+ {
+ LogPrintf("Performing wallet upgrade to %i\n", FEATURE_LATEST);
+ nMaxVersion = CLIENT_VERSION;
+ walletInstance->SetMinVersion(FEATURE_LATEST); // permanently upgrade the wallet immediately
+ }
+ else
+ LogPrintf("Allowing wallet upgrade up to %i\n", nMaxVersion);
+ if (nMaxVersion < walletInstance->GetVersion())
+ {
+ return InitError(_("Cannot downgrade wallet"));
+ }
+ walletInstance->SetMaxVersion(nMaxVersion);
+ }
+
+ if (fFirstRun)
+ {
+ // Create new keyUser and set as default key
+ if (GetBoolArg("-usehd", DEFAULT_USE_HD_WALLET) && !walletInstance->IsHDEnabled()) {
+ // generate a new master key
+ CPubKey masterPubKey = walletInstance->GenerateNewHDMasterKey();
+ if (!walletInstance->SetHDMasterKey(masterPubKey))
+ throw std::runtime_error(std::string(__func__) + ": Storing master key failed");
+ }
+ CPubKey newDefaultKey;
+ if (walletInstance->GetKeyFromPool(newDefaultKey)) {
+ walletInstance->SetDefaultKey(newDefaultKey);
+ if (!walletInstance->SetAddressBook(walletInstance->vchDefaultKey.GetID(), "", "receive"))
+ return InitError(_("Cannot write default address") += "\n");
+ }
+
+ walletInstance->SetBestChain(chainActive.GetLocator());
+ }
+ else if (mapArgs.count("-usehd")) {
+ bool useHD = GetBoolArg("-usehd", DEFAULT_USE_HD_WALLET);
+ if (walletInstance->IsHDEnabled() && !useHD)
+ return InitError(strprintf(_("Error loading %s: You can't disable HD on a already existing HD wallet"), walletFile));
+ if (!walletInstance->IsHDEnabled() && useHD)
+ return InitError(strprintf(_("Error loading %s: You can't enable HD on a already existing non-HD wallet"), walletFile));
+ }
+
+ LogPrintf(" wallet %15dms\n", GetTimeMillis() - nStart);
+
+ RegisterValidationInterface(walletInstance);
+
+ CBlockIndex *pindexRescan = chainActive.Tip();
+ if (GetBoolArg("-rescan", false))
+ pindexRescan = chainActive.Genesis();
+ else
+ {
+ CWalletDB walletdb(walletFile);
+ CBlockLocator locator;
+ if (walletdb.ReadBestBlock(locator))
+ pindexRescan = FindForkInGlobalIndex(chainActive, locator);
+ else
+ pindexRescan = chainActive.Genesis();
+ }
+ 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();
+ walletInstance->ScanForWalletTransactions(pindexRescan, true);
+ LogPrintf(" rescan %15dms\n", GetTimeMillis() - nStart);
+ walletInstance->SetBestChain(chainActive.GetLocator());
+ nWalletDBUpdated++;
+
+ // Restore wallet transaction metadata after -zapwallettxes=1
+ if (GetBoolArg("-zapwallettxes", false) && GetArg("-zapwallettxes", "1") != "2")
+ {
+ CWalletDB walletdb(walletFile);
+
+ BOOST_FOREACH(const CWalletTx& wtxOld, vWtx)
+ {
+ uint256 hash = wtxOld.GetHash();
+ std::map<uint256, CWalletTx>::iterator mi = walletInstance->mapWallet.find(hash);
+ if (mi != walletInstance->mapWallet.end())
+ {
+ const CWalletTx* copyFrom = &wtxOld;
+ CWalletTx* copyTo = &mi->second;
+ copyTo->mapValue = copyFrom->mapValue;
+ copyTo->vOrderForm = copyFrom->vOrderForm;
+ copyTo->nTimeReceived = copyFrom->nTimeReceived;
+ copyTo->nTimeSmart = copyFrom->nTimeSmart;
+ copyTo->fFromMe = copyFrom->fFromMe;
+ copyTo->strFromAccount = copyFrom->strFromAccount;
+ copyTo->nOrderPos = copyFrom->nOrderPos;
+ walletdb.WriteTx(*copyTo);
+ }
+ }
+ }
+ }
+ walletInstance->SetBroadcastTransactions(GetBoolArg("-walletbroadcast", DEFAULT_WALLETBROADCAST));
+
+ {
+ LOCK(walletInstance->cs_wallet);
+ LogPrintf("setKeyPool.size() = %u\n", walletInstance->GetKeyPoolSize());
+ LogPrintf("mapWallet.size() = %u\n", walletInstance->mapWallet.size());
+ LogPrintf("mapAddressBook.size() = %u\n", walletInstance->mapAddressBook.size());
+ }
+ // Add wallet transactions that aren't already in a block to mapTransactions
+ walletInstance->ReacceptWalletTransactions();
+
+ pwalletMain = walletInstance;
+
+ return true;
+}
+
+bool CWallet::ParameterInteraction()
+{
+ if (GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET))
+ return true;
+
+ if (GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY) && SoftSetBoolArg("-walletbroadcast", false)) {
+ LogPrintf("%s: parameter interaction: -blocksonly=1 -> setting -walletbroadcast=0\n", __func__);
+ }
+
+ if (GetBoolArg("-sysperms", false))
+ return InitError("-sysperms is not allowed in combination with enabled wallet functionality");
+ if (GetArg("-prune", 0) && 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."));
+
+ if (::minRelayTxFee.GetFeePerK() > HIGH_TX_FEE_PER_KB)
+ InitWarning(AmountHighWarn("-minrelaytxfee") + " " +
+ _("The wallet will avoid paying less than the minimum relay fee."));
+
+ if (mapArgs.count("-mintxfee"))
+ {
+ CAmount n = 0;
+ if (!ParseMoney(mapArgs["-mintxfee"], n) || 0 == n)
+ return InitError(AmountErrMsg("mintxfee", mapArgs["-mintxfee"]));
+ if (n > HIGH_TX_FEE_PER_KB)
+ InitWarning(AmountHighWarn("-mintxfee") + " " +
+ _("This is the minimum transaction fee you pay on every transaction."));
+ CWallet::minTxFee = CFeeRate(n);
+ }
+ if (mapArgs.count("-fallbackfee"))
+ {
+ CAmount nFeePerK = 0;
+ if (!ParseMoney(mapArgs["-fallbackfee"], nFeePerK))
+ return InitError(strprintf(_("Invalid amount for -fallbackfee=<amount>: '%s'"), mapArgs["-fallbackfee"]));
+ if (nFeePerK > HIGH_TX_FEE_PER_KB)
+ InitWarning(AmountHighWarn("-fallbackfee") + " " +
+ _("This is the transaction fee you may pay when fee estimates are not available."));
+ CWallet::fallbackFee = CFeeRate(nFeePerK);
+ }
+ if (mapArgs.count("-paytxfee"))
+ {
+ CAmount nFeePerK = 0;
+ if (!ParseMoney(mapArgs["-paytxfee"], nFeePerK))
+ return InitError(AmountErrMsg("paytxfee", mapArgs["-paytxfee"]));
+ if (nFeePerK > HIGH_TX_FEE_PER_KB)
+ InitWarning(AmountHighWarn("-paytxfee") + " " +
+ _("This is the transaction fee you will pay if you send a transaction."));
+
+ payTxFee = CFeeRate(nFeePerK, 1000);
+ if (payTxFee < ::minRelayTxFee)
+ {
+ return InitError(strprintf(_("Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)"),
+ mapArgs["-paytxfee"], ::minRelayTxFee.ToString()));
+ }
+ }
+ if (mapArgs.count("-maxtxfee"))
+ {
+ CAmount nMaxFee = 0;
+ if (!ParseMoney(mapArgs["-maxtxfee"], nMaxFee))
+ return InitError(AmountErrMsg("maxtxfee", mapArgs["-maxtxfee"]));
+ if (nMaxFee > HIGH_MAX_TX_FEE)
+ InitWarning(_("-maxtxfee is set very high! Fees this large could be paid on a single transaction."));
+ maxTxFee = nMaxFee;
+ if (CFeeRate(maxTxFee, 1000) < ::minRelayTxFee)
+ {
+ return InitError(strprintf(_("Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)"),
+ mapArgs["-maxtxfee"], ::minRelayTxFee.ToString()));
+ }
+ }
+ nTxConfirmTarget = GetArg("-txconfirmtarget", DEFAULT_TX_CONFIRM_TARGET);
+ bSpendZeroConfChange = GetBoolArg("-spendzeroconfchange", DEFAULT_SPEND_ZEROCONF_CHANGE);
+ fSendFreeTransactions = GetBoolArg("-sendfreetransactions", DEFAULT_SEND_FREE_TRANSACTIONS);
+ fWalletRbf = GetBoolArg("-walletrbf", DEFAULT_WALLET_RBF);
+
+ return true;
+}
+
+bool CWallet::BackupWallet(const std::string& strDest)
+{
+ if (!fFileBacked)
+ return false;
+ while (true)
+ {
+ {
+ LOCK(bitdb.cs_db);
+ if (!bitdb.mapFileUseCount.count(strWalletFile) || bitdb.mapFileUseCount[strWalletFile] == 0)
+ {
+ // Flush log data to the dat file
+ bitdb.CloseDb(strWalletFile);
+ bitdb.CheckpointLSN(strWalletFile);
+ bitdb.mapFileUseCount.erase(strWalletFile);
+
+ // Copy wallet file
+ boost::filesystem::path pathSrc = GetDataDir() / strWalletFile;
+ boost::filesystem::path pathDest(strDest);
+ if (boost::filesystem::is_directory(pathDest))
+ pathDest /= strWalletFile;
+
+ try {
+#if BOOST_VERSION >= 104000
+ boost::filesystem::copy_file(pathSrc, pathDest, boost::filesystem::copy_option::overwrite_if_exists);
+#else
+ boost::filesystem::copy_file(pathSrc, pathDest);
+#endif
+ LogPrintf("copied %s to %s\n", strWalletFile, pathDest.string());
+ return true;
+ } catch (const boost::filesystem::filesystem_error& e) {
+ LogPrintf("error copying %s to %s - %s\n", strWalletFile, pathDest.string(), e.what());
+ return false;
+ }
+ }
+ }
+ MilliSleep(100);
+ }
+ return false;
+}
+
CKeyPool::CKeyPool()
{
nTime = GetTime();
@@ -2872,31 +3608,18 @@ CWalletKey::CWalletKey(int64_t nExpires)
nTimeExpires = nExpires;
}
-int CMerkleTx::SetMerkleBranch(const CBlock& block)
+int CMerkleTx::SetMerkleBranch(const CBlockIndex* pindex, int posInBlock)
{
AssertLockHeld(cs_main);
- CBlock blockTmp;
// Update the tx's hashBlock
- hashBlock = block.GetHash();
+ hashBlock = pindex->GetBlockHash();
- // Locate the transaction
- for (nIndex = 0; nIndex < (int)block.vtx.size(); nIndex++)
- if (block.vtx[nIndex] == *(CTransaction*)this)
- break;
- if (nIndex == (int)block.vtx.size())
- {
- nIndex = -1;
- LogPrintf("ERROR: SetMerkleBranch(): couldn't find tx in block\n");
- return 0;
- }
+ // set the position of the transaction in the block
+ nIndex = posInBlock;
// Is the tx in a block that's in the main chain
- BlockMap::iterator mi = mapBlockIndex.find(hashBlock);
- if (mi == mapBlockIndex.end())
- return 0;
- const CBlockIndex* pindex = (*mi).second;
- if (!pindex || !chainActive.Contains(pindex))
+ if (!chainActive.Contains(pindex))
return 0;
return chainActive.Height() - pindex->nHeight + 1;
@@ -2904,8 +3627,9 @@ int CMerkleTx::SetMerkleBranch(const CBlock& block)
int CMerkleTx::GetDepthInMainChain(const CBlockIndex* &pindexRet) const
{
- if (hashBlock.IsNull())
+ if (hashUnset())
return 0;
+
AssertLockHeld(cs_main);
// Find the block it claims to be in
@@ -2928,9 +3652,8 @@ int CMerkleTx::GetBlocksToMaturity() const
}
-bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, bool fRejectAbsurdFee)
+bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, CAmount nAbsurdFee)
{
CValidationState state;
- return ::AcceptToMemoryPool(mempool, state, *this, fLimitFree, NULL, false, fRejectAbsurdFee);
+ return ::AcceptToMemoryPool(mempool, state, *this, fLimitFree, NULL, false, nAbsurdFee);
}
-
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index 859788893c..077edcab2d 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -12,9 +12,10 @@
#include "ui_interface.h"
#include "utilstrencodings.h"
#include "validationinterface.h"
+#include "script/ismine.h"
#include "wallet/crypter.h"
-#include "wallet/wallet_ismine.h"
#include "wallet/walletdb.h"
+#include "wallet/rpcwallet.h"
#include <algorithm>
#include <map>
@@ -27,24 +28,24 @@
#include <boost/shared_ptr.hpp>
+extern CWallet* pwalletMain;
+
/**
* Settings
*/
extern CFeeRate payTxFee;
-extern CAmount maxTxFee;
extern unsigned int nTxConfirmTarget;
extern bool bSpendZeroConfChange;
extern bool fSendFreeTransactions;
+extern bool fWalletRbf;
static const unsigned int DEFAULT_KEYPOOL_SIZE = 100;
//! -paytxfee default
static const CAmount DEFAULT_TRANSACTION_FEE = 0;
-//! -paytxfee will warn if called with a higher fee than this amount (in satoshis) per KB
-static const CAmount nHighTransactionFeeWarning = 0.01 * COIN;
+//! -fallbackfee default
+static const CAmount DEFAULT_FALLBACK_FEE = 20000;
//! -mintxfee default
static const CAmount DEFAULT_TRANSACTION_MINFEE = 1000;
-//! -maxtxfee default
-static const CAmount DEFAULT_TRANSACTION_MAXFEE = 0.1 * COIN;
//! minimum change amount
static const CAmount MIN_CHANGE = CENT;
//! Default for -spendzeroconfchange
@@ -53,13 +54,17 @@ static const bool DEFAULT_SPEND_ZEROCONF_CHANGE = true;
static const bool DEFAULT_SEND_FREE_TRANSACTIONS = false;
//! -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;
+//! -walletrbf default
+static const bool DEFAULT_WALLET_RBF = false;
//! Largest (in bytes) free transaction we're willing to create
static const unsigned int MAX_FREE_TRANSACTION_CREATE_SIZE = 1000;
static const bool DEFAULT_WALLETBROADCAST = true;
+static const bool DEFAULT_DISABLE_WALLET = false;
+//! if set, all keys will be derived by using BIP32
+static const bool DEFAULT_USE_HD_WALLET = true;
+
+extern const char * DEFAULT_WALLET_DAT;
-class CAccountingEntry;
class CBlockIndex;
class CCoinControl;
class COutput;
@@ -76,7 +81,8 @@ enum WalletFeature
FEATURE_WALLETCRYPT = 40000, // wallet encryption
FEATURE_COMPRPUBKEY = 60000, // compressed public keys
- FEATURE_LATEST = 60000
+ FEATURE_HD = 130000, // Hierarchical key derivation after BIP32 (HD Wallet)
+ FEATURE_LATEST = FEATURE_COMPRPUBKEY // HD is optional, use FEATURE_COMPRPUBKEY as latest version
};
@@ -155,6 +161,10 @@ struct COutputEntry
/** A transaction with a merkle branch linking it to the block chain. */
class CMerkleTx : public CTransaction
{
+private:
+ /** Constant used in hashBlock to indicate tx has been abandoned */
+ static const uint256 ABANDON_HASH;
+
public:
uint256 hashBlock;
@@ -187,13 +197,12 @@ public:
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
std::vector<uint256> vMerkleBranch; // For compatibility with older versions.
READWRITE(*(CTransaction*)this);
- nVersion = this->nVersion;
READWRITE(hashBlock);
READWRITE(vMerkleBranch);
READWRITE(nIndex);
}
- int SetMerkleBranch(const CBlock& block);
+ int SetMerkleBranch(const CBlockIndex* pIndex, int posInBlock);
/**
* Return depth of transaction in blockchain:
@@ -205,7 +214,11 @@ public:
int GetDepthInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet) > 0; }
int GetBlocksToMaturity() const;
- bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectAbsurdFee=true);
+ /** Pass this transaction to the mempool. Fails if absolute fee exceeds absurd fee. */
+ bool AcceptToMemoryPool(bool fLimitFree, const CAmount nAbsurdFee);
+ bool hashUnset() const { return (hashBlock.IsNull() || hashBlock == ABANDON_HASH); }
+ bool isAbandoned() const { return (hashBlock == ABANDON_HASH); }
+ void setAbandoned() { hashBlock = ABANDON_HASH; }
};
/**
@@ -221,11 +234,11 @@ public:
mapValue_t mapValue;
std::vector<std::pair<std::string, std::string> > vOrderForm;
unsigned int fTimeReceivedIsTxTime;
- unsigned int nTimeReceived; //! time received by this node
+ unsigned int nTimeReceived; //!< time received by this node
unsigned int nTimeSmart;
char fFromMe;
std::string strFromAccount;
- int64_t nOrderPos; //! position in ordered transaction list
+ int64_t nOrderPos; //!< position in ordered transaction list
// memory only
mutable bool fDebitCached;
@@ -317,7 +330,7 @@ public:
}
READWRITE(*(CMerkleTx*)this);
- std::vector<CMerkleTx> vUnused; //! Used to be vtxPrev
+ std::vector<CMerkleTx> vUnused; //!< Used to be vtxPrev
READWRITE(vUnused);
READWRITE(mapValue);
READWRITE(vOrderForm);
@@ -384,14 +397,13 @@ public:
// True if only scriptSigs are different
bool IsEquivalentTo(const CWalletTx& tx) const;
+ bool InMempool() const;
bool IsTrusted() const;
- bool WriteToDisk(CWalletDB *pwalletdb);
-
int64_t GetTxTime() const;
int GetRequestCount() const;
- bool RelayWalletTransaction();
+ bool RelayWalletTransaction(CConnman* connman);
std::set<uint256> GetConflicts() const;
};
@@ -406,10 +418,11 @@ public:
int i;
int nDepth;
bool fSpendable;
+ bool fSolvable;
- COutput(const CWalletTx *txIn, int iIn, int nDepthIn, bool fSpendableIn)
+ COutput(const CWalletTx *txIn, int iIn, int nDepthIn, bool fSpendableIn, bool fSolvableIn)
{
- tx = txIn; i = iIn; nDepth = nDepthIn; fSpendable = fSpendableIn;
+ tx = txIn; i = iIn; nDepth = nDepthIn; fSpendable = fSpendableIn; fSolvable = fSolvableIn;
}
std::string ToString() const;
@@ -444,6 +457,86 @@ public:
}
};
+/**
+ * Internal transfers.
+ * Database key is acentry<account><counter>.
+ */
+class CAccountingEntry
+{
+public:
+ std::string strAccount;
+ CAmount nCreditDebit;
+ int64_t nTime;
+ std::string strOtherAccount;
+ std::string strComment;
+ mapValue_t mapValue;
+ int64_t nOrderPos; //!< position in ordered transaction list
+ uint64_t nEntryNo;
+
+ CAccountingEntry()
+ {
+ SetNull();
+ }
+
+ void SetNull()
+ {
+ nCreditDebit = 0;
+ nTime = 0;
+ strAccount.clear();
+ strOtherAccount.clear();
+ strComment.clear();
+ nOrderPos = -1;
+ nEntryNo = 0;
+ }
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
+ if (!(nType & SER_GETHASH))
+ READWRITE(nVersion);
+ //! Note: strAccount is serialized as part of the key, not here.
+ READWRITE(nCreditDebit);
+ READWRITE(nTime);
+ READWRITE(LIMITED_STRING(strOtherAccount, 65536));
+
+ if (!ser_action.ForRead())
+ {
+ WriteOrderPos(nOrderPos, mapValue);
+
+ if (!(mapValue.empty() && _ssExtra.empty()))
+ {
+ CDataStream ss(nType, nVersion);
+ ss.insert(ss.begin(), '\0');
+ ss << mapValue;
+ ss.insert(ss.end(), _ssExtra.begin(), _ssExtra.end());
+ strComment.append(ss.str());
+ }
+ }
+
+ READWRITE(LIMITED_STRING(strComment, 65536));
+
+ size_t nSepPos = strComment.find("\0", 0, 1);
+ if (ser_action.ForRead())
+ {
+ mapValue.clear();
+ if (std::string::npos != nSepPos)
+ {
+ CDataStream ss(std::vector<char>(strComment.begin() + nSepPos + 1, strComment.end()), nType, nVersion);
+ ss >> mapValue;
+ _ssExtra = std::vector<char>(ss.begin(), ss.end());
+ }
+ ReadOrderPos(nOrderPos, mapValue);
+ }
+ if (std::string::npos != nSepPos)
+ strComment.erase(nSepPos);
+
+ mapValue.erase("n");
+ }
+
+private:
+ std::vector<char> _ssExtra;
+};
/**
@@ -458,7 +551,7 @@ private:
* all coins from coinControl are selected; Never select unconfirmed coins
* if they are not ours
*/
- bool SelectCoins(const CAmount& nTargetValue, std::set<std::pair<const CWalletTx*,unsigned int> >& setCoinsRet, CAmount& nValueRet, const CCoinControl *coinControl = NULL) const;
+ bool SelectCoins(const std::vector<COutput>& vAvailableCoins, const CAmount& nTargetValue, std::set<std::pair<const CWalletTx*,unsigned int> >& setCoinsRet, CAmount& nValueRet, const CCoinControl *coinControl = NULL) const;
CWalletDB *pwalletdbEncryption;
@@ -485,9 +578,14 @@ private:
/* Mark a transaction (and its in-wallet descendants) as conflicting with a particular block. */
void MarkConflicted(const uint256& hashBlock, const uint256& hashTx);
-
void SyncMetaData(std::pair<TxSpends::iterator, TxSpends::iterator>);
+ /* the HD chain data model (external chain counters) */
+ CHDChain hdChain;
+
+ bool fFileBacked;
+
+ std::set<int64_t> setKeyPool;
public:
/*
* Main wallet lock.
@@ -498,10 +596,20 @@ public:
*/
mutable CCriticalSection cs_wallet;
- bool fFileBacked;
std::string strWalletFile;
- std::set<int64_t> setKeyPool;
+ void LoadKeyPool(int nIndex, const CKeyPool &keypool)
+ {
+ setKeyPool.insert(nIndex);
+
+ // If no metadata exists yet, create a default with the pool key's
+ // creation time. Note that this may be overwritten by actually
+ // stored metadata for that key later, which is fine.
+ CKeyID keyid = keypool.vchPubKey.GetID();
+ if (mapKeyMetadata.count(keyid) == 0)
+ mapKeyMetadata[keyid] = CKeyMetadata(keypool.nTime);
+ }
+
std::map<CKeyID, CKeyMetadata> mapKeyMetadata;
typedef std::map<unsigned int, CMasterKey> MasterKeyMap;
@@ -580,8 +688,8 @@ public:
bool IsSpent(const uint256& hash, unsigned int n) const;
bool IsLockedCoin(uint256 hash, unsigned int n) const;
- void LockCoin(COutPoint& output);
- void UnlockCoin(COutPoint& output);
+ void LockCoin(const COutPoint& output);
+ void UnlockCoin(const COutPoint& output);
void UnlockAllCoins();
void ListLockedCoins(std::vector<COutPoint>& vOutpts);
@@ -590,6 +698,7 @@ public:
* Generate a new key
*/
CPubKey GenerateNewKey();
+ void DeriveNewChildKey(CKeyMetadata& metadata, CKey& secret);
//! Adds a key to the store, and saves it to disk.
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
//! Adds a key to the store, without saving it to disk (used by LoadWallet)
@@ -632,15 +741,19 @@ public:
* @return next transaction order id
*/
int64_t IncOrderPosNext(CWalletDB *pwalletdb = NULL);
+ DBErrors ReorderTransactions();
+ bool AccountMove(std::string strFrom, std::string strTo, CAmount nAmount, std::string strComment = "");
+ bool GetAccountPubkey(CPubKey &pubKey, std::string strAccount, bool bForceNew = false);
void MarkDirty();
- 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);
+ bool AddToWallet(const CWalletTx& wtxIn, bool fFlushOnClose=true);
+ bool LoadToWallet(const CWalletTx& wtxIn);
+ void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock);
+ bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlockIndex* pIndex, int posInBlock, bool fUpdate);
int ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate = false);
void ReacceptWalletTransactions();
- void ResendWalletTransactions(int64_t nBestBlockTime);
- std::vector<uint256> ResendWalletTransactionsBefore(int64_t nTime);
+ void ResendWalletTransactions(int64_t nBestBlockTime, CConnman* connman);
+ std::vector<uint256> ResendWalletTransactionsBefore(int64_t nTime, CConnman* connman);
CAmount GetBalance() const;
CAmount GetUnconfirmedBalance() const;
CAmount GetImmatureBalance() const;
@@ -652,19 +765,23 @@ public:
* Insert additional inputs into the transaction by
* calling CreateTransaction();
*/
- bool FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, int& nChangePosRet, std::string& strFailReason, bool includeWatching);
+ bool FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, bool overrideEstimatedFeeRate, const CFeeRate& specificFeeRate, int& nChangePosInOut, std::string& strFailReason, bool includeWatching, bool lockUnspents, const CTxDestination& destChange = CNoDestination());
/**
* Create a new transaction paying the recipients with a set of coins
* selected by SelectCoins(); Also create the change output, when needed
+ * @note passing nChangePosInOut as -1 will result in setting a random position
*/
- bool CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet, int& nChangePosRet,
+ bool CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet, int& nChangePosInOut,
std::string& strFailReason, const CCoinControl *coinControl = NULL, bool sign = true);
- bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey);
+ bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey, CConnman* connman);
- bool AddAccountingEntry(const CAccountingEntry&, CWalletDB & pwalletdb);
+ void ListAccountCreditDebit(const std::string& strAccount, std::list<CAccountingEntry>& entries);
+ bool AddAccountingEntry(const CAccountingEntry&);
+ bool AddAccountingEntry(const CAccountingEntry&, CWalletDB *pwalletdb);
static CFeeRate minTxFee;
+ static CFeeRate fallbackFee;
/**
* Estimate the minimum fee considering user set parameters
* and the required fee
@@ -688,6 +805,8 @@ public:
std::set< std::set<CTxDestination> > GetAddressGroupings();
std::map<CTxDestination, CAmount> GetAddressBalances();
+ CAmount GetAccountBalance(const std::string& strAccount, int nMinDepth, const isminefilter& filter);
+ CAmount GetAccountBalance(CWalletDB& walletdb, const std::string& strAccount, int nMinDepth, const isminefilter& filter);
std::set<CTxDestination> GetAccountAddresses(const std::string& strAccount) const;
isminetype IsMine(const CTxIn& txin) const;
@@ -706,6 +825,7 @@ public:
DBErrors LoadWallet(bool& fFirstRunRet);
DBErrors ZapWalletTx(std::vector<CWalletTx>& vWtx);
+ DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut);
bool SetAddressBook(const CTxDestination& address, const std::string& strName, const std::string& purpose);
@@ -754,7 +874,7 @@ public:
void Flush(bool shutdown=false);
//! Verify the wallet database and perform salvage if required
- static bool Verify(const std::string& walletFile, std::string& warningString, std::string& errorString);
+ static bool Verify();
/**
* Address book entry changed.
@@ -782,6 +902,33 @@ public:
bool GetBroadcastTransactions() const { return fBroadcastTransactions; }
/** Set whether this wallet broadcasts transactions. */
void SetBroadcastTransactions(bool broadcast) { fBroadcastTransactions = broadcast; }
+
+ /* Mark a transaction (and it in-wallet descendants) as abandoned so its inputs may be respent. */
+ bool AbandonTransaction(const uint256& hashTx);
+
+ /* Returns the wallets help message */
+ static std::string GetWalletHelpString(bool showDebug);
+
+ /* Initializes the wallet, returns a new CWallet instance or a null pointer in case of an error */
+ static bool InitLoadWallet();
+
+ /* Wallets parameter interaction */
+ static bool ParameterInteraction();
+
+ bool BackupWallet(const std::string& strDest);
+
+ /* Set the HD chain model (chain child index counters) */
+ bool SetHDChain(const CHDChain& chain, bool memonly);
+ const CHDChain& GetHDChain() { return hdChain; }
+
+ /* Returns true if HD is enabled */
+ bool IsHDEnabled();
+
+ /* Generates a new HD master key (will not be activated) */
+ CPubKey GenerateNewHDMasterKey();
+
+ /* Set the current HD master key (will reset the chain child index counters) */
+ bool SetHDMasterKey(const CPubKey& key);
};
/** A key allocated from the key pool. */
@@ -839,87 +986,4 @@ public:
}
};
-
-
-/**
- * Internal transfers.
- * Database key is acentry<account><counter>.
- */
-class CAccountingEntry
-{
-public:
- std::string strAccount;
- CAmount nCreditDebit;
- int64_t nTime;
- std::string strOtherAccount;
- std::string strComment;
- mapValue_t mapValue;
- int64_t nOrderPos; //! position in ordered transaction list
- uint64_t nEntryNo;
-
- CAccountingEntry()
- {
- SetNull();
- }
-
- void SetNull()
- {
- nCreditDebit = 0;
- nTime = 0;
- strAccount.clear();
- strOtherAccount.clear();
- strComment.clear();
- nOrderPos = -1;
- nEntryNo = 0;
- }
-
- ADD_SERIALIZE_METHODS;
-
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
- if (!(nType & SER_GETHASH))
- READWRITE(nVersion);
- //! Note: strAccount is serialized as part of the key, not here.
- READWRITE(nCreditDebit);
- READWRITE(nTime);
- READWRITE(LIMITED_STRING(strOtherAccount, 65536));
-
- if (!ser_action.ForRead())
- {
- WriteOrderPos(nOrderPos, mapValue);
-
- if (!(mapValue.empty() && _ssExtra.empty()))
- {
- CDataStream ss(nType, nVersion);
- ss.insert(ss.begin(), '\0');
- ss << mapValue;
- ss.insert(ss.end(), _ssExtra.begin(), _ssExtra.end());
- strComment.append(ss.str());
- }
- }
-
- READWRITE(LIMITED_STRING(strComment, 65536));
-
- size_t nSepPos = strComment.find("\0", 0, 1);
- if (ser_action.ForRead())
- {
- mapValue.clear();
- if (std::string::npos != nSepPos)
- {
- CDataStream ss(std::vector<char>(strComment.begin() + nSepPos + 1, strComment.end()), nType, nVersion);
- ss >> mapValue;
- _ssExtra = std::vector<char>(ss.begin(), ss.end());
- }
- ReadOrderPos(nOrderPos, mapValue);
- }
- if (std::string::npos != nSepPos)
- strComment.erase(nSepPos);
-
- mapValue.erase("n");
- }
-
-private:
- std::vector<char> _ssExtra;
-};
-
#endif // BITCOIN_WALLET_WALLET_H
diff --git a/src/wallet/wallet_ismine.cpp b/src/wallet/wallet_ismine.cpp
deleted file mode 100644
index d27b1531e3..0000000000
--- a/src/wallet/wallet_ismine.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-// 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.
-
-#include "wallet_ismine.h"
-
-#include "key.h"
-#include "keystore.h"
-#include "script/script.h"
-#include "script/standard.h"
-#include "script/sign.h"
-
-#include <boost/foreach.hpp>
-
-using namespace std;
-
-typedef vector<unsigned char> valtype;
-
-unsigned int HaveKeys(const vector<valtype>& pubkeys, const CKeyStore& keystore)
-{
- unsigned int nResult = 0;
- BOOST_FOREACH(const valtype& pubkey, pubkeys)
- {
- CKeyID keyID = CPubKey(pubkey).GetID();
- if (keystore.HaveKey(keyID))
- ++nResult;
- }
- return nResult;
-}
-
-isminetype IsMine(const CKeyStore &keystore, const CTxDestination& dest)
-{
- CScript script = GetScriptForDestination(dest);
- return IsMine(keystore, script);
-}
-
-isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey)
-{
- vector<valtype> vSolutions;
- txnouttype whichType;
- if (!Solver(scriptPubKey, whichType, vSolutions)) {
- if (keystore.HaveWatchOnly(scriptPubKey))
- return ISMINE_WATCH_UNSOLVABLE;
- return ISMINE_NO;
- }
-
- CKeyID keyID;
- switch (whichType)
- {
- case TX_NONSTANDARD:
- case TX_NULL_DATA:
- break;
- case TX_PUBKEY:
- keyID = CPubKey(vSolutions[0]).GetID();
- if (keystore.HaveKey(keyID))
- return ISMINE_SPENDABLE;
- break;
- case TX_PUBKEYHASH:
- keyID = CKeyID(uint160(vSolutions[0]));
- if (keystore.HaveKey(keyID))
- return ISMINE_SPENDABLE;
- break;
- case TX_SCRIPTHASH:
- {
- CScriptID scriptID = CScriptID(uint160(vSolutions[0]));
- CScript subscript;
- if (keystore.GetCScript(scriptID, subscript)) {
- isminetype ret = IsMine(keystore, subscript);
- if (ret == ISMINE_SPENDABLE)
- return ret;
- }
- break;
- }
- case TX_MULTISIG:
- {
- // Only consider transactions "mine" if we own ALL the
- // keys involved. Multi-signature transactions that are
- // partially owned (somebody else has a key that can spend
- // them) enable spend-out-from-under-you attacks, especially
- // in shared-wallet situations.
- vector<valtype> keys(vSolutions.begin()+1, vSolutions.begin()+vSolutions.size()-1);
- if (HaveKeys(keys, keystore) == keys.size())
- return ISMINE_SPENDABLE;
- break;
- }
- }
-
- if (keystore.HaveWatchOnly(scriptPubKey)) {
- // TODO: This could be optimized some by doing some work after the above solver
- CScript scriptSig;
- return ProduceSignature(DummySignatureCreator(&keystore), scriptPubKey, scriptSig) ? ISMINE_WATCH_SOLVABLE : ISMINE_WATCH_UNSOLVABLE;
- }
- return ISMINE_NO;
-}
diff --git a/src/wallet/wallet_ismine.h b/src/wallet/wallet_ismine.h
deleted file mode 100644
index 9f45f76c6b..0000000000
--- a/src/wallet/wallet_ismine.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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_WALLET_WALLET_ISMINE_H
-#define BITCOIN_WALLET_WALLET_ISMINE_H
-
-#include "script/standard.h"
-
-#include <stdint.h>
-
-class CKeyStore;
-class CScript;
-
-/** IsMine() return codes */
-enum isminetype
-{
- ISMINE_NO = 0,
- //! Indicates that we dont know how to create a scriptSig that would solve this if we were given the appropriate private keys
- ISMINE_WATCH_UNSOLVABLE = 1,
- //! Indicates that we know how to create a scriptSig that would solve this if we were given the appropriate private keys
- ISMINE_WATCH_SOLVABLE = 2,
- ISMINE_WATCH_ONLY = ISMINE_WATCH_SOLVABLE | ISMINE_WATCH_UNSOLVABLE,
- ISMINE_SPENDABLE = 4,
- ISMINE_ALL = ISMINE_WATCH_ONLY | ISMINE_SPENDABLE
-};
-/** used for bitflags of isminetype */
-typedef uint8_t isminefilter;
-
-isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey);
-isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest);
-
-#endif // BITCOIN_WALLET_WALLET_ISMINE_H
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
index e2e827d816..80bfe8255d 100644
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-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.
@@ -15,9 +15,9 @@
#include "utiltime.h"
#include "wallet/wallet.h"
+#include <boost/version.hpp>
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
-#include <boost/scoped_ptr.hpp>
#include <boost/thread.hpp>
using namespace std;
@@ -54,10 +54,10 @@ bool CWalletDB::ErasePurpose(const string& strPurpose)
return Erase(make_pair(string("purpose"), strPurpose));
}
-bool CWalletDB::WriteTx(uint256 hash, const CWalletTx& wtx)
+bool CWalletDB::WriteTx(const CWalletTx& wtx)
{
nWalletDBUpdated++;
- return Write(std::make_pair(std::string("tx"), hash), wtx);
+ return Write(std::make_pair(std::string("tx"), wtx.GetHash()), wtx);
}
bool CWalletDB::EraseTx(uint256 hash)
@@ -214,23 +214,23 @@ void CWalletDB::ListAccountCreditDebit(const string& strAccount, list<CAccountin
Dbc* pcursor = GetCursor();
if (!pcursor)
- throw runtime_error("CWalletDB::ListAccountCreditDebit(): cannot create DB cursor");
- unsigned int fFlags = DB_SET_RANGE;
+ throw runtime_error(std::string(__func__) + ": cannot create DB cursor");
+ bool setRange = true;
while (true)
{
// Read next record
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
- if (fFlags == DB_SET_RANGE)
+ if (setRange)
ssKey << std::make_pair(std::string("acentry"), std::make_pair((fAllAccounts ? string("") : strAccount), uint64_t(0)));
CDataStream ssValue(SER_DISK, CLIENT_VERSION);
- int ret = ReadAtCursor(pcursor, ssKey, ssValue, fFlags);
- fFlags = DB_NEXT;
+ int ret = ReadAtCursor(pcursor, ssKey, ssValue, setRange);
+ setRange = false;
if (ret == DB_NOTFOUND)
break;
else if (ret != 0)
{
pcursor->close();
- throw runtime_error("CWalletDB::ListAccountCreditDebit(): error scanning DB");
+ throw runtime_error(std::string(__func__) + ": error scanning DB");
}
// Unserialize
@@ -290,7 +290,7 @@ DBErrors CWalletDB::ReorderTransactions(CWallet* pwallet)
if (pwtx)
{
- if (!WriteTx(pwtx->GetHash(), *pwtx))
+ if (!WriteTx(*pwtx))
return DB_LOAD_FAIL;
}
else
@@ -314,7 +314,7 @@ DBErrors CWalletDB::ReorderTransactions(CWallet* pwallet)
// Since we're changing the order, write it back
if (pwtx)
{
- if (!WriteTx(pwtx->GetHash(), *pwtx))
+ if (!WriteTx(*pwtx))
return DB_LOAD_FAIL;
}
else
@@ -399,7 +399,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
if (wtx.nOrderPos == -1)
wss.fAnyUnordered = true;
- pwallet->AddToWallet(wtx, true, NULL);
+ pwallet->LoadToWallet(wtx);
}
else if (strType == "acentry")
{
@@ -555,14 +555,8 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
ssKey >> nIndex;
CKeyPool keypool;
ssValue >> keypool;
- pwallet->setKeyPool.insert(nIndex);
-
- // If no metadata exists yet, create a default with the pool key's
- // creation time. Note that this may be overwritten by actually
- // stored metadata for that key later, which is fine.
- CKeyID keyid = keypool.vchPubKey.GetID();
- if (pwallet->mapKeyMetadata.count(keyid) == 0)
- pwallet->mapKeyMetadata[keyid] = CKeyMetadata(keypool.nTime);
+
+ pwallet->LoadKeyPool(nIndex, keypool);
}
else if (strType == "version")
{
@@ -598,6 +592,16 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
return false;
}
}
+ else if (strType == "hdchain")
+ {
+ CHDChain chain;
+ ssValue >> chain;
+ if (!pwallet->SetHDChain(chain, true))
+ {
+ strErr = "Error reading wallet database: SetHDChain failed";
+ return false;
+ }
+ }
} catch (...)
{
return false;
@@ -697,7 +701,7 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
pwallet->nTimeFirstKey = 1; // 0 would be considered 'no value'
BOOST_FOREACH(uint256 hash, wss.vWalletUpgrade)
- WriteTx(hash, pwallet->mapWallet[hash]);
+ WriteTx(pwallet->mapWallet[hash]);
// Rewrite encrypted wallets of versions 0.4.0 and 0.5.0rc:
if (wss.fIsEncrypted && (wss.nFileVersion == 40000 || wss.nFileVersion == 50000))
@@ -784,6 +788,45 @@ DBErrors CWalletDB::FindWalletTx(CWallet* pwallet, vector<uint256>& vTxHash, vec
return result;
}
+DBErrors CWalletDB::ZapSelectTx(CWallet* pwallet, vector<uint256>& vTxHashIn, vector<uint256>& vTxHashOut)
+{
+ // build list of wallet TXs and hashes
+ vector<uint256> vTxHash;
+ vector<CWalletTx> vWtx;
+ DBErrors err = FindWalletTx(pwallet, vTxHash, vWtx);
+ if (err != DB_LOAD_OK) {
+ return err;
+ }
+
+ std::sort(vTxHash.begin(), vTxHash.end());
+ std::sort(vTxHashIn.begin(), vTxHashIn.end());
+
+ // erase each matching wallet TX
+ bool delerror = false;
+ vector<uint256>::iterator it = vTxHashIn.begin();
+ BOOST_FOREACH (uint256 hash, vTxHash) {
+ while (it < vTxHashIn.end() && (*it) < hash) {
+ it++;
+ }
+ if (it == vTxHashIn.end()) {
+ break;
+ }
+ else if ((*it) == hash) {
+ pwallet->mapWallet.erase(hash);
+ if(!EraseTx(hash)) {
+ LogPrint("db", "Transaction was found for deletion but returned database error: %s\n", hash.GetHex());
+ delerror = true;
+ }
+ vTxHashOut.push_back(hash);
+ }
+ }
+
+ if (delerror) {
+ return DB_CORRUPT;
+ }
+ return DB_LOAD_OK;
+}
+
DBErrors CWalletDB::ZapWalletTx(CWallet* pwallet, vector<CWalletTx>& vWtx)
{
// build list of wallet TXs
@@ -843,19 +886,19 @@ void ThreadFlushWalletDB(const string& strFile)
if (nRefCount == 0)
{
boost::this_thread::interruption_point();
- map<string, int>::iterator mi = bitdb.mapFileUseCount.find(strFile);
- if (mi != bitdb.mapFileUseCount.end())
+ map<string, int>::iterator _mi = bitdb.mapFileUseCount.find(strFile);
+ if (_mi != bitdb.mapFileUseCount.end())
{
- LogPrint("db", "Flushing wallet.dat\n");
+ LogPrint("db", "Flushing %s\n", strFile);
nLastFlushed = nWalletDBUpdated;
int64_t nStart = GetTimeMillis();
- // Flush wallet.dat so it's self contained
+ // Flush wallet file so it's self contained
bitdb.CloseDb(strFile);
bitdb.CheckpointLSN(strFile);
- bitdb.mapFileUseCount.erase(mi++);
- LogPrint("db", "Flushed wallet.dat %dms\n", GetTimeMillis() - nStart);
+ bitdb.mapFileUseCount.erase(_mi++);
+ LogPrint("db", "Flushed %s %dms\n", strFile, GetTimeMillis() - nStart);
}
}
}
@@ -863,56 +906,16 @@ void ThreadFlushWalletDB(const string& strFile)
}
}
-bool BackupWallet(const CWallet& wallet, const string& strDest)
-{
- if (!wallet.fFileBacked)
- return false;
- while (true)
- {
- {
- LOCK(bitdb.cs_db);
- if (!bitdb.mapFileUseCount.count(wallet.strWalletFile) || bitdb.mapFileUseCount[wallet.strWalletFile] == 0)
- {
- // Flush log data to the dat file
- bitdb.CloseDb(wallet.strWalletFile);
- bitdb.CheckpointLSN(wallet.strWalletFile);
- bitdb.mapFileUseCount.erase(wallet.strWalletFile);
-
- // Copy wallet.dat
- boost::filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;
- boost::filesystem::path pathDest(strDest);
- if (boost::filesystem::is_directory(pathDest))
- pathDest /= wallet.strWalletFile;
-
- try {
-#if BOOST_VERSION >= 104000
- boost::filesystem::copy_file(pathSrc, pathDest, boost::filesystem::copy_option::overwrite_if_exists);
-#else
- boost::filesystem::copy_file(pathSrc, pathDest);
-#endif
- LogPrintf("copied wallet.dat to %s\n", pathDest.string());
- return true;
- } catch (const boost::filesystem::filesystem_error& e) {
- LogPrintf("error copying wallet.dat to %s - %s\n", pathDest.string(), e.what());
- return false;
- }
- }
- }
- MilliSleep(100);
- }
- return false;
-}
-
//
-// Try to (very carefully!) recover wallet.dat if there is a problem.
+// Try to (very carefully!) recover wallet file if there is a problem.
//
bool CWalletDB::Recover(CDBEnv& dbenv, const std::string& filename, bool fOnlyKeys)
{
// Recovery procedure:
- // move wallet.dat to wallet.timestamp.bak
+ // move wallet file to wallet.timestamp.bak
// Call Salvage with fAggressive=true to
// get as much data as possible.
- // Rewrite salvaged data to wallet.dat
+ // Rewrite salvaged data to fresh wallet file
// Set -rescan so any missing transactions will be
// found.
int64_t now = GetTime();
@@ -937,7 +940,7 @@ bool CWalletDB::Recover(CDBEnv& dbenv, const std::string& filename, bool fOnlyKe
}
LogPrintf("Salvage(aggressive) found %u records\n", salvagedData.size());
- boost::scoped_ptr<Db> pdbCopy(new Db(dbenv.dbenv, 0));
+ std::unique_ptr<Db> pdbCopy(new Db(dbenv.dbenv, 0));
int ret = pdbCopy->open(NULL, // Txn pointer
filename.c_str(), // Filename
"main", // Logical db name
@@ -960,9 +963,14 @@ bool CWalletDB::Recover(CDBEnv& dbenv, const std::string& filename, bool fOnlyKe
CDataStream ssKey(row.first, SER_DISK, CLIENT_VERSION);
CDataStream ssValue(row.second, SER_DISK, CLIENT_VERSION);
string strType, strErr;
- bool fReadOK = ReadKeyValue(&dummyWallet, ssKey, ssValue,
+ bool fReadOK;
+ {
+ // Required in LoadKeyMetadata():
+ LOCK(dummyWallet.cs_wallet);
+ fReadOK = ReadKeyValue(&dummyWallet, ssKey, ssValue,
wss, strType, strErr);
- if (!IsKeyType(strType))
+ }
+ if (!IsKeyType(strType) && strType != "hdchain")
continue;
if (!fReadOK)
{
@@ -998,3 +1006,10 @@ bool CWalletDB::EraseDestData(const std::string &address, const std::string &key
nWalletDBUpdated++;
return Erase(std::make_pair(std::string("destdata"), std::make_pair(address, key)));
}
+
+
+bool CWalletDB::WriteHDChain(const CHDChain& chain)
+{
+ nWalletDBUpdated++;
+ return Write(std::string("hdchain"), chain);
+}
diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h
index 77f7958814..9c9d4922a4 100644
--- a/src/wallet/walletdb.h
+++ b/src/wallet/walletdb.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2013 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.
@@ -7,6 +7,7 @@
#define BITCOIN_WALLET_WALLETDB_H
#include "amount.h"
+#include "primitives/transaction.h"
#include "wallet/db.h"
#include "key.h"
@@ -40,12 +41,44 @@ enum DBErrors
DB_NEED_REWRITE
};
+/* simple HD chain data model */
+class CHDChain
+{
+public:
+ uint32_t nExternalChainCounter;
+ CKeyID masterKeyID; //!< master key hash160
+
+ static const int CURRENT_VERSION = 1;
+ int nVersion;
+
+ CHDChain() { SetNull(); }
+ ADD_SERIALIZE_METHODS;
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
+ {
+ READWRITE(this->nVersion);
+ READWRITE(nExternalChainCounter);
+ READWRITE(masterKeyID);
+ }
+
+ void SetNull()
+ {
+ nVersion = CHDChain::CURRENT_VERSION;
+ nExternalChainCounter = 0;
+ masterKeyID.SetNull();
+ }
+};
+
class CKeyMetadata
{
public:
- static const int CURRENT_VERSION=1;
+ static const int VERSION_BASIC=1;
+ static const int VERSION_WITH_HDDATA=10;
+ static const int CURRENT_VERSION=VERSION_WITH_HDDATA;
int nVersion;
int64_t nCreateTime; // 0 means unknown
+ std::string hdKeypath; //optional HD/bip32 keypath
+ CKeyID hdMasterKeyID; //id of the HD masterkey used to derive this key
CKeyMetadata()
{
@@ -53,7 +86,7 @@ public:
}
CKeyMetadata(int64_t nCreateTime_)
{
- nVersion = CKeyMetadata::CURRENT_VERSION;
+ SetNull();
nCreateTime = nCreateTime_;
}
@@ -62,18 +95,24 @@ public:
template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
READWRITE(this->nVersion);
- nVersion = this->nVersion;
READWRITE(nCreateTime);
+ if (this->nVersion >= VERSION_WITH_HDDATA)
+ {
+ READWRITE(hdKeypath);
+ READWRITE(hdMasterKeyID);
+ }
}
void SetNull()
{
nVersion = CKeyMetadata::CURRENT_VERSION;
nCreateTime = 0;
+ hdKeypath.clear();
+ hdMasterKeyID.SetNull();
}
};
-/** Access to the wallet database (wallet.dat) */
+/** Access to the wallet database */
class CWalletDB : public CDB
{
public:
@@ -87,7 +126,7 @@ public:
bool WritePurpose(const std::string& strAddress, const std::string& purpose);
bool ErasePurpose(const std::string& strAddress);
- bool WriteTx(uint256 hash, const CWalletTx& wtx);
+ bool WriteTx(const CWalletTx& wtx);
bool EraseTx(uint256 hash);
bool WriteKey(const CPubKey& vchPubKey, const CPrivKey& vchPrivKey, const CKeyMetadata &keyMeta);
@@ -130,9 +169,13 @@ public:
DBErrors LoadWallet(CWallet* pwallet);
DBErrors FindWalletTx(CWallet* pwallet, std::vector<uint256>& vTxHash, std::vector<CWalletTx>& vWtx);
DBErrors ZapWalletTx(CWallet* pwallet, std::vector<CWalletTx>& vWtx);
+ DBErrors ZapSelectTx(CWallet* pwallet, std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut);
static bool Recover(CDBEnv& dbenv, const std::string& filename, bool fOnlyKeys);
static bool Recover(CDBEnv& dbenv, const std::string& filename);
+ //! write the hdchain model (external chain child index counter)
+ bool WriteHDChain(const CHDChain& chain);
+
private:
CWalletDB(const CWalletDB&);
void operator=(const CWalletDB&);
@@ -140,7 +183,6 @@ private:
bool WriteAccountingEntry(const uint64_t nAccEntryNum, const CAccountingEntry& acentry);
};
-bool BackupWallet(const CWallet& wallet, const std::string& strDest);
void ThreadFlushWalletDB(const std::string& strFile);
#endif // BITCOIN_WALLET_WALLETDB_H
diff --git a/src/zmq/zmqconfig.h b/src/zmq/zmqconfig.h
index 6057f5d1a0..610d7fbda4 100644
--- a/src/zmq/zmqconfig.h
+++ b/src/zmq/zmqconfig.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2015 The Bitcoin Core developers
+// 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.
diff --git a/src/zmq/zmqnotificationinterface.cpp b/src/zmq/zmqnotificationinterface.cpp
index be2aec7d15..376e7dec59 100644
--- a/src/zmq/zmqnotificationinterface.cpp
+++ b/src/zmq/zmqnotificationinterface.cpp
@@ -100,7 +100,6 @@ bool CZMQNotificationInterface::Initialize()
if (i!=notifiers.end())
{
- Shutdown();
return false;
}
@@ -142,7 +141,7 @@ void CZMQNotificationInterface::UpdatedBlockTip(const CBlockIndex *pindex)
}
}
-void CZMQNotificationInterface::SyncTransaction(const CTransaction &tx, const CBlock *pblock)
+void CZMQNotificationInterface::SyncTransaction(const CTransaction& tx, const CBlockIndex* pindex, int posInBlock)
{
for (std::list<CZMQAbstractNotifier*>::iterator i = notifiers.begin(); i!=notifiers.end(); )
{
diff --git a/src/zmq/zmqnotificationinterface.h b/src/zmq/zmqnotificationinterface.h
index 3ccfaf341d..a853447267 100644
--- a/src/zmq/zmqnotificationinterface.h
+++ b/src/zmq/zmqnotificationinterface.h
@@ -24,7 +24,7 @@ protected:
void Shutdown();
// CValidationInterface
- void SyncTransaction(const CTransaction &tx, const CBlock *pblock);
+ void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock);
void UpdatedBlockTip(const CBlockIndex *pindex);
private:
diff --git a/src/zmq/zmqpublishnotifier.cpp b/src/zmq/zmqpublishnotifier.cpp
index ddc8fe93e9..b6c907980f 100644
--- a/src/zmq/zmqpublishnotifier.cpp
+++ b/src/zmq/zmqpublishnotifier.cpp
@@ -9,6 +9,11 @@
static std::multimap<std::string, CZMQAbstractPublishNotifier*> mapPublishNotifiers;
+static const char *MSG_HASHBLOCK = "hashblock";
+static const char *MSG_HASHTX = "hashtx";
+static const char *MSG_RAWBLOCK = "rawblock";
+static const char *MSG_RAWTX = "rawtx";
+
// Internal function to send multipart message
static int zmq_send_multipart(void *sock, const void* data, size_t size, ...)
{
@@ -69,6 +74,7 @@ bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
if (rc!=0)
{
zmqError("Failed to bind address");
+ zmq_close(psocket);
return false;
}
@@ -117,6 +123,23 @@ void CZMQAbstractPublishNotifier::Shutdown()
psocket = 0;
}
+bool CZMQAbstractPublishNotifier::SendMessage(const char *command, const void* data, size_t size)
+{
+ assert(psocket);
+
+ /* send three parts, command & data & a LE 4byte sequence number */
+ unsigned char msgseq[sizeof(uint32_t)];
+ WriteLE32(&msgseq[0], nSequence);
+ int rc = zmq_send_multipart(psocket, command, strlen(command), data, size, msgseq, (size_t)sizeof(uint32_t), (void*)0);
+ if (rc == -1)
+ return false;
+
+ /* increment memory only sequence number after sending */
+ nSequence++;
+
+ return true;
+}
+
bool CZMQPublishHashBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
{
uint256 hash = pindex->GetBlockHash();
@@ -124,8 +147,7 @@ bool CZMQPublishHashBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
char data[32];
for (unsigned int i = 0; i < 32; i++)
data[31 - i] = hash.begin()[i];
- int rc = zmq_send_multipart(psocket, "hashblock", 9, data, 32, 0);
- return rc == 0;
+ return SendMessage(MSG_HASHBLOCK, data, 32);
}
bool CZMQPublishHashTransactionNotifier::NotifyTransaction(const CTransaction &transaction)
@@ -135,8 +157,7 @@ bool CZMQPublishHashTransactionNotifier::NotifyTransaction(const CTransaction &t
char data[32];
for (unsigned int i = 0; i < 32; i++)
data[31 - i] = hash.begin()[i];
- int rc = zmq_send_multipart(psocket, "hashtx", 6, data, 32, 0);
- return rc == 0;
+ return SendMessage(MSG_HASHTX, data, 32);
}
bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
@@ -157,8 +178,7 @@ bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
ss << block;
}
- int rc = zmq_send_multipart(psocket, "rawblock", 8, &(*ss.begin()), ss.size(), 0);
- return rc == 0;
+ return SendMessage(MSG_RAWBLOCK, &(*ss.begin()), ss.size());
}
bool CZMQPublishRawTransactionNotifier::NotifyTransaction(const CTransaction &transaction)
@@ -167,6 +187,5 @@ bool CZMQPublishRawTransactionNotifier::NotifyTransaction(const CTransaction &tr
LogPrint("zmq", "zmq: Publish rawtx %s\n", hash.GetHex());
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
ss << transaction;
- int rc = zmq_send_multipart(psocket, "rawtx", 5, &(*ss.begin()), ss.size(), 0);
- return rc == 0;
+ return SendMessage(MSG_RAWTX, &(*ss.begin()), ss.size());
}
diff --git a/src/zmq/zmqpublishnotifier.h b/src/zmq/zmqpublishnotifier.h
index 44d5cbea67..751ded3957 100644
--- a/src/zmq/zmqpublishnotifier.h
+++ b/src/zmq/zmqpublishnotifier.h
@@ -11,7 +11,19 @@ class CBlockIndex;
class CZMQAbstractPublishNotifier : public CZMQAbstractNotifier
{
+private:
+ uint32_t nSequence; //!< upcounting per message sequence number
+
public:
+
+ /* send zmq multipart message
+ parts:
+ * command
+ * data
+ * message sequence number
+ */
+ bool SendMessage(const char *command, const void* data, size_t size);
+
bool Initialize(void *pcontext);
void Shutdown();
};